Skip to content

Commit 6f5e222

Browse files
committed
Update v0.10
1 parent 97ec3a6 commit 6f5e222

13 files changed

+346
-176
lines changed

.DS_Store

0 Bytes
Binary file not shown.

README.md

+30-17
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,47 @@
11
## UE4Dumper(Unreal Engine 4 Dumper)
2-
Dump Lib libUE4.so from Memory of Game Process and Generate Structure SDK of Supported Game in Android. You can Find Latest Dumped SDK from [HERE](https://github.com/kp7742/UE4Dumper/tree/master/SDKs/)
2+
Unreal Engine 4 Dumper for Android Devices, Dump Lib libUE4.so from Memory of Game Process and Generate Structure SDK of Supported Game in Android. You can Find Latest Dumped SDK from [HERE](https://github.com/kp7742/UE4Dumper/tree/master/SDKs/)
33

44
## Changelog
55
- v0.1: First Release
66
- v0.2: Experimental 64bit Support Added
7-
- v0.3: Fix Object Iteration Issue during Dumping SDK, Added Support to Resolve Arrays, Sets and Maps Structure
8-
- v0.4: 1) Expanded 64bit Support,
9-
2) Fixed 64bit Library Rebuilding Not Working
10-
3) Added New Elf Dump Fix for 64bit Library
11-
4) Added Option to Dump SDK with GWorld
12-
5) Updated Usage Text.
7+
- v0.3:
8+
- 1) Fix Object Iteration Issue during Dumping SDK
9+
- 2) Added Support to Resolve Arrays, Sets and Maps Structure
10+
- v0.4:
11+
- 1) Expanded 64bit Support,
12+
- 2) Fixed 64bit Library Rebuilding Not Working
13+
- 3) Added New Elf Dump Fix for 64bit Library
14+
- 4) Added Option to Dump SDK with GWorld
15+
- 5) Updated Usage Text
1316
- v0.5: Added Support to Resolve Functions
14-
- v0.6: 1) Added Support for UE 4.23+ Games for Strings and Objects(Use new Option: --newue)
15-
2) Added 64bit Offsets to Fix 64bit Support
16-
3) Updated SDK Generation Method for Faster Dumping
17-
4) Short Options has been remove due to conflict with new options
18-
- v0.7: Fixed Object Dumping issue for PUBG CN(As of Now Tested on GP v1.8.10.8640).
17+
- v0.6:
18+
- 1) Added Support for UE 4.23+ Games for Strings and Objects(Use new Option: --newue)
19+
- 2) Added 64bit Offsets to Fix 64bit Support
20+
- 3) Updated SDK Generation Method for Faster Dumping
21+
- 4) Short Options has been remove due to conflict with new options
22+
- v0.7: Fixed Object Dumping issue for PUBG CN(Tested on GP v1.8.10)
1923
- v0.8: Fixed 64bit Support for Latest PUBG Version
2024
- v0.9: Fixed Dumping issue with 64bit PUBG
25+
- v0.10:
26+
- 1) Added Option to View Actors of Main Level(Use new Option: --actors)
27+
- 2) Support for PUBG CN(GP) Fixed(Tested on GP v1.9.10)
28+
- 3) Fixed Some Offsets Issues due to Modified UE4 Versions
29+
- 4) Offsets System Updated to Work with Other games, other then PUBG
2130

2231
## Features
2332
- No need of Ptrace
2433
- Bypass Anti Debugging
2534
- Dumping of Lib from Memory of Game
2635
- Fix and Regenerate So(Elf) File from Dump
2736
- Dumping of Game Structure SDK file(Need to Find Pointers Manually)
28-
- Support Fast Dumping(May Miss some data)
29-
- Support SDK Dumping for UE4 Based Games
37+
- Support Fast Dumping(Might Miss some data)
38+
- Support SDK Dumping for UE4 Based Android Games
3039
- Tested on 32bit and 64bit PUBG Mobile Series
3140

3241
## Note
3342
- Use 32bit and 64bit Version on Respected Arch of Game.
43+
- Some Games with Modified UE4 Might not Dump Correctly.
3444
- Recommend to use in Training Mode for PUBG Mobile.
35-
- Fortnite using modified engine so SDK Dumping is Not Possible right now.
3645
- If it stuck during Generating SDK, Then Simple Stop it, Check Dump file and If needed then Try again.
3746

