public async Task <string> GetFullName() { if (!FullName.Empty()) { return(FullName); } var cClass = await GetClass(); if (!cClass.IsValid()) { return("(null)"); } string temp = string.Empty; for (UEObject outer = await GetOuter(); outer.IsValid(); outer = await outer.GetOuter()) { temp = temp.Insert(0, $"{await outer.GetName()}."); } FullName = $"{await cClass.GetName()} {temp}{await GetName()}"; return(FullName); }
private static bool ReadUObject(IntPtr uObjectAddress, out UEObject retUObj) { var tmp = new UObject(); retUObj = new UEObject(tmp); return(Utils.IsValidRemoteAddress(uObjectAddress) && tmp.ReadData(uObjectAddress).Result); }
public async Task <string> GetInstanceClassName() { if (!IsValid()) { return(string.Empty); } UEObject obj = ObjectsStore.GetByAddress(GetAddress(), out bool found); return(found ? await(await obj.GetClass()).GetNameCpp() : string.Empty); }
public UEObject this[String key] { get { var fieldAddr = Engine.Instance.GetFieldAddr(ClassAddr, ClassAddr, key); var fieldType = Engine.Instance.GetFieldType(fieldAddr); var offset = (UInt32)Engine.Instance.GetFieldOffset(fieldAddr); UEObject obj; if (fieldType == "ObjectProperty" || fieldType == "ScriptStruct") { obj = new UEObject(Engine.Memory.ReadProcessMemory <UInt64>(Address + offset)) { FieldOffset = offset } } ; else if (fieldType == "ArrayProperty") { obj = new UEObject(Address + offset); obj._classAddr = Engine.Memory.ReadProcessMemory <UInt64>(fieldAddr + 0x10); } else if (fieldType.Contains("Bool")) { obj = new UEObject(Address + offset); obj._classAddr = Engine.Memory.ReadProcessMemory <UInt64>(fieldAddr + 0x10); var boolMask = Engine.Memory.ReadProcessMemory <UInt64>(fieldAddr + 0x70); boolMask = (boolMask >> 16) & 0xff; var fullVal = Engine.Memory.ReadProcessMemory <Byte>(Address + offset); obj._value = ((fullVal & boolMask) == boolMask) ? 1u : 0; } else if (fieldType.Contains("Function")) { obj = new UEObject(fieldAddr); obj.BaseObjAddr = Address; } else { obj = new UEObject(Address + offset); obj._classAddr = Engine.Memory.ReadProcessMemory <UInt64>(fieldAddr + 0x70); } if (obj.Address == 0) { return(null); //var classInfo = Engine.Instance.DumpClass(ClassAddr); //throw new Exception("bad addr"); } return(obj); } }
public async Task <UEObject> GetPackageObject() { if (Package != null) { return(Package); } // Package Is The Last Outer for (UEObject outer = await GetOuter(); outer.IsValid(); outer = await outer.GetOuter()) { Package = outer; } return(Package ?? (Package = await ObjectsStore.GetByAddress(Object.ObjAddress))); }
public void DumpActors() { var sb = new System.Text.StringBuilder(); var World = new UEObject(Engine.GWorld); var Levels = World["Levels"]; for (var levelIndex = 0u; levelIndex < Levels.Num; levelIndex++) { var Level = Levels[levelIndex]; var Actors = new Engine.UEObject(Level.Address + 0xA8); for (var i = 0u; i < Actors.Num; i++) { var Actor = Actors[i]; var debug = GetFullName(Actor.Address) + " || " + Actor.ClassName + " || " + DumpClass(Actor.ClassAddr); sb.AppendLine(i + " : " + debug); } } System.IO.File.WriteAllText("actors.txt", sb.ToString()); }
public String DumpClass(UInt64 classAddr) { var sb = new StringBuilder(); var name = GetFullName(classAddr); sb.Append(classAddr.ToString("X") + " : " + name); var pcAddr = classAddr; var c = 0; while ((pcAddr = Memory.ReadProcessMemory <UInt64>(pcAddr + 0x40)) > 0 && c++ < 20) { var super = GetFullName(pcAddr); sb.Append(" : " + super); } sb.AppendLine(); pcAddr = classAddr; //while ((pcAddr = Memory.ReadProcessMemory<UInt64>(pcAddr + 0x40)) > 0) while (true) { var field = pcAddr + 0x40; while (true) { var nextField = Memory.ReadProcessMemory <UInt64>(field + 0x28); if (nextField == field) { break; } field = nextField; if (field == 0) { break; } var fieldName = GetFullName(field); var f = Memory.ReadProcessMemory <UInt64>(field + 0x70); var fType = GetName(Memory.ReadProcessMemory <Int32>(f + 0x18)); var fName = GetName(Memory.ReadProcessMemory <Int32>(field + 0x18)); var offset = Memory.ReadProcessMemory <Int32>(field + 0x44); if (fType == "None" && String.IsNullOrEmpty(fName)) { break; } var fieldObj = new UEObject(field); if (fieldObj.ClassName == "Class CoreUObject.Function") { sb.AppendLine(" " + fType + " " + fName + "(" + fieldObj.ClassName + ") : 0x" + offset.ToString("X")); var funcParams = field + 0x20u; while ((funcParams = Memory.ReadProcessMemory <UInt64>(funcParams + 0x28u)) > 0) { sb.AppendLine(" " + GetFullName(funcParams)); } } else { sb.AppendLine(" " + fType + " " + fName + "(" + fieldObj.ClassName + ") : 0x" + offset.ToString("X")); } } pcAddr = Memory.ReadProcessMemory <UInt64>(pcAddr + 0x40); if (pcAddr == 0) { break; } } return(sb.ToString()); }
protected bool Equals(UEObject other) { return(Equals(Object, other.Object)); }