iOS 逆向入门 - 动态库注入原理

一、工具 在逆向的过程中,我们经常需要往目标执行文件中注入自己的逻辑,从而实现 hook 的目的。 我们常用 optool 工具实现动态库注入。 Command Line Tool for interacting with MachO binaries on OSX/iOS 了解这个工具的原理,有助于我们对 MachO 文件有更深入的了解。 二、源码解析 关键代码如下: BOOL insertLoadEntryIntoBinary(NSString *dylibPath, NSMutableData *binary, struct thin_header macho, uint32_t type) { // 判断 Load Command 类型 if (type != LC_REEXPORT_DYLIB && type != LC_LOAD_WEAK_DYLIB && type != LC_LOAD_UPWARD_DYLIB && type != LC_LOAD_DYLIB) { LOG("Invalid load command type"); return NO; } // 判断动态库是否已经注入 // parse load commands to see if our load command is already there uint32_t lastOffset = 0; if (binaryHasLoadCommandForDylib(binary, dylibPath, &lastOffset, macho)) { // there already exists a load command for this payload so change the command type uint32_t originalType = *(uint32_t *)(binary....

March 8, 2022 · Darren Ou

iOS 逆向入门 - 符号恢复及反汇编

在通过逆向分析竞品过程中,经常需要分析其实现逻辑。但由于没有符号,我们会遇到一些阻碍。 一、符号恢复 我们经常 hook 一个方法并加断点可快速获得参数值,但是使用 bt 命令打印堆栈信息时,只能看到 ___lldb_unnamed_symbol279180$$TikTok 的信息,原因是 Objective-C 在打包时会被 stripped out,导致无法看到具体符号。 1. restore-symbol 使用 可以利用 restore-symbol 工具恢复符号(只能恢复 Objective-C 符号,无法恢复 C/C++ 符号),具体使用如下: # git clone --recursive https://github.com/tobefuturer/restore-symbol.git # cd restore-symbol # make # ./restore-symbol TikTok -o TikTok_symbol 2. 错误处理 在运行时会报错:2022-01-06 18:07:15.103 restore-symbol[17534:7647405] *** Assertion failure in -[CDObjectiveC2Processor loadClassAtAddress:], CDObjectiveC2Processor.m:258,原因是使用了 Swift 语言,而解析 Swift 的方法已过期。我们可以简单粗暴地把抛出异常的代码注释掉,重新 make 即可成功恢复符号。 3. 验证 把 ipa 包里的 MachO 文件替换为恢复符号后的 MachO 文件,重签名后运行到手机上(MonkeyDev 工具已经集成重签名的功能,这里只需要替换 TargetApp 里面的 MachO 文件,clean 后 rebuild 即可)。...

January 6, 2022 · Darren Ou

iOS 逆向入门 - 常用反逆向手段

在「iOS 逆向入门 - 绕过抖音反调试」中提到常用反调试手段,这里写下具体实现。 一、常用反逆向手段 1、反调试:ptrace ptrace 被常用于防止 lldb 依附,原理是一个进程只能被 ptrace 只能被一次,先于别人调用 ptrace 则可以防止别人依附。 ptrace 有几种方式进行调用: 1)直接调用 #import <sys/ptrace.h> ptrace(PT_DENY_ATTACH,0,0,0); iOS SDK 中不包含 ptrace.h 头文件,无法使用此方法调用,可使用以下方法。 2)通过 dlopen + dlsym 调用 #import <dlfcn.h> #import <sys/types.h> typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data); #if !defined(PT_DENY_ATTACH) #define PT_DENY_ATTACH 31 #endif void disable_attach() { void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW); ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace"); ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0); dlclose(handle); } 3)通过 syscall 调用 #import <sys/syscall....

December 9, 2021 · Darren Ou

iOS 逆向入门 - 实现 TikTok 自动播放下一个视频

一、背景 经过之前对 iOS 逆向的初步了解,想了个实现 TikTok 自动播放下一个视频的小需求实践一下。 二、实现过程 1、使用 class-dump 工具获取类信息 class-dump 工具通过解析 MachO 文件生成类信息,包括 OC 方法、属性、成员变量等。 有几个点需要留意: C 语言函数无法 dump; OC 方法的参数如果是对象类型,则只会显示 id; dump 出来的 OC 方法包含了 .h .m 文件里面的。 2、通过视图堆栈找出对应文件 从视图堆栈里面可以很方便找出播放器相关的文件,从 class-dump 出来的文件中找到相关文件,在文件中找出相关方法。 比如我需要实现自动播放下一个视频的话,分为两个步骤:1.监听播放完一个视频的事件;2.播放下一个视频。 找到“播放下一个视频”的方法: 我从视图堆栈里定位到 AWEFeedTableViewController 类; 从 class-dump 出来的文件中打开 AWEFeedTableViewController.h; 在文件中搜索 NextVideo,很容易可以找到 - (void)scrollToNextVideo; 方法。 类似的方法找出“播放完一个视频的事件”。 3、快速验证 从上一步找到的类还有对应方法是否真的可以实现“播放下一个视频”呢?我们可以在代码中 Hook 对应方法验证,但是这样验证的方法比较低效。 使用 Cycript 可以动态调试 App,这里简单介绍如何通过 Cycript 快速验证: 越狱手机上通过 Cydia 安装 Cycript; 通过 SSH 连接手机; 找到进程:root# ps -e | grep 'TikTok'; 依附到进程:cycript -p 进程号; 打印视图堆栈,输入命令:UIApp....

