news 2026/2/26 0:02:59

新手小白也能看懂的LLDB技巧/逆向技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
新手小白也能看懂的LLDB技巧/逆向技巧

续更新,最新内容也可以在公众号「非专业程序员Ping」一起交流!!

一、工欲善其事,必先利其器

在开始之前,需要先了解两个常用的逆向工具:Hopper 和 IDA。具体安装和使用我们也有专门的文章介绍:常见逆向工具使用。

一般而言我们都是结合两个工具一起看,IDA 的反汇编通常比 Hopper 还原度更高,所以我们主用的还是IDA。

二、查找二进制文件路径

分析的第一步,肯定是找到我们想要分析的入口函数,以CoreText中的字体级联/Font Fallback机制这篇文章的Case为例子,我们要研究的是 CTFontCopyDefaultCascadeListForLanguages 的实现,我们可以在LLDB中通过如下命令找到该符号所在库:

image lookup -rn CTFontCopyDefaultCascadeListForLanguages

在这里插入图片描述

通过这个命令我们可以得到两个信息:

1)CTFontCopyDefaultCascadeListForLanguages 在CoreText库中

2)CoreText 二进制文件的路径

得到路径之后,在访达中可以通过快捷键 Command + Shift + G 可以快速跳转到位置,得到CoreText的二进制文件:

在这里插入图片描述

三、善用AI

得到CoreText的二进制文件之后,我们通过IDA进行反汇编。

之后将 CTFontCopyDefaultCascadeListForLanguages 的主要调用逻辑Copy到单独的文件夹:

在这里插入图片描述

在AI没普及之前,我们一般是结合LLDB硬着头皮逐行分析,有了AI之后,我们可以直接将整个文件夹扔给AI(比如Cursor、GPT等),让AI给我们梳理流程、逐行注释,输出调用流程图等。

如下,是AI生成的函数调用流程;结合AI的逻辑梳理和注释,我们对 CTFontCopyDefaultCascadeListForLanguages 的整体逻辑会有一个大致的理解。

在这里插入图片描述

当然,AI也不是全能的,一些逻辑AI也只是猜测甚至乱说😩,具体的细节还需要我们结合LLDB、IDA一起分析,只是说有了AI之后,可以大大加快我们的分析效率。

下面我们将列举几个典型例子,我们日常分析中能遇到的也基本就这些。

四、典型例子

4.1 函数调用

不管是面向对象,还是面向过程,在汇编的世界里,程序逻辑都是由一个一个独立的函数调用组成的;对函数而言,最重要的就是它的输入输出,基本上我们只要读懂了每个函数的输入输出是什么,那我们就能理解整体的逻辑。

函数入参与返回值,按照数据类型不同可以总结为下面的表格:我们最常接触的,其实只有前两项

在这里插入图片描述

举个🌰:

1)整数/指针类型

// 以如下调用为例

let ctFont = UIFont.systemFont(ofSize: 18)

let languages = ["zh-HK", "zh-Hans"]

CTFontCopyDefaultCascadeListForLanguages(ctFont, languages as CFArray)

入参 返回值

在这里插入图片描述 在这里插入图片描述

2)浮点数类型

// 以getArea为例

class ViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

let area = getArea(frame: self.view.frame)

print(area)

}

func getArea(frame: CGRect) -> CGFloat {

return frame.width * frame.height

}

}

入参 返回值

在这里插入图片描述 在这里插入图片描述

4.2 怎么确定一段地址的含义

还是以举一个实际例子,在CoreText中的字体级联/Font Fallback机制文章中,我们要分析 TBaseFont::CreateFallbacks 的实现,签名如下:

__int64 __usercall TBaseFont::CreateFallbacks@<X0>(__int64 result@<X0>, __int64 a2@<X1>, __int64 a3@<X2>, __int64 a4@<X3>, __int64 a5@<X4>, _QWORD *a6@<X8>)

}

其中第一个参数 result@ 通过调用的地方我们知道是 CTFont 中的一个成员变量,但具体是什么不确定。

我们最终结合LLDB做如下尝试分析出了 result@ 的具体含义:

在这里插入图片描述

同理,我们如果拿到一段地址要分析其含义的话,也可以按这个步骤进行尝试。

4.3 如何修改 if 条件

我们以如下函数调用为例:

在这里插入图片描述

