- 解析
Unity
的方法 / 类 / 字段 - 解析
运行时
方法参数 - 常用函数的
(批量)断点
(参数值 / 返回值 查看) - 更方便的查看以及调用函数
$ git clone https://github.com/rise-worlds/Il2cppHook.git
$ npm install
$ npm watch
$ frida -U -f com.xxx.xxx -l ./_Ufunc.js
OR
$ frida -FU -l ./_Ufunc.js
- 基础函数
- i() == list_images : 列出所有的 Images
- c() == list_classes : 列出所有的 Classes
- m() == list_methods : 列出所有的 Methods
- f() == list_fields : 列出所有的 Fields
- findClass(className) : 查找类,一般配合 m() 使用 , m(findClass('className')) === m('className')
- findMethod / find_method : 根据类名查找相关的函数
- printExp : 查找名称为参数的函数,比较慢,但是方便
- getApkInfo : 获取 apk 信息
- callFunction : 函数调用
- showAsm : 基于frida.Instruction结合unity函数信息的反汇编
- showMethodInfo / MethodToShow : 查看MethodInfo信息(后者多用在findMethod)
- 断点函数
- 常用函数Hook的封装
- Module/Thread相关
- listModule : (filterName?: string) => void
- listModules : (moduleName: string, printItems?: number) => void
- listThreads : (maxCountThreads?: number) => void
- attachCurrentThread : Il2Cpp.Api._threadCurrent()
- findExport : (exportName: string, moduleName?: string, callback?: (exp: ModuleExportDetails) => void) => void
- findImport : (moduleName: string, importName?: string) => void
- lf 系列 (list fields ... )
- 其他
-
findClass(className) 查找类,一般配合m()使用 m(findClass('className')) === m('className')
-
showMethodInfo / MethodToShow 查看MethodInfo信息(后者多用在findMethod)showAddressInfo alias showMethodInfo(addressToMethod)
-
-
B ('ClassName') === B(findClass('ClassName')),不会重复添加已添加的Method,不带参数即断点所有常用的方法
-
BF 等价于原来的 B("filterStr") ,断点包含指定字符串的方法
-
b ('Method_Pointer') / b('MethodInfo_Pointer')
-
d / D : d === detachAll and d(ptr) === detach(ptr) / D() === detachAll + clear list cache
-
bp('filterMethodName') 断点包含 指定的函数名(filterMethodName) 的所有函数
-
-
listModules (moduleName: string, printItems?: number) => void
-
findExport (exportName: string, moduleName?: string, callback?: (exp: ModuleExportDetails) => void) => void
-
findImport (moduleName: string, importName?: string) => void
-
lfs 详见 Il2cppHook\agent\bridge\fix\parseFields.ts 需要一个参数实例地址 可以去B()中找
...
- 文件结构按照Unity类继承关系实现
- 文件命名规则以及结构
- 一个类文件夹下一个include.ts包含当前类文件以及该类子类文件夹的include
- api.ts
- 用作解析常用函数 (exp: ptr(Il2Cpp.Api.Application._Quit) )
- 函数的命名使用 '_' + 具体的函数名,多参数使用后缀 '_x' 结尾i (exp: Il2Cpp.Api.Application._Quit_1)
- api class 命名为 类名 + 'API' (exp: System_ValueType_API)
- class.ts
- NativePointer转换为Class的实现 (把ptr当成class来解析)
- 包含一些(静态)字段,(静态)方法,以及方便调用的一些函数封装
- this.handle 存贮当前 ptr,可以是 实例指针也可以是类指针 (多数情况使用实例指针)
- export.ts
- 主要用作拓展类的一些导出方法
- TODO 按照这个文件结构可以拓展到整个UnityAPI (提供了 generateApi / generateClass / generateFieldEnum 方便的拓展类,生成的东西不太准,需要稍微修改点点)
- 由于JS特性在64位hook下存在精度问题,arm64下的指针大小是8字节,但是js命令行传参最大值是 Number.MAX_SAFE_INTEGER = 9007199254740991 (0x1fffffffffffff),所以命令行直接给值超出范围导致精度丢失,这时候建议使用string类型 use ptr("0xb400007d17736990") instead of ptr(0xb400007d17736990),这部分发现的比较晚后续很多东西都没有做好优化
- 我这里用的环境: frida==15.2.2 | frida-tools==10.5.4 , 测试机 :piex 4 原生android 11
- 确认手机端server与电脑端frida版本一致,如果你的版本不一致概率性出问题
- 已确认高版本的 frida-tools 在使用老版 Ufunc.js (ts版不受影响)会出问题,所以建议直接使用 10.5.4 版本
- 建议使用真机,尽量不在x86模拟器中使用,x86中找不到对应so,其次frida对于模拟器的兼容性也并不好
todo: qbdi 调用栈 ...