September 18, 2021 · Darren Ou

iOS 逆向入门 - 绕过抖音反调试

一、背景 在「iOS 逆向入门 - TikTok 调试」文章中介绍了使用 MonkeyDev 工具对 TikTok 进行调试。使用同样的方法对抖音进行调试的过程中遇到了几个问题,在这里记录一下。 二、动态库注入失败 按照 TikTok 的方式运行后,发现控制台没有打印 insert dylib success 的信息,猜测动态库注入失败了,果然在编译信息的输出中找到相关错误打印: 在 MonkeyDev 的 change.log 中找到信息,尝试恢复使用 optool 工具注入动态库。 下载 optool 的二进制文件并复制到相应位置,然后修改以下代码: # 注释原来的 MONKEYPARSER # "$MONKEYPARSER" install -c load -p "@executable_path/Frameworks/lib""${TARGET_NAME}""Dylib.dylib" -t "${BUILD_APP_PATH}/${APP_BINARY}" # 修改为 optool OPTOOL="${MONKEYDEV_PATH}/bin/optool" "$OPTOOL" install -c load -p "@executable_path/Frameworks/lib""${TARGET_NAME}""Dylib.dylib" -t "${BUILD_APP_PATH}/${APP_BINARY}" 重新编译运行后可发现控制台中出现 insert dylib success 信息,证明动态库已经注入成功。 三、绕过反调试 动态库注入成功后,发现控制台没有了任何输出,且 lldb 已经断开,证明抖音使用了某种反调试手段。 1、反调试常规手段 1)ptrace ptrace 被常用于防止 lldb 依附,原理是一个进程只能被 ptrace 只能被一次,先于别人调用 ptrace 则可以防止别人依附。...

September 15, 2021 · Darren Ou

iOS 上的 adb 工具 - libimobiledevice

一、简介 libimobiledevice 是一个与iOS设备通信的工具集,类似于安卓上的 adb 工具,像爱思助手、PP助手等底层都是用的这个工具。 A library to communicate with services on iOS devices using native protocols. ideviceinstaller 依赖于 libimobiledevice,主要用于操作 App,如获取应用列表、安装卸载应用等。 A command-line application to manage apps and app archives on iOS devices. 二、安装 Mac 上可以直接利用 Homebrew 安装: // 安装 libimobiledevice brew install libimobiledevice // 安装 ideviceinstaller brew install ideviceinstaller 三、使用 下面介绍常用的命令: 1. idevice_id 打印连接的设备的 UUID ➜ ~ idevice_id -l 0e68ed5333802b17d5ac62bfa708619de597eef2 2. idevicecrashreport 把设备上的崩溃报告移到指定文件夹。 ➜ ~ idevicecrashreport -u 0e68ed5333802b17d5ac62bfa708619de597eef2 crash Move: /com....

September 6, 2021 · Darren Ou

iOS 沙盒挂载工具 - ifuse

一、ifuse ifuse 是一个文件系统工具,在未越狱的设备上可以挂载 App 的文件夹,在已越狱的设备上可以挂载根文件夹 This project allows mounting various directories of an iOS device locally using the FUSE file system interface. 二、安装 利用 Homebrew 进行安装: // 期间可能需要输入电脑密码 brew install macfuse brew install ifuse 安装时可能出现错误: // 编辑 ifuse 的安装配置 vim `brew formula ifuse` // 注释或删除以下几行 # on_macos do # disable! date: "2021-04-08", because: "requires closed-source macFUSE" # end // 重新安装 brew install ifuse 三、使用 1. 挂载 // 新建挂载点文件夹 mkdir ~/Sandbox // 设置挂载点 ifuse --container ifuse....

September 5, 2021 · Darren Ou

iOS 逆向入门 - TikTok 调试

一、MonkeyDev 1、简介 MonkeyDev 是一个工具集合,基于 iOSOpenDev 进行升级并集成到 Xcode 里面,可以用来开发越狱机器的插件,可以很方便地注入动态库并重签名安装到非越狱机器,堪称神器。 2、安装 参考官方文档进行安装:https://github.com/AloneMonkey/MonkeyDev/wiki 3、开始使用 新建 MonkeyApp 项目。 拖入 已砸壳 的 ipa 包到指定文件夹 配置开发证书。 如无意外即可运行到手机上。 4、其它运行问题 1. 链接错误 ld: file not found: /usr/lib/libstdc++.dylib 这是由于 Xcode 10 开始就不再集成 libstdc++ 库,需要把相关的库文件重新添加到对应的路径。 使用 GitHub 上的这个库 https://github.com/devdawei/libstdc- 可以比较方便地添加 libstdc++ 库。 2. Bundle ID TikTok 对 Bundle ID 应该有校验,用其它 Bundle ID 会导致无法联网,这时候可以在 Build Settings 里面,找到 MONKEYDEV_DEFAULT_BUNDLEID 设为 YES,这时候重新编辑安装到手机即可。 3. 需要国外手机卡 TikTok 对地区有限制,手机需要插上国外手机卡才能进行开播,这样对调试不太友好。 CTCarrier 是iOS上获取运营商信息的系统框架,我们可以对其进行 Hook,使其返回指定运营商信息。 得益于 MonkeyDev 维护了非越狱插件 CocoaPods 私有仓库(https://github....

