当前位置: 首页 > news >正文

新手小白也能看懂的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 的常见用法如下:

在这里插入图片描述

http://www.cnnetsun.cn/news/19840.html

相关文章:

  • pywebview与React集成的终极指南:高效构建跨平台桌面应用
  • 大模型微调:不冻结参数 vs 冻结主干
  • 30亿参数改写AI效率范式:Qwen3-30B-A3B如何让企业AI成本降60%?
  • ppInk:Windows平台上的终极协作写作与在线文档编辑指南
  • 3步彻底解决PDFMathTranslate中文乱码:从新手到专家的终极指南
  • React Stripe.js 终极指南:快速构建安全支付系统
  • 新手专属!BurpSuite 零基础到实战全攻略 —— 渗透测试核心工具配置与精通教程
  • 基于web的农产品溯源系统选题表
  • 基于Web的企业招投标管理系统的开发中期报告
  • ABB RobotWare软件资源下载与配置完全指南
  • Unity角色移动系统终极指南:打造《原神》级流畅体验
  • 终极指南:使用APK Icon Editor轻松定制Android应用
  • 基于Java的学贷通智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 字节跳动开源90亿学术大模型:轻量化英文场景解决方案来了
  • 如何获取119,376个英语单词发音MP3音频资源?实用工具完整指南
  • GitHub下载加速革命:告别龟速访问的终极解决方案
  • cohesive 单元设置粘性(VISCOSITY)
  • AI 内容洞察决策系统:4 大功能让科技企业创新效率提升 50%,敏捷破局信息困局
  • DeepPCB数据集终极指南:PCB缺陷检测实战手册
  • 7-Zip ZS:六种压缩算法如何彻底改变你的文件处理体验
  • Chrome DevTools Protocol终极指南:解锁浏览器自动化的无限可能
  • ET框架客户端性能优化终极指南:从15秒到3秒的快速启动实战
  • 4种有效方法:如何将音乐从Mac传输到Android
  • LoRaWAN智慧物联应用:远距离、低功耗、广连接
  • KK-HF_Patch完整使用指南:轻松解锁游戏无限可能
  • AppPolice终极指南:如何快速限制Mac应用CPU占用
  • 2025 年广州服装批发市场推荐:原创与效率双驱采批标杆
  • 记录vue动态切换访问后台服务
  • stm32 adc采集光敏传感器模块的模拟输出脚A0的值
  • 银发旅游崛起:退休后的“第二人生”革命