在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" 参考:http://www.dllhook.com/post/51.html

 

ios逆向过程中lldb调试技巧的更多相关文章

  1. ios逆向过程中lldb调试技巧-po篇

    假如你准备在模拟器里面运行这个,你可以在"(lldb)"提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面是默认的调试器.假如你正在 ...

  2. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  3. 背水一战 Windows 10 (21) - 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧

    [源码下载] 背水一战 Windows 10 (21) - 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧 作者:webabcd 介绍背水一战 Wind ...

  4. 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧

    背水一战 Windows 10 之 绑定 x:Bind 绑定 x:Bind 绑定之 x:Phase 使用绑定过程中的一些技巧 示例1.演示 x:Bind 绑定的相关知识点Bind/BindDemo.x ...

  5. 驰骋工作流引擎-CCMobile与安卓、IOS集成过程中的问题与解决方案

    CCMobile与安卓.IOS集成过程中的问题与解决方案 前言: CCMobile(2019版本)是CCFlow&JFlow 的一款移动端审批的产品.系统基于mui框架开发,是一款可以兼容An ...

  6. VS2010中的调试技巧

    作者: scottgu 这是我的博客中关于VS 2010和.NET 4发布系列的第二十六篇文章. 今天的博文将介绍Visual Studio中的一些实用调试技巧.这是受我朋友Scott Cate (他 ...

  7. Xcode - LLDB调试技巧

    LLDB是Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功倍. ...

  8. iOS 5个Xcode开发调试技巧

    转自Joywii的博客,原文:Four Tips for Debugging in XCode Like a Bro    1.Enable NSZombie Objects(开启僵尸对象) Enab ...

  9. Tomcat 使用过程中的一些技巧

    url中文地址乱码 原因: tomcat默认的在url传输时是用iso8859-1编码. 解决方案一: 在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDe ...

随机推荐

  1. H5读取本地文件操作

    H5读取本地文件操作 本文转自:转:http://hushicai.com/2014/03/29/html5-du-qu-ben-di-wen-jian.html感谢大神分享. 常见的语言比如php. ...

  2. 父(Spring)子(SpringMVC)容器之初解篇

    Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而在实际开发中,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但在实际项目中,我们经常会 ...

  3. css3变换,过度,动画实现梦幻网页

    html和css3一出,整个互联网设计发生了颠覆性的改变,各大IT企业也推出了很多新颖的设计,比如百度浏览器的下载首页,fullpage设计风格加css动画让网页看起来很流畅舒服. css3的变换有3 ...

  4. Selenium对浏览器支持的版本

    最新的selenium与几种常用浏览器的版本兼容情况: selenium 3.4.0 : Mozilla GeckoDriver 0.18  --  Firefox 53 - 56 Google Ch ...

  5. 自带win10的笔记本电脑如何装win7

    网上那么多的装机教程,还有必要专门写一篇装机攻略么?有的,非常必要的!因为真的有很多未知的坑要趟!首先,win10好不好?除了正版,其他没什么好的...如果没有SSD,经常要卡死于磁盘读写.当然,你可 ...

  6. 【PHP】打印输出var_dump+echo+print_r

    var_dump 判断一个变量的类型与长度如:<?$a = 1;$b = 't';echo var_dump($ta,$tb); // 结果为 int(123) string(3) " ...

  7. 蓝桥杯比赛javaB组练习《生日蜡烛》

    题目如下: 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...

  8. Tornado session 插件 pycket 定制时间和时间续租

    功能描述:10分钟用户没有任何操作,跳转到登录页面. 分析:这个功能用session就能实现(由于pycket 的session内容是存储在memcached或者redis里面的.所以,session ...

  9. CocoaPods详解之----制作篇【转】

    Cocoapods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自己的项目中的公共组件交由它去管理.Cocoapods的介绍及优点本文就不在赘述,我开始 ...

  10. hdu--2084--dp--数塔

    #include<iostream> #include<cstring> using namespace std; ; }; void dp(int,int); int n; ...