Table of Contents
环境配置
在做iOS开发时,在Mac上输入LLDB的命令就可以控制iOS端的App,是因为在我们iOS客户端中有一个debugserver服务器。
debugserver专门用来连接Mac端的LLDB客户端,接收LLDB所提供的命令,并且进行相应的执行。如果你的iOS设备进行过真机调试的话,设备中就会被安装上debugserver, 不过该debugserver只能用来调试你自己的相关应用。如果想要调试从AppStore中获取的App的话,那么我们需要对iOS设备上的debugserver进行处理。
手机
debugserver *:19999 -a Aweme
电脑
> lldb (lldb) process connect connect://127.0.0.1:19999
参考:iOS逆向工程之Hopper+LLDB调试第三方App
指令
查看 image 内存偏移
image list -o -f
输出
[ 0] 0x000000010005b000 /var/mobile/Applications/49268249-F1CD-35FC-BFFD-B4B8F3751B0D/WeChat.app/wechat(0x000000010005f000) ...
左边地址为 ASLR 偏移量(随机偏移量),就是虚拟内存的地址相对于模块基地址的偏移量。右侧地址是偏移后的地址。
模块在内存中的起始地址----模块基地址
ASLR偏移 ---- 虚拟内存起始地址与模块基地址的偏移量
模块偏移后的基地址(0x10005f000)= ASLR偏移量(0x10005b000)+ 模块偏移前基地址(0x4000)
断点调试
加断点
# 加断点 br s -a 0x100331924 # 打印寄存器 po $x0 #下一步 ni # 放开断点 c # 禁用(disable)编号为1的断点 br dis 1 # 启用(enable)编号为1的断点 br en 1 # 禁用所有断点 br dis # 启用所有断点 br en # 删除(delete)编号为1的断点 br del 1 # 删除所有断点 br del # 打印堆栈 p/x $sp # 读所有寄存器的值 reg read # 读内存的值 memory read/10xh 0x000000016fdac630
可以通过 nexti (简写:ni)和 stepi (简写:si)来进行单步的调试。
ni遇到跳转不会进入到跳转中去,si会跳转到相应的分支中去。
参考
iOS逆向工程之Hopper+LLDB调试第三方App
LLDB调试器使用简介
iOS符号表恢复&逆向支付宝 - Jun's Blog
ARMarch64汇编学习笔记 · Cocoa
iOS开发同学的arm64汇编入门 - 刘坤的技术博客
黑科技:把第三方 iOS 应用转成动态库 - Jun's Blog
github: app2dylib
iOS逆向工程之Hopper中的ARM指令
iOS逆向工程之App脱壳