** 菜鸟一枚,周末闲来无事,想着对某音进行逆向分析研究练练手;当我兴致冲冲的用MonkeyDev启动应用程序后,调试器与应用程序断开了,导致调试工作无法进行。 **
准备调试
**
iPhone8 iOS13.3越狱
MacOs 10.14.4
某音砸壳后的ipa包,版本12.4.0
MonkeyDev环境
IDA
**
首先将MonkeyDev中AntiAntiDebug.m中“sysctl”注释打开,继续运行工程
**
当应用程序启动后,调试器与应用程序继续断开,没有作用
**
开始反调试分析
首先给-[AppDelegate application:didFinishLaunchingWithOptions:]下个符号断点
**
继续运行MonkeyDev工程,启动应用程序后,调试器与应用程序继续断开,断点并没有断住
**
** 这就说明,在执行-[AppDelegate application:didFinishLaunchingWithOptions:]方法前,反调试的逻辑就已经执行了。那就继续猜测反调试逻辑是不是在main函数中 **
打开IDA解析某音的主二进制文件,寻找程序的main函数,此文件有170m,IDA解析时间比较长,要耐心等待
**
二进制文件的入口一般就是start,可从start中寻找到main函数的位置和逻辑;IDA解析二进制文件完成后,一般会自动定位到start。如下图所示,在IDA中的找到了start
**
**
F5一下,看到了start的伪码,如下图所示:
**
**
在伪码中发现了mac_syscall这个方法,切换回到汇编码
**
** 上图中伪码和汇编已经很明显的告诉我们了,从汇编的00000001043BE8EC位置到00000001043BE900,它就是反调试逻辑。 1A转换成十进制就是26,1F转换成就是31,26就是函数编号,通过Apple提供的System Call Table 可以查出ptrace的编号为26,通过“SVC 0x80”指令发起系统调用。 所以某音是通过调用ptrace函数可以阻止调试器依附:ptrace(31, 0, 0, 0) **
**
接下来就可以验证咱的找到的逻辑是否真的可以绕过反调试:给00000001043BE8F4下断点,等断点断住之后,修改寄存器x1的值,把它从31改成0。
**
**
然后继续运行应用程序,绕过了某音的反调试
**