iOS逆向工程(12)LLDB - 动态调试

相对于静态分析,静态分析只能分析静态的函数内部执行。想要动态获取程序在运行时的参数传递,执行流程及寄存器内存等信息,就需要使用动态调试的方法。

一、LLDB简介

LLDB全称 " Low Level Debugger ", 是由苹果出品,默认内置于Xcode中的动态调试工具,不但通吃C、C++、Objective-C ,还全盘支持OSX、iOS、以及iOS模拟器。

LLDB 既可以在本地调试 Mac 应用程序,也可以远程调试 iPhone 应用程序。

二、LLDB功能概括

  • 在指定的条件下启动程序;
  • 在指定的条件下停止程序;
  • 在程序停止的时候检查程序内部发生的事;
  • 在程序停止的时候对程序进行改动,观察程序执行过程有什么变化;

三、debugserver工具

需要有一点说明,LLDB是运行在OSX中的,要想调试iOS,还需要另一个工具的配合,它就是debugserver。

当使用 Xcode 调试手机 APP 时,Xcode 会将 debugserver 文件 复制到手机中,以便在手机上启动一个服务,等待 Xcode 进行远程调试。

debugserver 的作用就是它作为服务端,实际执行LLDB(客户端)传过来的命令,再把结果反馈给LLDB,然后显示给用户。

iOS设备上并没有安装debugserver,只有设备链接过一次xcode,并在Window ---- device菜单中添加此设备后,debugserver就会出现iOS设备/Developer/user/bin/目录下。

四、准备工作

1. 获取 debugserver 文件

通过爱思助手可以导出 debugserver 文件:/developer/usr/bin/debugserver

2. 签名权限 task_for_pid 添加

默认通过Xcode安装的debugserver只能调试我们自己的APP,因为缺少task_for_pic权限(这个权限和读取进程id,端口等相关的权限),所以我们可以手动给debugserver添加权限。

新建 entitlements.plist 文件,在其中写入如下内容。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.springboard.debugapplications</key>
    <true/>
    <key>run-unsigned-code</key>
    <true/>
    <key>get-task-allow</key>
    <true/>
    <key>task_for_pid-allow</key>
    <true/>
</dict>
</plist>

把 debugserver 和 entitlements.plist 放到同级目录,使用 codesign 对 debugserver 重新签名

codesign -s - --entitlements entitlements.plist -f debugserver
3. 通过爱思助手上传回去

通过爱思助手上传到手机 /usr/bin/debugserver

给 debugserver 添加 执行权限

chmod +x /usr/bin/debugserver

五、进行调试

转发端口
2222 端口用于 SSH
1234 端口用于 lldb 连接

iproxy 2222 22
iproxy 1234 1234

连接 SSH

ssh -p 2222 root@127.0.0.1

找到进程 ID

执行 debugserver,附加 snapchat 进程

debugserver *:1234 -a 1391

打开电脑终端,输入 lldb 进行连接

lldb
process connect connect://127.0.0.1:1234
六、lldb 命令

LLDB的所有命令在 LLVM官网 或者 Apple官网 都可以查询到。笔者会在这篇文章中列举一些比较常用的命令。

1、断点设置

命令名称 命令参样例
使用名称设置断点 breakpoint set --name main
使用内存地址设置断点 breakpoint -a 0xXXXXXXXX
删除断点 breakpoint delete 1
使断点失效/生效 breakpoint disable/enable 2
查看所有断点 breakpoint list
OC中所有命名中包含为Test4的方法设置断点 breakpoint set -r Test4
# 给所有名为xx的函数设置一个断点
breakpoint set —name xx
br s -n xx
b xx
​
# 在文件F指定行L设置断点
breakpoint set —file F —line L
br s -f F -l L
b F:L
​
# 当执行到该线程时,调试器才会断下来。
# 一段代码可能开了多线程,要在不同线程之间切来切去。这时就可以使用线程断点了
breakPoint set –f 文件名 –l 行号 –t 线程id
​
# 条件断点
breakpoint set -f viewController.m -l 362 -c "width > 68"
​
# 给所有名为xx的C++函数设置一个断点(希望没有同名的C函数)
breakpoint set —method xxx
br s -M xxx
​
# 给一个OC函数[objc msgSend:]设置一个断点
breakpoint set —name "-[objc msgSend:]"
b -n "-[objc msgSend:]"
​
# 给所有名为xx的OC方法设置一个断点(希望没有名为xx的C或者C++函数)
breakpoint set —selector xx
br s -S count
​
# 给所有函数名正则匹配成功的函数设置一个断点(留个正则熟练的同学尝试)
breakpoint set --func-regex regular-expression
br s -r regular-expression
​
# 给指定函数地址func_addr的位置设置一个断点
br set -a xxx
​
# 一次性断点
# -- 是命令选项结束符,如果没有选项,可以省略
breakpoint set --one-shot true --name "-[objc msgSend:]"
​
# 断点列表
breakpoint list
br l
​
# 断点删除
breakpoint delete xxx # index指明断点的序号,如果为空则删除所有断点
breakpoint delete xxx -f # 强制删除(不需要确认)
br del index
​
# 断点触发时自动执行下去
--auto-continue # 参数
(lldb) b CCCryptorCreate
Breakpoint 1: where = libcommonCrypto.dylib`CCCryptorCreate, address = 0x000000011047e1b7
(lldb) breakpoint modify --auto-continue true 1
(lldb) br list
Current breakpoints:
1: name = 'CCCryptorCreate', locations = 1, resolved = 1, hit count = 0 Options: enabled auto-continue 
  1.1: where = libcommonCrypto.dylib`CCCryptorCreate, address = 0x000000011047e1b7, resolved, hit count = 0 
(lldb) breakpoint command add -s python 1
Enter your Python command(s). Type 'DONE' to end.
    print "Hit this breakpoint!"
    DONE

# 跳过次数
-i <count> (--ignore -count <count>)
breakpoint set -F viewDidLoad -i 3

-o <boolean>只断住一次
breakpoint set -F viewDidLoad: -o yes

2、断点命令

命令名称 命令参样例
给某一个断点增加命令 breakpoint command add 1
查看所有断点命令 breakpoint command list
删除断点命令 breakpoint command delete 1
使某个断点命令生效/失效 breakpoint command enable/disable
给某一个断点增加命令 breakpoint command delete

3、查看堆栈,流程控制

查看当前所有堆栈 bt
返回上一步堆栈 up
查看某一条堆栈 frame select 1
查看当前堆栈的参数 frame variable
堆栈回滚到上一条 thread return
程序继续执行 c
单步下一步 n
进入下一个函数(方法) s
汇编级别的单步下一步 ni
汇编级别的进入下一个函数(方法) si

4、内存断点

命令名称 命令参样例 长长的标题3 title 4
直接观察一个变量 watchpoint set variable global_var
直接观察一个变量的地址 watchpoint set expression -- 0xxxxxx column 3
删除断点 watchpoint delete 1
使断点失效/生效 watchpoint disable/enable 2
查看所有断点 watchpoint list

5、 库文件image

命令名称 命令参样例
查看工程中使用的库(包括MachO自己) image list
查找可执行文件或共享库的原始地址 image lookup --address 0x0000000100000de0
输出NSURL的成员变量及属性信息 image lookup --type NSURL
导出可执行文件和共享库的所有符号表 image dump symtab

6. HOOK每个断点

命令名称 命令参样例
增加一个HOOK target stop-hook add -o "frame variable"
直接所有HOOK target stop-hook list
删除HOOK target stop-hook disable 1
使HOOK失效/生效 target stop-hook disable/enable 2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容