Hopper LLDB调试微信

需要注意的是Hopper与LLDB所选择的AMR架构的位数得一致,要么是32位,要么都是64位,如果位数不匹配的话,那么计算出来的内存地址肯定是不对的。为了省去砸壳的麻烦,直接从PP助手下载了微信iPad版。

计算地址

地址计算公式:

偏移后模块基地址 = 偏移前模块基地址 + ALSR

偏移前地址从Hopper里看

Hopper LLDB调试微信_第1张图片

ASLR偏移从LLDB里看


由上图知ASLR偏移:30000
偏移后基地址为:34000

测试微信中的使用手机号登录
在Hopper中login 关键字进行搜索,找到方法[WCAccountPhoneLoginControlLogic initWithData:]
在Hopper中查看偏移前基地址


则initWithData偏移后地址:14B6A66 + 30000 = 14E6A66

设置断点动态调试

使用

br s -a 0x14E6A66

设置断点并触发后(点击使用手机登录)


与上图Hopper的initWihtData反汇编指令一致

Hopper LLDB调试微信_第2张图片

这里以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处设置断点

Hopper LLDB调试微信_第3张图片

由于r5不为0,因此程序顺序执行到下一句

Hopper LLDB调试微信_第4张图片

执行c(continue)后重来,点击使用手机号登录重新触发断点,然后令

register write r5 0

执行ni指令,发现修改了程序逻辑,程序跳转到了下面的分支。


Hopper LLDB调试微信_第5张图片

总结

iOS逆向工程最常用的五种LLDB命令:

  • image list
  • breakpoint
  • print
  • nexti与stepi
  • register write

参考

iOS应用逆向工程 2rd
iOS逆向工程之Hopper+LLDB调试第三方App
汇编器指南

你可能感兴趣的:(Hopper LLDB调试微信)