需要注意的是Hopper与LLDB所选择的AMR架构的位数得一致,要么是32位,要么都是64位,如果位数不匹配的话,那么计算出来的内存地址肯定是不对的。为了省去砸壳的麻烦,直接从PP助手下载了微信iPad版。
计算地址
地址计算公式:
偏移后模块基地址 = 偏移前模块基地址 + ALSR
偏移前地址从Hopper里看
ASLR偏移从LLDB里看
由上图知ASLR偏移:30000
偏移后基地址为:34000
测试微信中的使用手机号登录
在Hopper中login 关键字进行搜索,找到方法[WCAccountPhoneLoginControlLogic initWithData:]
在Hopper中查看偏移前基地址
则initWithData偏移后地址:14B6A66 + 30000 = 14E6A66
设置断点动态调试
使用
br s -a 0x14E6A66
设置断点并触发后(点击使用手机登录)
与上图Hopper的initWihtData反汇编指令一致
这里以add r7,sp,0xc为例,ADD指令说明如下:
ADD R0,R1,R2; R0 <= R1+R2
在执行这条语句之前r7的值是55961272,sp当前值为66961232,通过在LLDB执行ni指令,执行当前汇编语句,得到r7的值是55961244,验证了结果的正确性。
可以使用po命令打印Objective-C对象,用p(char *)通过强制转换的方式打印C语言基本数据类型对象
通过register write修改寄存器的值
语法
CBZ Rn, label 比较,为零则跳转;
CBNZ Rn, label 比较,为非零则跳转。
其中:Rn是存放操作数的寄存器。label是跳转目标。
(ASLR由上面30000变化为F0000是因为重连接过debug server)
下面测试下下个图第一行红色描边的汇编代码
计算偏移后的地址:0x14B6A9A + 0xF0000 = 0x15A6A9A
在语句cbz r5, 0x14b6b00设置断点,即在0x15A6A9A处设置断点
由于r5不为0,因此程序顺序执行到下一句
执行c(continue)后重来,点击使用手机号登录重新触发断点,然后令
register write r5 0
执行ni指令,发现修改了程序逻辑,程序跳转到了下面的分支。
总结
iOS逆向工程最常用的五种LLDB命令:
- image list
- breakpoint
- nexti与stepi
- register write