iOS逆向——带你深入了解LLDB调试

article/2025/10/17 0:17:29

写在前面

日常开发中经常会用到LLDB调试,可能用的最多的命令就是po,而在逆向领域中根本不可能让你在代码中下断点调试,于是乎LLDB就成了非常重要的手段

一、LLDB

LLDB(Low Lever Debug)的缩写,是默认内置于XCode的动态调试工具,它与LLVM编译器一起,存在于主窗口底部的控制台中,能够带给我们更丰富的流程控制和数据检测的调试功能

标准的LLDB提供了一组广泛的命令,旨在与老版本的GDB命令兼容。除了使用标准配置外,还可以很容易的自定义LLDB以满足实际需要

二、LLDB命令

1. LLDB语法

<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument[argument...]]
  • <command>(命令)和<subcommand>(子命令):LLDB调试命令的名称
  • <action>:执行命令的操作
  • <options>:命令选项
  • <arguement>:命令的参数
  • []:表示命令是可选的,可以有也可以没有

比如breakpoint set -n test

  • command:breakpoint表示断点命令
  • action:set表示设置断点
  • option:-n表示根据方法name设置断点
  • arguement:test表示方法名为test

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:834688868,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

如果你正在面试,或者正准备跳槽不妨动动小手,添加一下咱们的交流群:834688868来获取一份详细的大厂面试资料 为你的跳槽加薪多一份保障

2. LLDB初级使用

LLDB命令都是在进入LLDB状态(运行状态下点击“暂停符号”)才能使用生效的 [图片上传失败…(image-6ff20f-1634645644917)]

  • 查看断点列表
    • where是断点所在处
    • address是断点地址
    • option disable断点被禁用
(lldb) breakpoint list

  • 设置单个断点
// 设置c函数的断点
(lldb) breakpoint set -n cMethod
// 设置oc函数的断点
(lldb) breakpoint set -n "[ViewController ocMethod1]"
复制代码

  • 设置一组断点
(lldb) breakpoint set -n "[ViewController ocMethod1]" -n "[ViewController ocMethod2]" -n "[ViewController ocMethod3]"

  • 禁用/启用某一组断点
// 禁用
(lldb) breakpoint disable 1
// 启用
(lldb) breakpoint enable 1

  • 禁用/启用某一个断点
// 禁用
(lldb) breakpoint disable 1.1
// 启用
(lldb) breakpoint enable 1.1
复制代码

  • 删除所有断点
(lldb) breakpoint delete
复制代码

  • "删除"某一组断点(不能删除单个断点,只能禁用单个断点)
(lldb) breakpoint delete 1.1
复制代码

  • 设置某一个方法的断点
(lldb) breakpoint set --selector touchesBegan:withEvent:
复制代码

  • 设置某文件下某一个方法的断点
(lldb) breakpoint set --file ViewController.m --selector touchesBegan:withEvent:
复制代码

  • 设置所有匹配方法名的断点
(lldb) breakpoint set -r ocMethod
复制代码

  • 退出LLDB模式
(lldb) c
复制代码

  • 查看帮助
// 查看LLDB指令帮助
(lldb) breakpoint help
// 查看LLDB的breakpoint帮助
(lldb) breakpoint help
复制代码

3. LLDB初级使用小结

  • 手动打下的断点也会出现在LLDB的断点列表中,但LLDB的断点不会出现在Xcode的断点列表处
  • 手动打下的断点可以通过单击/长按来禁用/取消断点,也可以通过LLDB命令来操作,但LLDB下的断点只能通过LLDB来操作
  • 删除的断点虽然不在列表中,但是新增断点会从先前的断点之后排序
命令意义简写
breakpoint list查看断点列表breakpoint l
breakpoint set -n cMethod设置单个断点b -n cMethod
breakpoint set -n “[ViewController ocMethod1]”
-n “[ViewController ocMethod2]”设置一组断点b -n “[ViewController ocMethod1]”
-n “[ViewController ocMethod2]”
breakpoint set --selector touchesBegan:withEvent:设置某一个方法的断点b -selector touchesBegan:withEvent:
breakpoint set --file ViewController.m --selector touchesBegan:withEvent:设置某文件下某一个方法的断点b -f ViewController.m --selector touchesBegan:withEvent:
breakpoint set -r ocMethod设置所有匹配方法名的断点b -r ocMethod
breakpoint enable 1启用某一组断点breakpoint en 1
breakpoint disable 1禁用某一组断点breakpoint dis 1
breakpoint enable 1.1启用某一个断点breakpoint en 1.1
breakpoint disable 1.1禁用某一个断点breakpoint dis 1.1
breakpoint delete删除所有断点breakpoint d
continue退出LLDB模式c
next单步运行,将子函数当做整体一起执行n
stpe单步运行,将子函数当做整体一起执行s

