diff --git a/AndUE4Dumper/source/src/Core/Dumper.cpp b/AndUE4Dumper/source/src/Core/Dumper.cpp index 5bf4949..fc9d0cc 100644 --- a/AndUE4Dumper/source/src/Core/Dumper.cpp +++ b/AndUE4Dumper/source/src/Core/Dumper.cpp @@ -162,7 +162,7 @@ namespace Dumper LOGI("Dumping, please wait..."); - std::string objfile_path = dir + "/objects_dump.txt"; + std::string objfile_path = dir + "/ObjectsDump.txt"; File objfile(objfile_path, "w"); if (!objfile.ok()) { @@ -173,7 +173,7 @@ namespace Dumper std::function objdump_callback = nullptr; objdump_callback = [&objfile](UE_UObject object) { - fmt::print(objfile, "{}\n", object.GetName()); + fmt::print(objfile, "[{:010}]: {}\n", object.GetIndex(), object.GetFullName()); }; std::unordered_map> packages; @@ -224,13 +224,13 @@ namespace Dumper for (const auto &func : cls.Functions) { // UObject::ProcessInternal for blueprint functions - if (!processInternal_once && (func.EFlags & FUNC_BlueprintEvent)) + if (!processInternal_once && (func.EFlags & FUNC_BlueprintEvent) && func.Func) { JsonGen::idaFunctions.push_back({"UObject", "ProcessInternal", func.Func - Profile::BaseAddress}); processInternal_once = true; } - if (func.EFlags & FUNC_Native) + if ((func.EFlags & FUNC_Native) && func.Func) { std::string execFuncName = "exec"; execFuncName += func.Name; @@ -246,7 +246,7 @@ namespace Dumper for (const auto &func : st.Functions) { - if (func.EFlags & FUNC_Native) + if ((func.EFlags & FUNC_Native) && func.Func) { std::string execFuncName = "exec"; execFuncName += func.Name; diff --git a/AndUE4Dumper/source/src/Core/GameProfiles/Games/DBD.h b/AndUE4Dumper/source/src/Core/GameProfiles/Games/DBD.h index b0c9291..032dedd 100644 --- a/AndUE4Dumper/source/src/Core/GameProfiles/Games/DBD.h +++ b/AndUE4Dumper/source/src/Core/GameProfiles/Games/DBD.h @@ -61,8 +61,6 @@ class DBDProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; return (page_off + adrp_pc_rel + add_imm12); } @@ -96,8 +94,6 @@ class DBDProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; return (page_off + adrp_pc_rel + add_imm12); } diff --git a/AndUE4Dumper/source/src/Core/GameProfiles/Games/Farlight.h b/AndUE4Dumper/source/src/Core/GameProfiles/Games/Farlight.h index 26996bd..abeafbb 100644 --- a/AndUE4Dumper/source/src/Core/GameProfiles/Games/Farlight.h +++ b/AndUE4Dumper/source/src/Core/GameProfiles/Games/Farlight.h @@ -89,8 +89,6 @@ class FarlightProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; return (page_off + adrp_pc_rel + add_imm12); } @@ -129,7 +127,7 @@ class FarlightProfile : public IGameProfile else if (e_machine == EM_AARCH64) { PATTERN_MAP_TYPE map_type = isEmulator() ? PATTERN_MAP_TYPE::ANY_R : PATTERN_MAP_TYPE::ANY_X; - std::string ida_pattern = "C8 00 00 37 ? ? ? ? ? ? 28 91 ? ? FF 97"; + std::string ida_pattern = "C8 00 00 37 ? ? ? ? ? ? ? 91 ? ? FF 97"; int step = 4; uintptr_t insn_address = findIdaPattern(map_type, ida_pattern, step); @@ -155,8 +153,8 @@ class FarlightProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 != 0) - return (page_off + adrp_pc_rel + add_imm12); + + return (page_off + adrp_pc_rel + add_imm12); } return 0; diff --git a/AndUE4Dumper/source/src/Core/GameProfiles/Games/PES.h b/AndUE4Dumper/source/src/Core/GameProfiles/Games/PES.h index 5bb0f06..e1d81db 100644 --- a/AndUE4Dumper/source/src/Core/GameProfiles/Games/PES.h +++ b/AndUE4Dumper/source/src/Core/GameProfiles/Games/PES.h @@ -61,8 +61,6 @@ class PESProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; return (page_off + adrp_pc_rel + add_imm12); } @@ -96,8 +94,6 @@ class PESProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; return (page_off + adrp_pc_rel + add_imm12); } diff --git a/AndUE4Dumper/source/src/Core/GameProfiles/Games/PUBGM.h b/AndUE4Dumper/source/src/Core/GameProfiles/Games/PUBGM.h index ddcb242..c43672c 100644 --- a/AndUE4Dumper/source/src/Core/GameProfiles/Games/PUBGM.h +++ b/AndUE4Dumper/source/src/Core/GameProfiles/Games/PUBGM.h @@ -29,7 +29,7 @@ class PUBGMProfile : public IGameProfile "com.rekoo.pubgm", "com.pubg.imobile", "com.pubg.krmobile", - "com.vng.pubgmobile", + "com.vng.pubgmobile", }; // chinese version doesn't have GNames encrypted but FNameEntry* is encrypted @@ -104,8 +104,6 @@ class PUBGMProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; return (page_off + adrp_pc_rel + add_imm12); } @@ -171,10 +169,8 @@ class PUBGMProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; - if (!KittyArm64::decode_ldrstr_uimm(ldrb_insn, &ldrb_imm12) || ldrb_imm12 == 0) + if (!KittyArm64::decode_ldrstr_uimm(ldrb_insn, &ldrb_imm12)) return 0; enc_names = (page_off + adrp_pc_rel + add_imm12 + ldrb_imm12 - 4); diff --git a/AndUE4Dumper/source/src/Core/GameProfiles/Games/Torchlight.h b/AndUE4Dumper/source/src/Core/GameProfiles/Games/Torchlight.h index 6fcfa08..9f340a3 100644 --- a/AndUE4Dumper/source/src/Core/GameProfiles/Games/Torchlight.h +++ b/AndUE4Dumper/source/src/Core/GameProfiles/Games/Torchlight.h @@ -61,8 +61,6 @@ class TorchlightProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; return (page_off + adrp_pc_rel + add_imm12); } @@ -70,7 +68,7 @@ class TorchlightProfile : public IGameProfile uintptr_t GetNamesPtr() const override { PATTERN_MAP_TYPE map_type = isEmulator() ? PATTERN_MAP_TYPE::ANY_R : PATTERN_MAP_TYPE::ANY_X; - std::string ida_pattern = "C8 00 00 37 ? ? ? ? ? ? 28 91 ? ? FF 97"; + std::string ida_pattern = "C8 00 00 37 ? ? ? ? ? ? ? 91 ? ? FF 97"; int step = 4; uintptr_t insn_address = findIdaPattern(map_type, ida_pattern, step); @@ -96,8 +94,6 @@ class TorchlightProfile : public IGameProfile return 0; add_imm12 = KittyArm64::decode_addsub_imm(add_insn); - if (add_imm12 == 0) - return 0; return (page_off + adrp_pc_rel + add_imm12); } diff --git a/AndUE4Dumper/source/src/Core/wrappers.cpp b/AndUE4Dumper/source/src/Core/wrappers.cpp index 0b4bbc0..07d1b06 100644 --- a/AndUE4Dumper/source/src/Core/wrappers.cpp +++ b/AndUE4Dumper/source/src/Core/wrappers.cpp @@ -1736,14 +1736,14 @@ void UE_UPackage::SaveStruct(std::vector &arr, FILE *file) { for (auto &s : arr) { - fmt::print(file, "// Object Name: {}\n// Size: {:#04x} // Inherited bytes: {:#04x}\n{} {{", s.FullName, s.Size, s.Inherited, s.CppName); + fmt::print(file, "// Object: {}\n// Inherited Bytes: {:#0x} | Struct Size: {:#0x}\n{} {{", s.FullName, s.Inherited, s.Size, s.CppName); if (s.Members.size()) { fmt::print(file, "\n\t// Fields"); for (auto &m : s.Members) { - fmt::print(file, "\n\t{} {}; // Offset: {:#04x} // Size: {:#04x}", m.Type, m.Name, m.Offset, m.Size); + fmt::print(file, "\n\t{} {}; // Offset: {:#0x} | Size: {:#0x}", m.Type, m.Name, m.Offset, m.Size); } } if (s.Functions.size()) @@ -1751,7 +1751,8 @@ void UE_UPackage::SaveStruct(std::vector &arr, FILE *file) fmt::print(file, "{}\n\t// Functions", s.Members.size() ? "\n" : ""); for (auto &f : s.Functions) { - fmt::print(file, "\n\n\t// Object Name: {}\n\t// Flags: [{}]\n\t// Offset: {:#08x} // Return & Params: [ Num({}) Size({:#0x}) ]\n\t{}({});", f.FullName, f.Flags, f.Func - Profile::BaseAddress, f.NumParams, f.ParamSize, f.CppName, f.Params); + void *funcOffset = f.Func ? (void*)(f.Func - Profile::BaseAddress) : nullptr; + fmt::print(file, "\n\n\t// Object: {}\n\t// Flags: [{}]\n\t// Offset: {}\n\t// Return & Params: [ Num({}) Size({:#0x}) ]\n\t{}({});", f.FullName, f.Flags, funcOffset, f.NumParams, f.ParamSize, f.CppName, f.Params); } } fmt::print(file, "\n}};\n\n"); @@ -1762,7 +1763,7 @@ void UE_UPackage::SaveEnum(std::vector &arr, FILE *file) { for (auto &e : arr) { - fmt::print(file, "// Object Name: {}\n{} {{", e.FullName, e.CppName); + fmt::print(file, "// Object: {}\n{} {{", e.FullName, e.CppName); size_t lastIdx = e.Members.size() - 1; for (size_t i = 0; i < lastIdx; i++) @@ -1809,10 +1810,10 @@ bool UE_UPackage::Save(const std::string &dir, const std::string &headers_dir) // make safe to use as a file name std::string packageName = ioutils::replace_specials(GetObject().GetName(), '_'); - File fulldump_file(dir + "/FullDump.hpp", "a"); + File fulldump_file(dir + "/AIOHeader.hpp", "a"); if (fulldump_file.ok()) { - fmt::print(fulldump_file, "// {} Dumping: [ Enums: {} | Structs: {} | Classes: {} ]\n\n", packageName, Enums.size(), Structures.size(), Classes.size()); + fmt::print(fulldump_file, "// Package {}: [ Enums: {} | Structs: {} | Classes: {} ]\n\n", packageName, Enums.size(), Structures.size(), Classes.size()); } if (Enums.size()) @@ -1884,11 +1885,6 @@ bool UE_UPackage::Save(const std::string &dir, const std::string &headers_dir) } } - if (fulldump_file.ok()) - { - fmt::print(fulldump_file, "\n\n"); - } - return true; } diff --git a/AndUE4Dumper/source/src/executable.cpp b/AndUE4Dumper/source/src/executable.cpp index b6b515e..3069f9b 100644 --- a/AndUE4Dumper/source/src/executable.cpp +++ b/AndUE4Dumper/source/src/executable.cpp @@ -150,10 +150,11 @@ int main(int argc, char **args) if (sGamePackage == pkg) { dumpStatus = Dumper::Dump(sDumpGameDir, sDumpHeadersDir, bDumpLib, it); - break; + goto done; } } } +done: if (dumpStatus == Dumper::UE_DS_NONE) { diff --git a/AndUE4Dumper/source/src/library.cpp b/AndUE4Dumper/source/src/library.cpp index d7c8ae9..d75da1a 100644 --- a/AndUE4Dumper/source/src/library.cpp +++ b/AndUE4Dumper/source/src/library.cpp @@ -97,10 +97,11 @@ void dump_thread(bool bDumpLib) if (sGamePackage == pkg) { dumpStatus = Dumper::Dump(sDumpDir, sDumpHeadersDir, bDumpLib, it); - break; + goto done; } } } +done: if (dumpStatus == Dumper::UE_DS_NONE) {