Xcode断点命令lldb调试技巧

在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便

一般的命令:

1、image list -o -f 看看各个模块在内存中的基址

2、register read r0 读取寄存器r0的值。register read 读取所有寄存器的值

3、expression(或者缩写expr) 表达式

     例子:

     expression $r6 = 1   // 设置r6寄存器的值

     expression $r6       // 查看r6寄存器的值

     expression username(源代码中变量) = @"11111"

     expression [self btnTest]     // 调用某类某方法

4、po 表达式

    例子:

    po $r6

    po username

    po [[NSString alloc] initWithData:$r2 encoding:4]   // 打印$r2寄存器的明文数据

    po [$r5 base64EncodedStringWithOptions:0];          // 打印$r5寄存器(NSData)类型的base64明文数据

5、print (type)表达式

     例子:

     print (int)$r6

     print username

6、bt [all] --- 打印调用堆栈

     例子:

     bt

    返回如下:

 * thread #1: tid = 0x1ee09, 0x00035e80 debug`-[ViewController loginWithUserName:password:](self=0x15d7be60, _cmd=0x00036441, username=0x15db0120, password=0x0003768c) + 168 at ViewController.m:34, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1

  * frame #0: 0x00035e80 debug`-[ViewController loginWithUserName:password:](self=0x15d7be60, _cmd=0x00036441, username=0x15db0120, password=0x0003768c) + 168 at ViewController.m:34

7、breakpoint list //打印断点列表

    例子:br l

8、s 源码级别单步执行,遇到子函数则进入

9、si 单步执行,遇到子函数则进入

10、n 源码级别单步执行,遇到子函数不进入,直接步过

11、ni 单步执行,遇到子函数不进入,直接步过

12、finish/f 退出子函数

13、thread list 打印线程列表

