ios逆向过程中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 [起始地址 结束地址]/寄存器 -outfile 输出路径

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

 

时间: 2024-12-14 17:43:31

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

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

假如你准备在模拟器里面运行这个,你可以在"(lldb)"提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面是默认的调试器.假如你正在使用老一点版本的xcode的话,你又GDB调试器.他们有一些基本的相同的命令,因此假如你的xcode使用的是"(gdb)"提示,而不是"(lldb)"提示的话,你也能够更随一起做,而没有问题. "po"命令是"print object&qu

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

CCMobile与安卓.IOS集成过程中的问题与解决方案 前言: CCMobile(2019版本)是CCFlow&JFlow 的一款移动端审批的产品.系统基于mui框架开发,是一款可以兼容Android与IOS的移动端工作流审批系统.由于CCMobile仅仅局限于移动端的流程审批,所以在其他办公功能方面很少,这时可能就需要在源码上开发或者与其他APP进行集成. 由于Mui是一款h5的框架,并不是原生的,所以在与原生APP集成时,会出现一些问题,主要集中在附件上传下载.屏幕兼容等.本文章,将具体描

iOS中教你快速掌握LLDB调试技巧

摘要 LLDB是Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功倍. LLDB控制台 Xcode中内嵌了LLDB控制台,在Xcode中代码的下方,我们可以看到LLDB控制台. LLDB控制台平时会输出一些log信息.如果我们想输入命令调试,必须让程序进入暂停状态.让程序进入暂停状态的方式主要有2种: 1. 断点或者watchpoint: 在代码中设置一个断点(w

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

两种最常见最普通的方法: 1.NSLog,最简单的方法,查看变结 中是否有值,有什么值,是不是自己需要的值,然后找到bug. 2.po命令,在程序进入断点处,在控制台中输入po 变量名,也可以像NSLog一样查看变量是否有值,有什么值. 今天主要介绍点高大上的方法. 一.Memory Graph Xcode8新增:Memory Graph解决闭包引用循环问题 这个时候就进入了断点模式,可以查看issue面板,注意选择右边Runtime: 有很多叹号说明就有问题了.看内存中object的名字,有一

第二十九篇:USER MODE DLL开发过程中的调试技巧心得分享

最近由于项目需要,被老板安排开发一个WINDOWS USER MODE DLL, 即WINDOWS用户模式下的动态链接库. 写代码,实现具体的功能这类初等工作,对于大多数软件开发工程师来讲,只是时间与工作量上的问题,具体的WINDOWS DLL的知识点,本人参考了Jeffrey Richter的<WINDOWS核心编程>中的DLL几章,不再熬述. 这里谈一下关于USER MODE DLL在调试过程中所涉及到的一些知识点,以及它们彼此之间的关系: 1. DebugBreak / int 3; 2

Tomcat 使用过程中的一些技巧

url中文地址乱码 原因: tomcat默认的在url传输时是用iso8859-1编码. 解决方案一: 在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDecode来传输,使用这种方式就是把中文转换成以%开头的编码在url中传输. 使用这种方法时,要注意两点. 1.前台使用urlencode,在后台相应的使用urldecode. 2.使用urlencode的内容是参数内空.千万要注意,他是会把等于号等符号也给转换了.所以,最好是先把参数传换后再进行拼接

ios 编译过程中碰到std::ios_base::Init::~Init()错误的问题解决方法

转载自:http://wicrewoft.blog.51cto.com/210706/1236005 原作者:范国锋 标签:libstdc++.6.dylib 如果遇到下面这个问题是因为引用的c++库不正确导致,xcode 6.1版本需要引用 libstdc++.6.dylib才能解决问题. Undefined symbols for architecture armv6:"std::ios_base::Init::~Init()", referenced from:  ___tcf_

scrapy爬虫编写过程中的小技巧

小工具: 关于网页代码中意向信息的查找可以借助几个工具: 第一个——Firefox插件Firebug. 第二个——Firefox插件XPath.可以快速的在网页中对xpath表达式的正确性进行验证. 第三个——scrapy shell.关于其使用可以查看教程.

iOS开发调试技巧总结(持续更新中)

作者:乞力马扎罗的雪  原文 对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的调试,有同性也有个性.今天我们就来学习一下iOS开发中的调试技巧,语言暂用为OC,IDE当然是强大的Xcode.首先说明下,Xcode已经为我们调试项目提供了极大的方便. [1.普通断点] 断点(Breakpoint)绝对是调试程序的第一大选择,也是掌握的基础技能.顾名