我用的是iPad mini 3(iOS 8.1),指令集是armv7s,最开始图方便,还是用了cydia.radare.org源提供的gdb(google了一圈,好像目前能在iOS上跑的gdb也就这一个)。实际用起来,发现它对armv7s支持的并不好,没法自动切换thumb指令集,需要人为指定$pc+1为反汇编位置不说,还因此不能单步执行,只能用IDA分析好以后,找特定地址中断查看寄存器聊以自慰。考虑到分析APP的第一步都是解密二进制程序,既然目前常见的文章都是用gdb来dump程序的,就暂时将就一下吧。
运行iPadPiano后,gdb附加并dump已经解密的代码片段。
iOS# gdb -p 1793
(gdb) set height 20
(gdb) info sharedlibrary
1 iPadPiano - 0x33000 exec C C /private/var/mobile/Containers/Bundle/Application/96A72F1A-6342-4136-9084-36B83FDA0118/iPadPiano.app/iPadPiano at 0x33000 (offset 0x2f000)
实际试了几轮,gdb带来的麻烦太多,支持的数据类型也少,最后还是选择了lldb,iOS端使用的debugserver需要修改签名什么的,实在不想在支线剧情再花精力了,下载一份修改好的,放到/usr/bin,就能进行调试了:
iOS# ps ax | grep iPadPiano
1933 0:30.00 /var/mobile/Containers/Bundle/Application/96A72F1A-6342-4136-9084-36B83FDA0118/iPadPiano.app/iPadPiano
iOS# debugserver 0.0.0.0:8888 -a 1933
Listening to port 8888 for a connection from 0.0.0.0...
mac$ lldb
(lldb) platform select remote-ios
(lldb) process connect connect://192.168.1.158:8888
在上图代码下方不远处,即调用构造请求地址的位置断点:
(lldb) b 0x39e794
Breakpoint 1: where = iPadPiano`___lldb_unnamed_function13$$iPadPiano + 68892, address = 0x0039e794
(lldb) c
Process 1933 resuming