我们传入的num是1,正常逻辑会执行 num + 2 返回 3,那有没有办法不修改入参,执行 num + 1 的路径。

我们来看下这段逻辑的汇编代码:

在这里插入图片描述

图片注释说的比较明白;if 条件在汇编层面一般被翻译成 tbz(Test Bit and branch if Zero)、tbnz(Test Bit and branch if Not Zero)等,我们可以通过修改寄存器的值来更改执行分支;这在分析系统API时,是一个很有用的思路。

举一反三,通过LLDB,我们可以实时修改任何寄存器、内存地址的值,这可以非常方便的帮我们浮现一些偶现的Bug、Crash等。

4.4 如果跳过函数执行/修改函数返回值

我们还是以上面的addNum为例,如果我们不修改入参,但是想修改返回值,应该怎么做:

最直接的方式是等addNum执行完后,修改返回值寄存器,如下,返回值存储在w0,我们可以修改成任意想要的值:

在这里插入图片描述

但这种方式有个弊端是,需要等函数执行完,在实际的场景中,我们往往希望不执行函数且能让函数返回我们想要的值,比如:函数中可能会修改其他参数,函数可能有复杂的鉴权逻辑无法通过鉴权等,这些场景我们往往不希望或者不能让函数执行,这种情况下就需要另一个指令:thread return

以addNum为例,按如下步骤操作:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

使用 thread return 时,需要注意,我们的断点需要打在 objc_msgSend 的入口处,如果在 addNum 的入口打断点执行 thread return,最终可能会得到非预期值;原因是 thread return 改的是当前 frame 的返回寄存器,由于Objective-C的runtime特性,函数调用实际上是经过 objc_msgSend 给对象发消息,addNum 的上一个frame其实是 objc_msgSend,而 objc_msgSend 返回时可能会继续修改 w0 寄存器的值,会导致最终上层取到的值非预期。

4.5 善用 watchpoint 命令

在实际场景中,我们可能会遇到某个变量被很多地方修改,但是我们又无法一一断点,比如我们要查看哪些地方修改了 UIView 的 frame;或者某个值的修改链路很深,一般在系统库中比较常见,比如iOS中闭包嵌套闭包调用的场景。

针对以上场景,我们可以使用 watchpoint 命令,来观测变量的修改,watchpoint 的常见用法如下:

在这里插入图片描述

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 0:24:32

B站字幕一键获取:从复杂到简单的终极解决方案

B站字幕一键获取&#xff1a;从复杂到简单的终极解决方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 你是否曾经遇到过这样的情况&#xff1a;在B站看到一个精…

作者头像 李华
网站建设 2026/2/24 10:34:43

120亿参数改写效率标杆:GLM-4.5-Air重塑智能代理格局

120亿参数改写效率标杆&#xff1a;GLM-4.5-Air重塑智能代理格局 【免费下载链接】GLM-4.5-Air 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/GLM-4.5-Air 导语 当企业还在为大模型部署成本居高不下而发愁时&#xff0c;智谱AI推出的GLM-4.5-Air以1060亿总参…

作者头像 李华
网站建设 2026/2/26 19:02:01

FTXUI ResizableSplit:打造你的终端自定义布局神器

还在为终端应用界面死板而烦恼吗&#xff1f;FTXUI的ResizableSplit组件为你带来了革命性的解决方案&#xff01;这个强大的C功能终端用户界面库让终端应用也能拥有灵活的拖拽调整功能&#xff0c;让你的用户界面体验提升到全新高度。 【免费下载链接】FTXUI :computer: C Func…

作者头像 李华
网站建设 2026/2/26 14:36:19

解锁Sketchfab宝藏:3步搞定海量3D模型下载

解锁Sketchfab宝藏&#xff1a;3步搞定海量3D模型下载 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 还在为Sketchfab上精美的3D模型无法下载而烦恼吗&#xff1f…

作者头像 李华
网站建设 2026/2/22 10:13:54

抖音去水印下载工具:5分钟学会批量保存无水印视频的终极方法

抖音去水印下载工具&#xff1a;5分钟学会批量保存无水印视频的终极方法 【免费下载链接】TikTokDownload 抖音去水印批量下载用户主页作品、喜欢、收藏、图文、音频 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokDownload 还在为无法保存无水印的抖音视频而烦恼…

作者头像 李华