Mono
test game
该应用是 Github 上的一个测试应用。
示例代码1 完成了类方法的 nop 以及修改类静态属性值。
IL2CPP
Soul Knight
您可以通过 该链接 进行下载。
示例代码2 展示了如何生成与 IL2CPPDumper 类似的 dump.cs 文件以及执行 frida 脚本。
通过 MonoImage 或 MonoAssembly 类的 dump_declaration 方法可以完成一个程序集的 dump.cs 文件生成:
1image = ref.find_image_by_name("System.Data.dll")
2image.dump_declaration("system_data_dump.cs", True) // True - show the progress bar
产生的部分文件内容展示如下:
1// Namespace: System.Data
2class ConstraintConverter : ExpandableObjectConverter
3{
4 // Methods
5
6 // Offset: 0x64eb83c
7 public System.Void .ctor() { }
8
9 // Offset: 0x64eb844
10 public virtual System.Boolean CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType) { }
11
12 // Offset: 0x64eb90c
13 public virtual System.Object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, System.Object value, System.Type destinationType) { }
14}
15
16// Namespace: System.Data
17class ConstraintEnumerator : Object
18{
19 // Fields
20 private System.Collections.IEnumerator _tables; // 0x10
21 private System.Collections.IEnumerator _constraints; // 0x18
22 private System.Data.Constraint _currentObject; // 0x20
23
24 // Methods
25
26 // Offset: 0x64ec388
27 public System.Void .ctor(System.Data.DataSet dataSet) { }
28
29 // Offset: 0x64ec3f0
30 public System.Boolean GetNext() { }
31
32 // Offset: 0x64ec71c
33 public System.Data.Constraint GetConstraint() { }
34
35 // Offset: 0x64ec724
36 public virtual System.Boolean IsValidCandidate(System.Data.Constraint constraint) { }
37
38 // Offset: 0x64ec72c
39 public System.Data.Constraint get_CurrentObject() { }
40}
通过 AndroidUniRef 类的 execute_js 方法可以完成 frida js 脚本的执行,使用方法与 frida 的 python 绑定类似:
1def on_message(msg, data):
2 if msg["type"] == "send":
3 print(msg["payload"])
4
5attr = ref.find_class_in_image("Assembly-CSharp.dll", "RoleAttributePlayer")
6get_skill_ready = attr.find_method("get_skill_ready")
7
8code = """
9Java.perform(function () {
10 Interceptor.attach(ADDRESS, {
11 onEnter: function(args) {
12 send("function called.")
13 },
14 onLeave: function(retval) {
15 retval.replace(1);
16 }
17 })
18});""".replace("ADDRESS", f"ptr({hex(get_skill_ready.address)})")
19ref.execute_js(code, on_message)
Temple Run 2
Google Play 上的应用,您可以通过 该链接 进行下载。
示例代码3 完成了类方法的 patch。
Dream Blast
Google Play 上的应用,您可以通过 这个链接 进行下载。
示例代码4 展示了如何通过类名查找类所属 image:
1images = ref.list_images()
2for image in images:
3 InventoryBase = ref.find_class_in_image(image.name, "DreamBlast.InventoryBase")
4 if InventoryBase:
5 print("Found class in " + image.name)
6 break