ιldb脚本——你才叫lldb,我叫“约塔ldb”

admin 2026-01-14 23:10:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: ιldb是一款基于LLDB的调试脚本工具,通过模块化设计封装了常用调试操作。它提供命令管理功能,支持基于模块偏移或动态地址打断点、内存读写、地址计算及Swift对象解析。用户可修改配置文件定制命令,大幅简化逆向分析中的繁琐流程,提升调试效率。 综合评分: 92 文章分类: 安全工具,逆向分析,二进制安全,移动安全


cover_image

ιldb 脚本 —— 你才叫 lldb,我叫 “约塔 ldb”

αβγδεξπ

看雪学苑

2026年1月14日 17:59 上海

概述

ιldb 是一个基于 LLDB 的调试脚本工具,提供了多种便捷的调试命令和命令管理功能。它通过模块化设计,将常用的调试操作封装为简单易用的命令,并支持命令的保存、显示、删除和执行。如果这些命令的命名方式与您使用的习惯不符合,也可以通过修改 cmd_config.json 来实现个性化定制。

ιldb 内置命令保存与注释功能,可告别「调试命令 / 地址复制到文本、再从文本粘贴调用」的繁琐流程,实现命令的快速执行与管理。

后续笔者有时间了也会继续完善和优化,并且已经发布在 github 以及 gitee 上,欢迎大家共同讨论和学习。如果你等不及想添加自己的命令,也可以研究一下源码,主要就是修改 ιldb/src/core/ 目录下的 lldb_script_handler.py ,这里面是所有 lldb 脚本的具体实现。utils.py 是一些通用的工具类函数,比如确保地址以 0x 开头等,data_handler.py 主要用于维护一些全局变量,json 就是从这里读取并缓存的。

ιldb 在 gitee 的项目地址:https://gitee.com/your-git/yueta-ldb/

ιldb 在 github 的项目地址:https://github.com/your-git/yueta-ldb

安装与初始化

将 ιldb.py 文件放置在您的 LLDB 插件目录中

在 ~/.lldbinit/ 文件中添加以下命令加载脚本:

# ***/ 替换为你自己的路径
command script import ***/ιldb.py

加载成功后,您将看到所有已注册的命令列表

核心功能

1. 命令管理功能

save – 保存命令到记录

保存 LLDB 历史命令到 cmd_record.json 文件中,支持多种格式:

# 保存最近一条命令,描述为空
save

# 保存最近一条命令,并添加描述
save "这是最近一条命令"

# 保存指定序号的历史命令,并添加描述
save 0 "这是 history 中序号为 0 的命令" 2 "这是 history 命令中序号为 2 的命令"

# 混合格式:保存多个命令,只有部分带描述
save 0 2 "这是命令"

show – 显示命令列表

显示已保存的所有命令及其描述:

show

输出示例:

[ 命令列表 ]
0. using       —— 指定模块(后续mark命令基于该模块)
1. mark        —— 基于模块偏移地址打断点(支持多地址)
2. markd       —— 基于动态地址打断点(支持多地址)
3. memread     —— 读取内存内容
4. process     —— 启动进程

rm – 删除命令记录

根据序号删除已保存的命令:

# 删除单个命令
rm 1

# 删除多个命令
rm 0 2 4

删除后会自动显示更新后的命令列表。

exec – 执行命令记录

根据序号执行已保存的命令:

# 执行序号为1的命令
exec 1

执行时会显示命令内容及其描述。

2. 调试功能

using – 指定调试模块

指定当前调试的模块,后续的 mark 命令将基于该模块计算偏移地址:

# 使用应用程序的主模块
using

# 使用指定的模块
using SwiftDemo.debug.dylib

mark – 基于模块偏移地址打断点

基于指定模块的偏移地址设置断点,支持多地址:

# 单个地址
mark0x1063c2c10

# 多个地址
mark0x1063c2c10 1063c2c18 0x1063c2c20

# 地址范围(地址必须以0x开头)
mark[0x1063c2c10, 0x1063c2c20]

IDA 中encryptWithChaCha20Poly1305函数的偏移地址是A8F4,那么可以使用mark快速打上断点。

markd – 基于动态地址打断点

基于动态地址设置断点,支持多地址:

# 单个地址
markd 0x12345678

# 多个地址
markd 0x12345678 0x87654321

dy – 计算动态内存地址