14、image lookup -a 表达式、image list

      例子:

     image lookup -a $pc

     返回如下:

      Address: debug[0x0000b236] (debug.__TEXT.__text + 1254)

      Summary: debug`main + 58 at main.m:16

15、查找某个函数:

      对于有调试符号的这样使用

      image lookup -r -n <FUNC_REGEX>

      对于无调试符号的这样使用:

      image lookup -r -s <FUNC_REGEX>

16、disassemble(简写di) -a 地址

      disassemble -A thumb    

      可选:

      thumbv4t

      thumbv5

      thumbv5e

      等等一系列

17、memory read(简写x) [起始地址 结束地址]/寄存器 -outfile 输出路径

 (lldb) memory read -f s $x1
 或者
 (lldb) x -f s $x1
(lldb) x -f A $sp $fp
 sp是上级函数即调用者的堆栈首地址,fp是上级函数的堆栈结束地址,所以根据sp和fp就可以一级一级得出调用关系

( lldb ) memory read –format x –size 4 0xbffff3c0

 以16进制格式显示0xbffff3c0开始的内存数据,数据是4个字节为一个单位的

(lldb)memory read –outfile /tmp/mem.bin –binary 0x1000 0x1200

 把0x100 到 0x1200的内存数据输出到文件 

18、内存断点 watchpoint set expression 地址 / watchpoint set variable 变量名称 -- (源码调试用到,略过)

      例子:

      watchpoint set expression 0x1457fa70

     命中后得到结果:

     Watchpoint 3 hit:

     old value: 3

     new value: 4

18.1、内存访问断点 watchpoint set expression -w read -- 内存地址

     watchpoint set expression -w read -- 0x16b9dd91

18.2、内存写入断点 watchpoint set expression -w write -- 内存地址

     watchpoint set expression -w read -- 0x16b9dd91

18.3、条件断点 watchpoint modify -c 表达式

     例子:

     watchpoint modify -c '*(int *)0x1457fa70 == 20'

     命中后得到结果:

     Watchpoint 3 hit:

     old value: 15

     new value: 20

19、找按钮事件 po [按钮名称/内存地址 allTargets]

     例子:

    (lldb) po [[self btnTest] allTargets]
    {(
        <ViewController: 0x166af1f0>
    )}

  (lldb) po [[self btnTest] actionsForTarget:(id)0x166af1f0 forControlEvent:0]
   <__NSArrayM 0x165b8950>(
  testAction:
  )

Bash
// 在机器上实战一下:
(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow:
 0x15e771c0; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 
0x15e96210>; layer = <UIWindowLayer: 0x15e988e0>>
   | <UIView: 0x15eb4180; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x15eb4300>>
  
 |    | <UIButton: 0x15eb32d0; frame = (277 285; 46 30); opaque = NO;
 autoresize = RM+BM; layer = <CALayer: 0x15eb2e30>>
   |    
|    | <UIButtonLabel: 0x15db5220; frame = (0 6; 46 18); text = 
'Button'; opaque = NO; userInteractionEnabled = NO; layer = 
<_UILabelLayer: 0x15db5410>>
   |    | <_UILayoutGuide: 0x15eb4360; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x15eb4540>>
   |    | <_UILayoutGuide: 0x15eb4af0; frame = (0 568; 0 0); hidden = YES; layer = <CALayer: 0x15eb4b70>>

(lldb) po [(UIButton *)0x15eb32d0 allTargets]
{(
    <ViewController: 0x15e93250>
)}

(lldb) po [(UIButton *)0x15eb32d0 allTargets]
{(
    <ViewController: 0x15e93250>
)}

(lldb) po [(UIButton *)0x15eb32d0 actionsForTarget:(id)0x15e93250 forControlEvent:0]
<__NSArrayM 0x15dbfc50>(
testAction:
)
// 调用--
(lldb) po [0x15e93250 testAction:nil]
0x00210c18
 // 再来一发,对按钮属性操作

Bash
(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow: 0x15e771c0; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x15e96210>; layer = <UIWindowLayer: 0x15e988e0>>
   | <UIView: 0x15eb4180; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x15eb4300>>
   |    | <UIButton: 0x15eb32d0; frame = (277 285; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x15eb2e30>>
   |    |    | <UIButtonLabel: 0x15db5220; frame = (0 6; 46 18); text = 'Button'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x15db5410>>
   |    | <_UILayoutGuide: 0x15eb4360; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x15eb4540>>
   |    | <_UILayoutGuide: 0x15eb4af0; frame = (0 568; 0 0); hidden = YES; layer = <CALayer: 0x15eb4b70>>

(lldb) expression UIButton *$btn = (UIButton *)0x15eb32d0
(lldb) expression [$btn setHidden:YES]

20、std::string 读取方式:从内存+8的地方开始 64bit自行变通

    例:

    Bash
(lldb) x $r0+8      
0x02db9248: 20 82 e3 14 71 00 00 00 61 00 00 00 c0 82 d3 14   .惝q...a...喇赢
0x02db9258: 71 00 00 00 2b 00 00 00 20 f9 e6 14 61 00 00 00  q...+... .a...
(lldb) x/s 0x14e38220
0x14e38220: "hello!piaoyun"

转载自-ios逆向过程中lldb调试技巧

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

推荐阅读更多精彩内容

  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1阅读 954评论 0 4
  • 相信大家肯定都有过为了调试而添加打印变量,或者使用直接常量代替函数调用结果,或者更改判断条件以进入某特定分支的调试...
    纵横而乐阅读 1,949评论 0 3
  • [转]浅谈LLDB调试器文章来源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc阅读 2,487评论 2 6
  • Xcode Debugging 你的代码,或者任何人的代码中总会有bug存在,你可以把调试看做是更好地理解代码的一...
    吃蘑菇De大灰狼阅读 2,441评论 0 2
  • 带给我们太多治愈的你 穿条纹的你 总感觉我们心有灵犀 你的照片 能表现出我所有的喜怒哀乐 真的很感谢 生日快乐 知...
    WoodSage阅读 349评论 0 1