Chomper 可以视为 iOS 环境下的 Unidbg 替代方案,采用 Python 语言开发。笔者在寻找相关学习资料的过程中,发现 Chomper 的技术文档相对匮乏。因此我决定深入研究其源码,并整理出这套 《 IOS Chomper 修炼笔记 》,希望能与各位技术爱好者共同探讨和学习。 打开 Pycharm 将 项目导入,然后设置源代码根目录右键点击 src 目录右键点击 tests 目录设置完以后找到 chomper/examples/objc.py 便可以点击运行直接执行了,也可以参考着修改下面的代码后再运行bangbang.py 是 Chomper 提供的一个案例,源码如下(密文部分省略了很大一截)一、配置全局日志设置,包括定义输出格式和日志级别,并获取日志处理器。二、如果示例所需的二进制和 plist 文件不存在,则下载三、初始化模拟器四、创建 OC 运行时对象五、加载二进制六、寻找 OC类七、确保 OC 对象能正确被释放八、创建 NSString 对象九、调用 OC 方法 注意:ObjcClass 的call_method 方法是对 ObjcType(ObjcClass 的父类) 的 msgSend 方法进行了一层封装十、读取 NSString 字符串的值 NSString 的 UTF8String() 方法是用于将 NSString 转换为 C 语言风格的 UTF-8 编码 char* 字符串。arch mode 指定CPU执行模式,如 ARM 或 Thumb 模式默认值: const.MODE_ARMos_type 决定模拟哪种操作系统环境,包括系统调用、库函数等,如 IOS 或 安卓默认值: const.OS_ANDROIDendianrootfs_path指定根文件系统路径,提供模拟环境所需的系统文件,如库文件、配置文件等。例如iOS模拟需要CoreFoundation、UIKit等框架。默认值: Noneenable_ui_kit 是否启用UIKit框架支持,允许模拟器加载和使用iOS的UIKit框架,用于UI相关功能默认值: Trueenable_objc是否启用Objective-C运行时支持,允许模拟器执行Objective-C方法调用、处理对象等默认值: Trueenable_vfp是否启用ARM的向量浮点扩展(Vector Floating Point),允许模拟器处理浮点运算指令默认值: Truelogger 自定义日志记录器,用于记录模拟过程中的日志信息默认值: Nonetrace_inst 是否跟踪每条执行的指令,开启后会实时反汇编并输出每条执行的指令,但会显著降低模拟速度默认值: Falsetrace_symbol_calls 是否跟踪所有符号调用,记录程序调用的所有外部函数默认值: Falsetrace_inst_callback 自定义指令跟踪回调函数,允许用户提供自定义函数来处理指令执行事件默认值: NoneChomper 类的 create_string 方法 首先看 Chomper 类的 create_string 方法,它负责动态内存分配,并将字符串写入新分配的内存空间,并返回指向该字符串的指针,源码如下: Chomper 类的 call_symbol 方法 随后可以发现使用了 Chomper 类的 call_symbol 方法,调用了 OC 的 _objc_getClass 方法。 _objc_getClass 方法是 Objective-C 运行时中的一个重要函数,用于根据类名查找并返回对应的类对象。call_symbol 方法的主要处理逻辑如下:call_symbol 方法的源码如下所示ObjcClass 构造方法 最后返回 ObjcClass 对象。 ObjcClass 是 Chomper 框架中表示 Objective-C 类的 Python 封装类,位于 chomper/src/chomper/objc/types.py 文件中。这个类提供了与 Objective-C 类交互的各种方法和属性,比如可以通过调用 call_method 去调用类方法,或者通过 get_class_method 获取类方法的信息。 NSString 的 UTF8String() 方法是用于将 NSString 转换为 C 语言风格的 UTF-8 编码 char* 字符串。NSData 是不可变的二进制数据容器,其在 OC 代码中的创建方式如下对 logging.basicConfig 的 filename 进行设置首先初始化模拟器时指定一个回调函数给参数 trace_inst_callback 然后在模块加载的时候将参数 trace_inst 设置为 true底层原理如下所示,所以也可以使用 Chomper 的 add_inst_trace() 方法添加指定模块trace 指定范围这个我没有看见提供的 API(也可能是没找到),所以笔者参考 Chomper 的 add_inst_trace 方法写了一个,代码如下:如发现代码或思路存在问题,恳请指正。同时期待与各位大佬交流学习,共同进步。在此十分感谢 sh4w 大佬分享的 Chomper 框架!具体可以参考文章: [分享]一个基于 Unicorn 实现的 iOS 程序模拟执行框架(Python) 前言 安装和测试 安装 Chomper 运行案例 bangbang.py 源码分析 源码分析 Chomper 初始化参数分析 基本配置参数 功能开关参数 调试和跟踪参数 ObjcRuntime 的 find_class 方法剖析 打印 NSString 对象 创建 NSDictionary 对象 创建 NSData 对象 打印 NSDictionary 对象 获取 ObjC 的类名 将输出的内容保存到文本中 Chomper HOOK 通过函数符号进行 HOOK 通过地址进行 HOOK Hook ObjC 方法 修改返回值 trace 指定模块 trace 指定范围
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288187.htm
[原创] IOS Chomper 修炼笔记
393 浏览
11 回复
感谢分享
确实资料较少,研究下
感谢分享
感谢分享
感谢分享
mark
tql
不错
赞
sh4w
赞
向您学习 ੭ ˙ᗜ˙ ੭
赞
向您学习 ੭ ˙ᗜ˙ ੭
研究下,资料较少