关于简写:

  • bbreakpoint set
  • llist
  • -n--name
  • -f--file
  • disdisable
  • enenable

三、LLDB执行代码

前文中提到关于开发中最常用的po指令,在LLDB中并不是print -out的意思,其实是expression --object-

  • p:作为expression的缩写,意指表达执行的意思
  • o:则是object的缩写(通过help expression查看指令)
  • po:执行对象——输出该对象的信息

既然知道了p指令有执行代码的作用,接下来就来玩一下

  • 动态修改背景颜色(笔者在machOS 10.15.5+Xcode11上并不能成功)

    1. 进入手动断点(不要点击暂停符号,不然不能获取到self)
    2. 控制台输入p self.view.backgroundColor = [UIColor redColor];
    3. 过掉断点就能看到效果了
  • 动态创建对象并赋值

    1. 设置一个全局变量FXPerson *p
    2. 同样进入手动断点
    3. 控制台输入p self.p = [FXPerson new]; self.p.name = @"Felix";
    4. 查看效果

四、函数调用栈

接下来在以下代码中进行调试,点击屏幕依次调用testtest1test2,在test2处打下断点

- (void)testWithStr:(NSString *)str {NSLog(@"test");[self test1WithStr:str];
}- (void)test1WithStr:(NSString *)str {NSLog(@"test1");[self test2WithStr:str];
}- (void)test2WithStr:(NSString *)str {NSLog(@"test2");NSLog(@"%@", str);
}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {[self testWithStr:@"test"];
}
复制代码
  1. bt——查看函数调用栈,能够看到函数调用的顺序

  1. up/down——上下挪动函数调用

  1. frame select 数字——跳转函数调用(0表示当前方法,2表示2个方法前)

  1. frame variable——查看当前函数属性:内存地址、方法名、参数

  1. thread return——结束当前函数调用,跳转回上一个调用栈的下一步(当前是跳转回第30行代码,准备执行31行代码)

由此,可以尝试在调用中修改参数的值从而完成新值打印

  1. up修改已经调用过的函数参数
    • 使用up指令回到上一步,使用p str = @"F";进行修改

  • 过掉断点,还是打印原来的值

  1. 提前修改函数参数
    • 提前在上一处函数调用时打下断点进行修改

  • 过掉断点,新值被打印

总结:已经执行过的代码再怎么回滚也不能随意修改值,应当提前打下断点进行修改

五、内存断点

内存断点,顾名思义就是给内存下的断点

通过watchpoint set variable self->_p->_name就可以给对应的属性内存下断点

  • addr:内存地址
  • size:所占内存字节
  • state:当前是否可用

修改内存地址的值就会来到断点处(此时相当于KVO机制)同时也能看到函数调用栈

  • 内存断点也可以通过watchpoint list来查看内存断电列表
  • 也可以通过watchpoint delete进行删除

六、断点添加命令

类似于给程序添加脚本命令,断点执行也可以添加命令

  • 通过breakpoint command add 1就可以给指定断点添加命令
  • 通过DONE结束断点命令添加

断点到来时就会执行先前的命令了

七、target stop-hook

target stop-hook是一个给所有断点添加命令的指令——在每次stop的时候去执行一些命令(只对breakpoint、watchpoint有效)
image.png

只要target stop-hook add操作一番,任何断点都会触发添加的命令

单条命令可以简写成target stop-hook add -o "frame variable"-o表示单条命令)

同样的,也可以使用target stop-hook list查看列表

target stop-hook disable进行禁用

target stop-hook delete/undisplay 1进行禁用

接下来介绍一个高阶的操作
复制代码

