LLDB调试详解--逆向开发
一、前言
今天讲述在苹果日常开发中一个装逼神器LLDB,是Xcode内置的动态调试工具. 在iOS系统程序开发中,会经常需要代码调试的追踪, 最常用的也是LLDB(low level debugger) .LLDB能更好的辅助开发者通过各种手段如修改变量进行测试,甚至能协助开发同学来定位bug.
LLDB是新一代高性能的调试器, 也是Mac OSX上Xcode的默认调试器, 支持在桌面和iOS设备模拟器上调试C,OC和C++以及Swift.
二、帮助
LLDB命令的格式如下:
- <命令名称> <命令动作> [-可选项 [可选项的值]] [参数1 [参数2...]]
LLDB命令是由各部分空格分割, 如果参数是包含空格, 则需要双引号括起参数,如果参数本身中包含双引号或反斜杠, 就需要使用反斜杠来进行转义.
LLDB命令是非常多的, 完全记录下来是不可能的, 而且还没有必要. 可以利用help命令查看相关LLDB命令的用法.如下:
三、LLDB常见命令
3.1 breakpoint指令
示例Demo1
- func test1(str: String) {
- self.test2(str: str)
- }
- func test2(str: String) {
- self.test3(str: str)
- }
- func test3(str: String) {
- print(str)
- }
- override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
- self.test1(str: "zxy")
- }
通过breakpoint set -n 某函数名,来给某函数设置断点
通过breakpoint list 打印出断点列表
如果想一次性来设置多个断点,也可以使用命令
breakpoint set -n 某函数名, -n 某函数名, -n 某函数名……
但是这样设置就会将这几个断点设置为一组,与上面不一样,一个个设置的.
breakpoint delete来删除所有上次设置的断点
breakpoint disable 断点Id: 将设置过的断点禁用,再次打印出breakpoint list 发现断点式disable的
breakpoint set -r “字符串” 会遍历整个工程,只要含该字符串的方法、函数都会下断点
breakpoint set -f 类名 -l 断点行数 会给该类名的具体行数加断点
breakpoint set -file 类名 --selector 方法名 会给该类名的具体方法加断点
breakpoint command add 标号 :断点之后执行相应命令,以Done结束,类似于Edit breakpoint
总结如下:
3.2 流程控制
在Xcode调试Debugger时,经常有看到界面
对应的解释和意义如下图:
对应的命令如下
3.3 打印命令
p语句: 动态执行语句,可以查看基本数据的类型值, 如果用p命令查看的是对象的话, 只会返回对象的指针地址, p后面可以接变量、常量还可以接表达式
po语句: 打印对象的desc信息, 打印对象.
p和po的区别在于po会输出对应的值, p会返回返回值的类型及命令结果的引用名
expression语句: 和p语句意思是一样的
上面有&0,&1这样的符号,是指对象的一个引用. 在控制台上可以用这个符号来操作对应的对象.
示例2
- -(NSMutableArray<Person *> *)models{
- if (!_models) {
- //arrayWithCapacity 节约内存。容量就是真实的内存中占用的大小。
- _models = [NSMutableArray array];
- }
- return _models;
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- Person * p1 = [[Person alloc] init];
- p1.name = @"one";
- p1.age = ;
- Person * p2 = [[Person alloc] init];
- p2.name = @"two";
- p2.age = ;
- Person * p3 = [[Person alloc] init];
- p3.name = @"three";
- p3.age = ;
- [self.models addObject:p1];
- [self.models addObject:p2];
- [self.models addObject:p3];
- }
3.4 frame、bt、 up、 down
frame select 断点排序值
frame variable :查看参数
bt:查看堆栈
再看示例1,点击test1,test2,test3 。对test1设置断点
可以通过up和down命令来查看步骤
up:向上查看
down:向下查看
3.5 thread、target
thread info: 输出当前的线程
thread return :不再执行下面的代码
target stop-hook add -o "frame variable": 断点进入之后做的操作,这里是打印参数
3.6 image指令
image lookup -address 查找崩溃信息
image lookup -name 查看方法的来源
image lookup -type 查看成员,可以查看某个类class的所有成员变量以及属性
总结图如下:
四、ASLR
4.1 概述
ASLR(Address space layout randomization) 是一种针对缓冲区溢出的安全保护技术,通过对栈、堆、共享库映射等线性区布局的随机化,通过增加攻击者预测目的预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到组织溢出攻击的目的。
ASLR并不是苹果Mac与iOS特有的,其他主流的操作系统也已经实现了ASLR。
4.2 讲解
4.2.1 demo1代码
- - (void)viewDidLoad {
- [super viewDidLoad];
- }
- - (void)eatWithObjc:(NSString *)objc {
- NSLog(@"吃到了%@",objc);
- }
- - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
- [self eatWithObjc:@"小蘑菇炖鸡"];
- }
- @end
运行App,然后利用Hopper disassembler v4查看eatWithObjc()函数的文件地址
然后打开MachOView查看可执行文件,pagezero为MachO首地址
通过image list 查看功能模块的地址,第一个为MachO地址
然后我们讲解一下内容,基本概念
4.2.2 demo2代码
将断点断在a = 20,下面找一下全局变量放的位置。打印全局常量a在内存中的地址,以及MachO可执行文件的地址
将两个地址相减,得到文件的偏移地址。0x0000000106ce8db0 - 0x0000000106ce5000 = 0x3DB0
然后打开MachOView查看
全局常量为10,找到MachOView的offset为0x3DB0,看Data LO为10,完美。
过掉断点,发现a = 20了,再次查看内容,发现也已经为20
五、Cycript
Cycript 是由Cydia创始人Saurik推出的一款脚本语言,其混合了OC、JavaScript语法的解释器,也就意味着可以在一个命令中使用OC或者JavaScript,甚至两者并用,能够挂钩正在运行的进程,能够在运行时修改很多东西。
提到解释器,我们来普及两个概念
高级语言分为两个部分,解释型语言和编译型语言
解释型语言:Python:直接将源代码放进内存里面
编译型语言:OC:将源代码编译成可执行文件,运行在设备上
总结
LLDB功能是非常强大的, 上面仅仅是介绍了一些简单常用的命令, 还可以做进一步的探索. 下一篇我们将继续讲述LLDB的高级用法的操作, 使用LLDB操作指令可是开发装逼的一种神器, 快使用起来吧. 希望本篇博客对大家理解使用LLDB有所帮助,如果觉得还不错,给个点赞撒!!!
LLDB调试详解--逆向开发的更多相关文章
- MachO文件详解--逆向开发
今天是逆向开发的第5天内容--MachO文件(Mac 和 iOS 平台可执行的文件),在逆向开发中是比较重要的,下面我们着重讲解一下MachO文件的基本内容和使用. 一.MachO概述 1. 概述 M ...
- [转]javascript console 函数详解 js开发调试的利器
javascript console 函数详解 js开发调试的利器 分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...
- Intellij IDEA中使用Debug调试详解
转载:https://www.linuxidc.com/Linux/2017-09/146772.htm Intellij IDEA中使用Debug调试详解 Debug用来追踪代码的运行流程,通常 ...
- 详解LUA开发工具及其环境配置
LUA开发工具及其环境配置是本文要介绍的内容,主要是来了解并学习lua开发工具的使用和环境的配置,第一次接触LUA的话,就跟本人一起学习吧.看我能不能忽悠到你. LUA是语言,那么一定有编写的工具.第 ...
- Linux Bash命令关于程序调试详解
转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...
- 详解iOS开发之自定义View
iOS开发之自定义View是本文要将介绍的内容,iOS SDK中的View是UIView,我们可以很方便的自定义一个View.创建一个 Window-based Application程序,在其中添加 ...
- Java-异常机制详解以及开发时异常设计的原则要求
Java-异常机制详解以及开发时异常设计的原则要求 http://blog.csdn.net/Jack__Frost/article/details/52760930?locationNum=6
- 2019-11-29-VisualStudio-断点调试详解
原文:2019-11-29-VisualStudio-断点调试详解 title author date CreateTime categories VisualStudio 断点调试详解 lindex ...
- 超全详解Java开发环境搭建
摘自:https://www.cnblogs.com/wangjiming/p/11278577.html 超全详解Java开发环境搭建 在项目产品开发中,开发环境搭建是软件开发的首要阶段,也是必 ...
随机推荐
- 推荐一款现代化的脚手架项目《hope-boot》
简介: > 一款现代化的脚手架项目.企业开发?接外包?赚外快?还是学习?这都能满足你,居家必备,值得拥有
- python中基本运算符
基本运算符 a // b 取整 a % b 取余 a ** b a 的b次方 a == b 判断运算符左右两边值是否相等 a != b 判断运算符左右两边值是否不等 a > b a >= ...
- js如何展示上传的图片
前言:本文章主要讲的是上传的图片如何展示在页面上. 一般来说,我们会先将本地图片上传到服务器,上传成功后,由后台返回图片的网络地址再在前端显示.但是,我今天讲的是不通过前面说的过程,而是直接使用js将 ...
- vi文本编辑器命令
基本上 vi 共分为三种模式,分别是『一般模式』.『编辑模式』与『指令列命令模式』. 这三种模式的作用分别是: 一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式).在这个模式中, ...
- [考试反思]1007csp-s模拟测试63:朦胧
别找了原来没有写过叫<朦胧>的我check过了.(慌的一匹) 总算是比较早的改完了一套题. 但是考的是个啥啊... 前两道题都很卡常导致我想到了正解但是都放弃了. 2e8的复杂度怎么可能能 ...
- CSPS模拟 100
我又挂分了T_T 这么吉利的数字..本来想考的好一点的 T1 没加当前弧优化(其实也不会),若志了 各种低错连篇而且没想到点不联通..没有奇度点就直接从1开始搜了 于是喜提70(犯了这两个若志错误应该 ...
- Function题解
这个题最优策略一定是向左上走到某一列再往上一直走. n*q在线暴力可做,离线按y排序,单调栈维护凸壳. 具体来说:对于i<j若A[i]>A[j] 即j的斜率小而且纵截距小,一定比i优,并且 ...
- P3128 [USACO15DEC]最大流
秒切树上查分....(最近一次集训理解的东西) 但是,我敲了半小时才切掉这道题.... 我一直迷在了“边差分”和“点差分”的区别上. 所以,先说一下此题,再说一下区别. 首先,想到差分很容易. 然后, ...
- GO 基础学习笔记(1) | 简介
一.官网查看系列 Golang官网:https://golang.org/ Golang中文网:https://studygolang.com/(推荐) 项目学习网站: https://gowalke ...
- MySQL系列:一句SQL,MySQL是怎么工作的?
对于MySQL而言,其实分为客户端与服务端. 服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端. 客户端,负责发送请求到服务端并从服 ...