Skip to content

Commit 2fd3624

Browse files
committed
更新ida脚本
1 parent bb3e53c commit 2fd3624

File tree

6 files changed

+189
-16
lines changed

6 files changed

+189
-16
lines changed

Il2CppDumper/Il2CppDumper.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,15 @@
2828
<None Update="ida.py">
2929
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
3030
</None>
31+
<None Update="ida_py3.py">
32+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
33+
</None>
3134
<None Update="ida_with_struct.py">
3235
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
3336
</None>
37+
<None Update="ida_with_struct_py3.py">
38+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
39+
</None>
3440
</ItemGroup>
3541

3642
</Project>

Il2CppDumper/Outputs/ScriptGenerator.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -738,8 +738,10 @@ private string RecursionStructInfo(StructInfo info)
738738
{
739739
var parentStructName = info.Parent + "_o";
740740
pre.Append(RecursionStructInfo(structInfoWithStructName[parentStructName]));
741-
sb.Append($"struct {info.TypeName}_Fields {{\n");
742-
sb.Append($"\t{info.Parent}_Fields _;\n");
741+
sb.Append($"struct {info.TypeName}_Fields : {info.Parent}_Fields {{\n");
742+
// C style
743+
//sb.Append($"struct {info.TypeName}_Fields {{\n");
744+
//sb.Append($"\t{info.Parent}_Fields _;\n");
743745
}
744746
else
745747
{

Il2CppDumper/ida.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ def make_function(start, end):
3131
path = idaapi.ask_file(False, '*.json', 'script.json from Il2cppdumper')
3232
data = json.loads(open(path, 'rb').read().decode('utf-8'))
3333

34+
if "Addresses" in data and "Addresses" in processFields:
35+
addresses = data["Addresses"]
36+
for index in range(len(addresses) - 1):
37+
start = get_addr(addresses[index])
38+
end = get_addr(addresses[index + 1])
39+
make_function(start, end)
40+
3441
if "ScriptMethod" in data and "ScriptMethod" in processFields:
3542
scriptMethods = data["ScriptMethod"]
3643
for scriptMethod in scriptMethods:
@@ -67,12 +74,5 @@ def make_function(start, end):
6774
idc.set_cmt(addr, name, 1)
6875
idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
6976

70-
if "Addresses" in data and "Addresses" in processFields:
71-
addresses = data["Addresses"]
72-
for index in range(len(addresses) - 1):
73-
start = get_addr(addresses[index])
74-
end = get_addr(addresses[index + 1])
75-
make_function(start, end)
76-
7777
print 'Script finished!'
7878

Il2CppDumper/ida_py3.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# -*- coding: utf-8 -*-
2+
import json
3+
4+
processFields = [
5+
"ScriptMethod",
6+
"ScriptString",
7+
"ScriptMetadata",
8+
"ScriptMetadataMethod",
9+
"Addresses",
10+
]
11+
12+
imageBase = idaapi.get_imagebase()
13+
14+
def get_addr(addr):
15+
return imageBase + addr
16+
17+
def set_name(addr, name):
18+
ret = idc.set_name(addr, name, SN_NOWARN | SN_NOCHECK)
19+
if ret == 0:
20+
new_name = name + '_' + str(addr)
21+
ret = idc.set_name(addr, new_name, SN_NOWARN | SN_NOCHECK)
22+
23+
def make_function(start, end):
24+
next_func = idc.get_next_func(start)
25+
if next_func < end:
26+
end = next_func
27+
if idc.get_func_attr(start, FUNCATTR_START) == start:
28+
ida_funcs.del_func(start)
29+
ida_funcs.add_func(start, end)
30+
31+
path = idaapi.ask_file(False, '*.json', 'script.json from Il2cppdumper')
32+
data = json.loads(open(path, 'rb').read().decode('utf-8'))
33+
34+
if "Addresses" in data and "Addresses" in processFields:
35+
addresses = data["Addresses"]
36+
for index in range(len(addresses) - 1):
37+
start = get_addr(addresses[index])
38+
end = get_addr(addresses[index + 1])
39+
make_function(start, end)
40+
41+
if "ScriptMethod" in data and "ScriptMethod" in processFields:
42+
scriptMethods = data["ScriptMethod"]
43+
for scriptMethod in scriptMethods:
44+
addr = get_addr(scriptMethod["Address"])
45+
name = scriptMethod["Name"]
46+
set_name(addr, name)
47+
48+
if "ScriptString" in data and "ScriptString" in processFields:
49+
index = 1
50+
scriptStrings = data["ScriptString"]
51+
for scriptString in scriptStrings:
52+
addr = get_addr(scriptString["Address"])
53+
value = scriptString["Value"]
54+
name = "StringLiteral_" + str(index)
55+
idc.set_name(addr, name, SN_NOWARN)
56+
idc.set_cmt(addr, value, 1)
57+
index += 1
58+
59+
if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
60+
scriptMetadatas = data["ScriptMetadata"]
61+
for scriptMetadata in scriptMetadatas:
62+
addr = get_addr(scriptMetadata["Address"])
63+
name = scriptMetadata["Name"]
64+
set_name(addr, name)
65+
idc.set_cmt(addr, name, 1)
66+
67+
if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
68+
scriptMetadataMethods = data["ScriptMetadataMethod"]
69+
for scriptMetadataMethod in scriptMetadataMethods:
70+
addr = get_addr(scriptMetadataMethod["Address"])
71+
name = scriptMetadataMethod["Name"]
72+
methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
73+
set_name(addr, name)
74+
idc.set_cmt(addr, name, 1)
75+
idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
76+
77+
print('Script finished!')
78+

Il2CppDumper/ida_with_struct.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ def make_function(start, end):
3333
parse_decls(open(hpath, 'rb').read(), 0)
3434
data = json.loads(open(path, 'rb').read().decode('utf-8'))
3535

36+
if "Addresses" in data and "Addresses" in processFields:
37+
addresses = data["Addresses"]
38+
for index in range(len(addresses) - 1):
39+
start = get_addr(addresses[index])
40+
end = get_addr(addresses[index + 1])
41+
make_function(start, end)
42+
3643
if "ScriptMethod" in data and "ScriptMethod" in processFields:
3744
scriptMethods = data["ScriptMethod"]
3845
for scriptMethod in scriptMethods:
@@ -76,12 +83,5 @@ def make_function(start, end):
7683
idc.set_cmt(addr, name, 1)
7784
idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
7885

79-
if "Addresses" in data and "Addresses" in processFields:
80-
addresses = data["Addresses"]
81-
for index in range(len(addresses) - 1):
82-
start = get_addr(addresses[index])
83-
end = get_addr(addresses[index + 1])
84-
make_function(start, end)
85-
8686
print 'Script finished!'
8787

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# -*- coding: utf-8 -*-
2+
import json
3+
4+
processFields = [
5+
"ScriptMethod",
6+
"ScriptString",
7+
"ScriptMetadata",
8+
"ScriptMetadataMethod",
9+
"Addresses",
10+
]
11+
12+
imageBase = idaapi.get_imagebase()
13+
14+
def get_addr(addr):
15+
return imageBase + addr
16+
17+
def set_name(addr, name):
18+
ret = idc.set_name(addr, name, SN_NOWARN | SN_NOCHECK)
19+
if ret == 0:
20+
new_name = name + '_' + str(addr)
21+
ret = idc.set_name(addr, new_name, SN_NOWARN | SN_NOCHECK)
22+
23+
def make_function(start, end):
24+
next_func = idc.get_next_func(start)
25+
if next_func < end:
26+
end = next_func
27+
if idc.get_func_attr(start, FUNCATTR_START) == start:
28+
ida_funcs.del_func(start)
29+
ida_funcs.add_func(start, end)
30+
31+
path = idaapi.ask_file(False, '*.json', 'script.json from Il2cppdumper')
32+
hpath = idaapi.ask_file(False, '*.h', 'il2cpp.h from Il2cppdumper')
33+
parse_decls(open(hpath, 'r').read(), 0)
34+
data = json.loads(open(path, 'rb').read().decode('utf-8'))
35+
36+
if "Addresses" in data and "Addresses" in processFields:
37+
addresses = data["Addresses"]
38+
for index in range(len(addresses) - 1):
39+
start = get_addr(addresses[index])
40+
end = get_addr(addresses[index + 1])
41+
make_function(start, end)
42+
43+
if "ScriptMethod" in data and "ScriptMethod" in processFields:
44+
scriptMethods = data["ScriptMethod"]
45+
for scriptMethod in scriptMethods:
46+
addr = get_addr(scriptMethod["Address"])
47+
name = scriptMethod["Name"]
48+
set_name(addr, name)
49+
signature = scriptMethod["Signature"]
50+
if apply_type(addr, parse_decl(signature, 0), 1) == False:
51+
print("apply_type failed:", hex(addr), signature)
52+
53+
if "ScriptString" in data and "ScriptString" in processFields:
54+
index = 1
55+
scriptStrings = data["ScriptString"]
56+
for scriptString in scriptStrings:
57+
addr = get_addr(scriptString["Address"])
58+
value = scriptString["Value"]
59+
name = "StringLiteral_" + str(index)
60+
idc.set_name(addr, name, SN_NOWARN)
61+
idc.set_cmt(addr, value, 1)
62+
index += 1
63+
64+
if "ScriptMetadata" in data and "ScriptMetadata" in processFields:
65+
scriptMetadatas = data["ScriptMetadata"]
66+
for scriptMetadata in scriptMetadatas:
67+
addr = get_addr(scriptMetadata["Address"])
68+
name = scriptMetadata["Name"]
69+
set_name(addr, name)
70+
idc.set_cmt(addr, name, 1)
71+
if scriptMetadata["Signature"] is not None:
72+
signature = scriptMetadata["Signature"]
73+
if apply_type(addr, parse_decl(signature, 0), 1) == False:
74+
print("apply_type failed:", hex(addr), signature)
75+
76+
if "ScriptMetadataMethod" in data and "ScriptMetadataMethod" in processFields:
77+
scriptMetadataMethods = data["ScriptMetadataMethod"]
78+
for scriptMetadataMethod in scriptMetadataMethods:
79+
addr = get_addr(scriptMetadataMethod["Address"])
80+
name = scriptMetadataMethod["Name"]
81+
methodAddr = get_addr(scriptMetadataMethod["MethodAddress"])
82+
set_name(addr, name)
83+
idc.set_cmt(addr, name, 1)
84+
idc.set_cmt(addr, '{0:X}'.format(methodAddr), 0)
85+
86+
print('Script finished!')
87+

0 commit comments

Comments
 (0)