LLDB启动的时候就会去加载一个叫做.lldbinit的文件,在/Users/用户名目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u9jXukQO-1634648238703)(https://upload-images.jianshu.io/upload_images/23620676-f2ca245c88fbd2c4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

如果没有的话可以通过vi .lldbinit创建,然后在文件中添加命令target stop-hook add -o "frame variable"

重新启动运行Xcode.lldbinit文件中的命令就会被加载,是个很方便的调试手段!

八、ASLR

ASLR(Address space layout randomization)全称叫做地址空间配置随机加载,是一种防范内存损坏漏洞被利用的计算机安全技术,在各大平台都有应用

ASLR通过随机放置进程关键数据区域的地址空间来防止攻击者能可靠地跳转到内存的特定位置来利用函数

说得简单易懂些就是物理地址 = ASLR + 虚拟地址

接下来通过实例来了解一下这个家伙吧

- (void)fxTest {NSLog(@"%s", __func__);
}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {[self fxTest];
}
复制代码

cmd+B编译生成MachO文件,使用Hopper打开,找到fxTest方法

此时拿到了“内存地址”就可以打下内存断点来进行调试了,其实0x1340只是个虚拟地址——只是相对于MachO文件的偏移地址(前面的1表示空段,对地址没有任何影响)

刚才说了物理地址 = ASLR + 虚拟地址,那么此时的ASLR又是多少呢?

通过image list就可以打印出来——0x000000010301e000就是这个进程的ASLR(看过dlyd源码就知道每次运行这个ASLR值都不相同)

实际地址 = 0x000000010ae85000 + 0x1340 = 0x10AE86340

写在后面

LLDB这些指令如同Xcode的快捷键一般,不掌握也无妨,掌握了就是锦上添花,多了一种调试的思路,便能让你拉开与同行之间的差距

作者:我是好宝宝
链接:https://juejin.cn/post/6847902223926722573


http://chatgpt.dhexx.cn/article/lQgpsZkm.shtml

相关文章

ios逆向小记

ios逆向小记 定位关键点 抓包 利用charles进行抓包来定位一些关键字符串&#xff0c;其中抓包配置如下&#xff1a; reveal reveal分析图层界面&#xff0c;找到图层所属类&#xff0c;利用frida-trace hook该类进行栈回溯确定关键点&#xff0c;同时可以通过图层类名称来推…

iOS逆向 和班尼特福迪一起攻克难关(unity)

Getting Over It这款游戏发布都五年了&#xff0c;热度也不是那么低&#xff0c;我寻思怎么就没人折腾iOS的goi呢&#xff0c;改个重力啥的我到现在都没发现。。 项目地址 dnSpy il2cppdumper IDA Pro 汇编码转机器码工具 密码:i36p 先从安卓goi里面拿到Assembly-CSharp.dl…

IOS逆向需用到的工具汇总

1、Mac 上自带的一些命令工具 file&#xff1a;查看Mach-O的文件类型 file 文件路径 otool&#xff1a;查看Mach-O特定部分和段的内容 otool -L Mach-O文件 # 查看当前 Mach-O 文件的动态链接库。 lipo&#xff1a;常用于多架构Mach-O文件的处理 查看架构信息&#xff1a;lip…

IOS 逆向分析基础篇

一、环境准备 已经越狱的IOS手机一台&#xff0c;如果使用的是Windows笔记本另外需要mac 虚拟机 1、IOS 手机越狱及环境配置 IOS12.0 以前版本&#xff0c;可以用impactor 写入签名&#xff0c;安装越狱IPA包 IOS 12以上版本&#xff0c;并小于IOS12.1.2&#xff0c;此时需要…

IOS逆向-LLVM、代码混淆

LLVM、代码混淆 1 LLVM1.1 传统编译架构1.2 LLVM的编译架构1.3 Clang1.3.1 什么是Clang1.3.2 Clang与LLVM 2. OC源文件的编译过程2.1 编译过程和预编译2.2 词法分析2.3 语法树-AST2.4中间代码&#xff08;LLVM IR&#xff09; 3. LLVM源码3.1 LLVM的源码下载3.2 源码编译3.2.1 …

【iOS逆向与安全】frida-trace入门

前言 frida-trace是一个用于动态跟踪函数调用的工具。支持android和ios。安装教程请参考官网。工欲善其事必先利其器。本文将以某App为示范&#xff0c;演示frida-trace的各种方法在iOS中的应用。 一、目标 让看文章的你在使用frida-trace时更得心应手。 二、工具 mac系统f…

iOS逆向之某茅台App抓包

阅读此文档的过程中遇到任何问题&#xff0c;请关注公众号移动端Android和iOS开发技术分享或加QQ群309580013 1.目标 由于某茅台App有抓包检测&#xff0c;无法直接使用charles等工具抓包。本文的目的自然就是如何修改源码并抓任意接口 2.依赖环境 frida-ios-dump&#xff1…

【iOS逆向与安全】iOS插件开发入门

前言 经过之前的学习&#xff0c;相信你已经能熟练的使用Frida-trace、IDA Pro等逆向工具。不过&#xff0c;仅仅到这肯定是不够的。接下来&#xff0c;学会把你逆向的结果打包成插件并运行&#xff0c;那iOS逆向&#xff0c;你也就真正的入门了。 一、目标 把逆向的结果制作成…

iOS逆向工程开发技巧

1. 将xib文件转成nib文件 ibtool --errors --warnings --output-format human-readable-text --compile ~/Desktop/001.nib ~/Desktop/HWTipsView.xib 2. 给framework添加指令集合并 lipo -create [地址&#xff1a;name1.framework/name1] [地址&#xff1a;name2.framewor…

iOS逆向动态调试

1.拷贝越狱手机/Developer/usr/bin目录下的debugserver到Mac电脑&#xff0c;在mac端输入 scp -P 2222 rootlocalhost:/Developer/usr/bin/debugserver ~/debugserver2.对debugserver进行瘦身(iOS11可以不用瘦身,因为只支持64位构架的程序)&#xff0c;在debugserver所在目录输…

ios逆向学习环境安装(一)

1、Xcode 历届版本&#xff1a;https://developer.apple.com/documentation/xcode-release-notes AppStore中搜并安装XCode & 在网页下载https://developer.apple.com/xcode 2、class-dump class-dump&#xff0c;是可以把Objective-C运行时的声明的信息导出来的工具。其实…

ios android 逆向 对比,iOS逆向开发--APP重签名

签名原理 在非越狱手机上要调试一个三方的APP&#xff0c;我们首先要对其重签名&#xff0c;跑在我们的手机上&#xff0c;我们才能对其进行进一步的动态和静态调试 要对一个APP包进行重签名&#xff0c;要有一个越狱的APP包&#xff0c;这个可以去PP助手上下载&#xff0c;也可…

IOS逆向-抓帧分析

背景 分析图形学、游戏等的时候&#xff0c;很多时候需要抓帧分析 步骤 动态调试APP点击 点击FPS&#xff0c;触发渲染&#xff0c;查看面板是否有数据点击&#x1f4f7;按钮&#xff0c;触发渲染再次点击&#x1f4f7;按钮&#xff0c;结束抓帧 问题 FPS数据面板没有数据…

IOS逆向-动态调试

文章目录 LLDBXcode重新签名版本调试(手动) ✅重新签名版本调试(自动)不重新签名版本调试 LLDB Xcode -> Attach -> 点击 || 按钮 -> 使用lldb终端 手机/Developer/usr/bin/debugserver localhost:2233 /var/containers/Bundle/Application/*/*/xxxx电脑 lldb -> …

IOS逆向初探

前言 这些文章用于记录学习路上的点点滴滴&#xff0c;也希望能给到刚入门的小伙伴们一点帮助。爱而所向&#xff0c;不负所心。 环境 iphone 6 MacOS Monterey 12.3.1 一、IOS开发语言 Objective-C Objective-C是iOS操作系统运用的软件开发语言。Objective-C的流行完全是因…

移动App入侵与逆向破解技术-iOS篇

如果您有耐心看完这篇文章,您将懂得如何着手进行app的分析、追踪、注入等实用的破解技术,另外,通过“入侵”,将帮助您理解如何规避常见的安全漏洞,文章大纲: 简单介绍ios二进制文件结构与入侵的原理介绍入侵常用的工具和方法,包括pc端和手机端讲解黑客技术中的静态分析和…

C#应用程序与MATLAB联合编程

本文主要结合C#编写应用程序方便强大和MATLAB在工业科学界的广泛应用&#xff0c;结合两者的优点&#xff0c;利用C#编写的windows桌面应用程序作为UI交互接收用户配置&#xff0c;并根据用户在前端应用界面的操作自动控制MATLAB运行&#xff0c;并将MATLAB计算的结果返回桌面应…

编程输出中文变问号的解决办法

问题是出现在windows的dos显示设置上。 如何解决这个问题&#xff1f; 1.打开运行&#xff0c;输入cmd&#xff1b; 2.界面顶部右键&#xff0c;option中选择默认值&#xff1b; 3.将437&#xff08;OEM-美国&#xff09;改为936&#xff08;ANSI/OEM-简体中文GBK&#xff09; …

Python入门(二)-编程环境

本章重点介绍 Python 编程环境的搭建&#xff0c;包括各个平台下 Python 的下载和安装&#xff0c;常见 IDE 的使用&#xff0c;如何运行 Python 程序等。我还会亲自带着大家编写并运行第一个 Python 程序&#xff0c;让大家认识一下最简单的 Python 代码。 本章的后半部分还介…

数模混合信号建模语言Verilog-AMS

混合信号建模语言Verilog-AMS 很多人做模拟电路的朋友&#xff0c;都希望有一款“模拟FPGA”&#xff0c;希望有一个“模拟的Verilog”&#xff0c;但现实是没有“模拟的Verilog”只有混合信号建模语言-Verilog-AMS&#xff0c;今天就简单介绍一下-Verilog-AMS。 为了便于物理系…