September 3, 2021 · Darren Ou

C 语言中利用单引号表示整数

背景 在进行与竟品的性能对比中,需要知道竟品的部分参数,与竟品对齐参数后再进行性能测试。 在 hook TikTok 的摄像头输出参数时发现,PixelFormatType 的值是整数 875704422,这样的一串整数很难知道其含义。 分析 从 key PixelFormatType 可以猜出是 kCVPixelFormatType 枚举中的一个,kCVPixelFormatType 枚举中大部分的值是以 '420f' 这样的单引号形式来表示,通过逐一对比知道,原来 875704422 对应的就是 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 的值,也就是 '420f'。 那么,为什么 875704422 == '420f' ? 原来,可以通过 ascii 编码进行转换,以 '420f' 为例: 4/2/0/f 的 ascii 编码分别为 52/50/48/102 ,转换为二进制分别为 00110100/00110010/00110000/01100110,合并起来 00110100001100100011000001100110 转换为十进制,刚好就是 875704422。 为方便看出对应的字符串,写了以下转换算法: 转换算法 NSString * changeToTypeStr(int value) { char *str = malloc(10); int count = 0; while (value > 0) { char ch = (char)(value & 0xFF); str[count] = ch; value = value >> 8; count ++; } if (count > 1) { int left = 0, right = count - 1; while (left < right) { char tmp = str[left]; str[left] = str[right]; str[right] = tmp; left ++; right --; } } str[count] = '\0'; NSString *res = [[NSString alloc] initWithUTF8String:str]; free(str); return res; }

September 1, 2021 · Darren Ou

iOS 逆向入门 - 砸壳

一、背景 iOS 手机通过 App Store 安装的应用都经过加密,无法直接进行逆向分析。我们需要对应用进行解密,称为“砸壳”。 我手上的设备是 iPhone 6s,系统是 iOS 13.5.1 二、手机越狱 安装爱思助手,一键越狱的工具里面有很多个工具(不一定需要安装爱思助手,可以直接从官网下载越狱工具)。 这里主要推荐两个:一个是通过硬件漏洞进行越狱的 checkra1n;一个是通过软件漏洞进行越狱的 Unc0ver。 相对来说通过硬件漏洞进行越狱的 checkra1n 会比较稳定,我使用的是 checkra1n。 按照提示进行操作,手机重启后会出现 checkra1n 应用,打开应用安装 Cydia (这个过程手机需要连接代理)。 注意:不同的越狱工具,对手机跟系统都有要求,太新的设备或者太新的系统都有可能不支持,需要仔细阅读官网的文档。另外,保证手机的重要资料都已经备份。 三、通过 SSH 连接手机 1. Wi-Fi 手机安装 Cydia 后,默认安装了 OpenSSH,可以直接通过 Wi-Fi 或者 USB 连接手机。 ssh root@your_device_ip_address // 密码默认为 alpine 2. USB // 安装 usbmuxd brew install usbmuxd // 建立端口映射(把 2222 映射到 22) iproxy 2222 22 // 建立 ssh 连接 ssh -p 2222 root@localhost 建立端口映射时,终端会一直显示 “waiting for connection”,这是正常的,新建一个终端窗口进行其它操作即可。...

August 30, 2021 · Darren Ou

iOS 逆向入门 - 工具

iOS 越狱 https://checkra.in/ (基于硬件漏洞,较稳定) https://unc0ver.dev/ (基于软件漏洞,每次重启手机后都要再越狱) App文件系统结构 https://www.i-funbox.com/zh-cn/index.html https://macroplant.com/iexplorer App UI调试工具 https://revealapp.com/ https://lookin.work/ (免费) 反编译工具 https://hex-rays.com/ida-pro/ https://www.hopperapp.com/ MachO https://github.com/gdbinit/MachOView 越狱开发框架 https://github.com/theos/theos ipa砸壳工具 https://github.com/stefanesser/dumpdecrypted https://github.com/KJCracks/Clutch https://github.com/AloneMonkey/frida-ios-dump class-dump http://stevenygard.com/projects/class-dump/ 动态库注入 https://github.com/alexzielenski/optool 获取keychain信息 https://github.com/ptoomey3/Keychain-Dumper 工具集 https://github.com/kokoabim/iOSOpenDev https://github.com/AloneMonkey/MonkeyDev (基于iOSOpenDev开发,可开发非越狱插件) 持续更新。。。

August 29, 2021 · Darren Ou