3847
## How to use
@@ -45,7 +54,7 @@ Dump Lib libUE4.so from Memory of Game Process and Generate Structure SDK of Sup
4554
```
4655
./ue4dumper -h
4756
48-
UE4Dumper v0.8 <==> Made By KMODs(kp7742)
57+
UE4Dumper v0.10 <==> Made By KMODs(kp7742)
4958
Usage: ue4dumper <option(s)>
5059
Dump Lib libUE4.so from Memory of Game Process and Generate structure SDK for UE4 Engine
5160
Tested on PUBG Mobile Series
@@ -69,8 +78,12 @@ Dump Lib libUE4.so from Memory of Game Process and Generate Structure SDK of Sup
6978
--lib Dump libUE4.so from Memory
7079
--raw(Optional) Output Raw Lib and Not Rebuild It
7180
--fast(Optional) Enable Fast Dumping(May Miss Some Bytes in Dump)
81+
--Show ActorList With GWorld Args--------------------------------------------------------
82+
--actors Show Actors with GWorld
83+
--gname <address> GNames Pointer Address
84+
--gworld <address> GWorld Pointer Address
7285
--Other Args-----------------------------------------------------------------------------
73-
--newue(Optional) Run in UE 4.23+ Mode
86+
--newue(Optional) Run in UE 4.23+ Mode
7487
--package <packageName> Package Name of App(Default: com.tencent.ig)
7588
--output <outputPath> File Output path(Default: /sdcard)
7689
--help Display this information

jni/.DS_Store

6 KB
Binary file not shown.

jni/FNames.h

+14-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using namespace std;
55

6-
bool isUE423 = false;
76
uint32 GNameCount = 170000;
87

98
string getUEString(kaddr address) {
@@ -20,7 +19,7 @@ string GetFNameFromID(uint32 index) {
2019
uint32 chunkOffset = index >> 16;
2120
uint16 nameOffset = index;
2221

23-
kaddr fNamePool = getRealOffset(Offsets::GNames) + 0x30;
22+
kaddr fNamePool = getRealOffset(Offsets::GNames) + Offsets::FNameToFNamePool;
2423

2524
kaddr namePoolChunk = getPtr(fNamePool + ((chunkOffset + 2) * 8));
2625
kaddr entryOffset = namePoolChunk + (2 * nameOffset);
@@ -33,12 +32,21 @@ string GetFNameFromID(uint32 index) {
3332

3433
return uestring;
3534
} else {
36-
kaddr TNameEntryArray = getPtr(getRealOffset(Offsets::GNames));
35+
if (deRefGNames) {
36+
kaddr TNameEntryArray = getPtr(getRealOffset(Offsets::GNames));
3737

38-
kaddr FNameEntryArr = getPtr(TNameEntryArray + ((index / 0x4000) * Offsets::PointerSize));
39-
kaddr FNameEntry = getPtr(FNameEntryArr + ((index % 0x4000) * Offsets::PointerSize));
38+
kaddr FNameEntryArr = getPtr(TNameEntryArray + ((index / 0x4000) * Offsets::PointerSize));
39+
kaddr FNameEntry = getPtr(FNameEntryArr + ((index % 0x4000) * Offsets::PointerSize));
4040

41-
return getUEString(FNameEntry + Offsets::FNameEntryToNameString);
41+
return getUEString(FNameEntry + Offsets::FNameEntryToNameString);
42+
} else {
43+
kaddr TNameEntryArray = getRealOffset(Offsets::GNames);
44+
45+
kaddr FNameEntryArr = getPtr(TNameEntryArray + ((index / 0x4000) * Offsets::PointerSize));
46+
kaddr FNameEntry = getPtr(FNameEntryArr + ((index % 0x4000) * Offsets::PointerSize));
47+
48+
return getUEString(FNameEntry + Offsets::FNameEntryToNameString);
49+
}
4250
}
4351
}
4452

jni/GUObjects.h

+20-20
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ using namespace std;
99
int32 GetObjectCount(){
1010
if(isUE423) {
1111
return Read<int32>(getRealOffset(Offsets::GUObjectArray) +
12-
Offsets::FUObjectArrayToTUObjectArray + Offsets::TUObjectArrayToNumElementsNew);
12+
Offsets::FUObjectArrayToTUObjectArray + Offsets::TUObjectArrayToNumElements);
1313
} else {
14-
if(isEqual(pkg, "com.tencent.tmgp.pubgmhd")){
15-
return Read<int32>(getRealOffset(Offsets::GUObjectArray) + 0x58 + Offsets::TUObjectArrayToNumElements);
14+
if(deRefGUObjectArray){
15+
return Read<int32>(getPtr(getRealOffset(Offsets::GUObjectArray)) +
16+
Offsets::FUObjectArrayToTUObjectArray + Offsets::TUObjectArrayToNumElements);
1617
} else {
17-
return Read<int32>(getPtr(getRealOffset(Offsets::GUObjectArray)) +
18-
Offsets::FUObjectArrayToTUObjectArray + Offsets::TUObjectArrayToNumElements);
18+
return Read<int32>(getRealOffset(Offsets::GUObjectArray) +
19+
Offsets::FUObjectArrayToTUObjectArray + Offsets::TUObjectArrayToNumElements);
1920
}
2021
}
21-
//return 300000;
2222
}
2323

2424
kaddr GetUObjectFromID(uint32 index) {
@@ -28,13 +28,13 @@ kaddr GetUObjectFromID(uint32 index) {
2828

2929
return getPtr(Chunk + ((index % 0x10000) * Offsets::FUObjectItemSize));
3030
} else {
31-
if(isEqual(pkg, "com.tencent.tmgp.pubgmhd")){
32-
kaddr FUObjectArray = getRealOffset(Offsets::GUObjectArray);
33-
kaddr TUObjectArray = getPtr(FUObjectArray + 0x58);
31+
if(deRefGUObjectArray){
32+
kaddr FUObjectArray = getPtr(getRealOffset(Offsets::GUObjectArray));
33+
kaddr TUObjectArray = getPtr(FUObjectArray + Offsets::FUObjectArrayToTUObjectArray);
3434

35-
return getPtr(TUObjectArray + (index * Offsets::FUObjectItemSize));
35+
return getPtr(TUObjectArray + (index * Offsets::FUObjectItemSize));
3636
} else {
37-
kaddr FUObjectArray = getPtr(getRealOffset(Offsets::GUObjectArray));
37+
kaddr FUObjectArray = getRealOffset(Offsets::GUObjectArray);
3838
kaddr TUObjectArray = getPtr(FUObjectArray + Offsets::FUObjectArrayToTUObjectArray);
3939

4040
return getPtr(TUObjectArray + (index * Offsets::FUObjectItemSize));
@@ -44,22 +44,22 @@ kaddr GetUObjectFromID(uint32 index) {
4444

4545
void DumpObjects(string out) {
4646
uint32 count = 0;
47-
ofstream gobj(out + "/UObjects.txt", ofstream::out);
48-
if (gobj.is_open()) {
47+
ofstream obj(out + "/UObjects.txt", ofstream::out);
48+
if (obj.is_open()) {
4949
cout << "Dumping UObjects List" << endl;
5050
for (int32 i = 0; i < GetObjectCount(); i++) {
5151
kaddr uobj = GetUObjectFromID(i);
5252
if (UObject::isValid(uobj)) {
53-
gobj << setbase(10) << "[" << i << "]:" << endl;
54-
gobj << "Name: " << UObject::getName(uobj) << endl;
55-
gobj << "Class: " << UStruct::getClassName(uobj) << endl;
56-
gobj << "ObjectPtr: " << setbase(16) << uobj << endl;
57-
gobj << "ClassPtr: " << setbase(16) << UObject::getClass(uobj) << endl;
58-
gobj << endl;
53+
obj << setbase(10) << "[" << i << "]:" << endl;
54+
obj << "Name: " << UObject::getName(uobj) << endl;
55+
obj << "Class: " << UStruct::getClassName(uobj) << endl;
56+
obj << "ObjectPtr: " << setbase(16) << uobj << endl;
57+
obj << "ClassPtr: " << setbase(16) << UObject::getClass(uobj) << endl;
58+
obj << endl;
5959
count++;
6060
}
6161
}
62-
gobj.close();
62+
obj.close();
6363
cout << count << " UObjects Dumped" << endl;
6464
}
6565
}

0 commit comments

Comments
 (0)