基于 using 指定的模块 来计算偏移的动态内存地址:

dy 0xA8F4

offset – 计算静态偏移地址

基于当前模块计算静态偏移地址:

# 计算指定地址的偏移
offset 0x1063c2c10

# 计算当前 PC 寄存器的偏移
offset

memwrite – 内存修改

对指定地址进行内存修改,默认会执行端序转换:

# memwrite 后面的这个地址是动态内存地址,不是偏移地址
memwrite 0x1063c2c10 1f2003d5

注意:地址和机器码不一定要以 0x 开头,默认是十六进制。

memread – 内存读取

读取内存内容,支持多种格式:

# 读取多个地址
memread $x8 0x12345678

# 先从指定地址获取指针,再读取该指针指向的内存
memread -ptr ($x8 + 0x20)

# 指定读取字节数
memread -c 0x100 $x8
memread --count 0x200 0x12345678

nop – 内存填充NOP指令

将指定地址的内存填充为 NOP 指令:

# 单个地址
nop 0x1063c2c10

# 多个地址
nop 0x1063c2c10 1063c2c18 0x1063c2c20

# 地址范围(地址必须以0x开头)
nop [0x1063c2c10, 0x1063c2c20]

ptr – 获取指针地址

获取地址中的指针地址:

# 获取寄存器表达式的指针地址
ptr ($x8 + 0x8) ($x8 + 0x20)

# 获取直接地址的指针
ptr 0x12345678

ss – 尝试解析为 Swift String 字符串

尝试将寄存器中的内容解析为 Swift String 字符串,只需要指定一个寄存器,另外一个寄存器内部会自动取读取

sd – 尝试解析为 Swift Data 字符串

配置文件

ιldb 使用两个主要的配置文件:

cmd_config.json

存储命令配置信息,包括:

  • cmd_script: 命令脚本映射

  • cmd_alias: 命令别名映射

  • cus_cmd: 自定义命令列表

  • 这部分命令会在脚本加载之处自动执行

  • cmd_notes: 命令注释列表

  • 这部分命令会打印在终端,但不会执行,主要是一个备忘的作用

cmd_record.json

存储用户保存的命令记录,每个记录包含:

  • command: 实际执行的 LLDB 命令
  • desc: 命令描述

#

命令脚本映射

为了提高使用效率,ιldb 提供了以下命令映射:

使用示例

完整调试流程示例

# 1. 指定调试模块
using SwiftDemo.debug.dylib

# 2. 设置断点
mark 0x1063c2c10
markd 0x12345678

# 3. 保存常用命令
save "指定调试模块"
save 0 "在入口函数设置断点" 1 "在关键函数设置断点"

# 4. 查看保存的命令
show

# 5. 执行保存的命令
exec 0
exec 1

# 6. 读取内存
memread $x8

# 7. 修改内存
memwrite 0x1063c2c10 d503201f

# 8. 填充NOP指令
nop [0x1063c2c10, 0x1063c2c20]

注意事项

1.所有序号(save、show、rm、exec)都是从 0 开始的

2.地址范围格式(如 [0x1063c2c10, 0x1063c2c20])中的地址必须以 0x 开头

3.单个地址和多个地址格式不要求地址以 0x 开头

4.内存操作默认使用十六进制

5.命令历史记录保存在ιldb/config/cmd_record.json文件中

扩展功能

ιldb 支持通过修改 cmd_config.json 文件添加自定义命令和别名,实现个性化定制。

补充【2025年12月20号】

1、修复 ptr 命令 和 memread -ptr 命令的相关问题;

2、新增 ss 和 sd 命令,可以用于解析 Swift String 对象和 Data 对象。

看雪ID:αβγδεξπ

https://bbs.kanxue.com/user-home-982645.htm

*本文为看雪论坛优秀文章,由 αβγδεξπ 原创,转载请注明来自看雪社区

往期推荐

逆向分析某手游基于异常的内存保护

解决Il2cppapi混淆,通杀DumpUnityCs文件

记录一次Unity加固的探索与实现

DLINK路由器命令注入漏洞从1DAY到0DAY

量子安全 quantum ctf Global Hyperlink Zone Hack the box

球分享

球点赞

球在看

点击阅读原文查看更多


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:看雪学苑 αβγδεξπ《ιldb 脚本 —— 你才叫 lldb,我叫 “约塔 ldb”》

评论:0   参与:  0