LLDB & DebugServer

环境配置

在做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脱壳