Mono

test game

该应用是 Github 上的一个测试应用。

示例代码1 完成了类方法的 nop 以及修改类静态属性值。

IL2CPP

Soul Knight

您可以通过 该链接 进行下载。

示例代码2 展示了如何生成与 IL2CPPDumper 类似的 dump.cs 文件以及执行 frida 脚本。

通过 MonoImageMonoAssembly 类的 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