首页
社区
课程
招聘
[原创] ιldb 脚本 —— 你才叫 lldb,我叫 "约塔 ldb"
发表于: 2天前 529

[原创] ιldb 脚本 —— 你才叫 lldb,我叫 "约塔 ldb"

2天前
529

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

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

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

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

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

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

QQ_1766055646737

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

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

输出示例:

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

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

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

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

QQ_1766056338879

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

QQ_1766056442852

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

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

QQ_1766056554065

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

QQ_1766056843156

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

QQ_1766056969351

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

QQ_1766057010853

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

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

QQ_1766057146359

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

QQ_1766057220160

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

QQ_1766057283580

获取地址中的指针地址:

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

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

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

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

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

【 2025年12月20号 】

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

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

# ***/ 替换为你自己的路径
command script import ***/ιldb.py
# ***/ 替换为你自己的路径
command script import ***/ιldb.py
# 保存最近一条命令,描述为空
save
 
# 保存最近一条命令,并添加描述
save "这是最近一条命令"
 
# 保存指定序号的历史命令,并添加描述
save 0 "这是 history 中序号为 0 的命令" 2 "这是 history 命令中序号为 2 的命令"
 
# 混合格式:保存多个命令,只有部分带描述
save 0 2 "这是命令"
# 保存最近一条命令,描述为空
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     —— 启动进程
[ 命令列表 ]
0. using       —— 指定模块(后续mark命令基于该模块)
1. mark        —— 基于模块偏移地址打断点(支持多地址)
2. markd       —— 基于动态地址打断点(支持多地址)
3. memread     —— 读取内存内容
4. process     —— 启动进程
# 删除单个命令
rm 1
 
# 删除多个命令
rm 0 2 4
# 删除单个命令
rm 1
 
# 删除多个命令
rm 0 2 4
# 执行序号为1的命令
exec 1
# 执行序号为1的命令
exec 1
# 使用应用程序的主模块
using
 
# 使用指定的模块
using SwiftDemo.debug.dylib
# 使用应用程序的主模块
using
 
# 使用指定的模块
using SwiftDemo.debug.dylib
# 单个地址
mark 0x1063c2c10
 
# 多个地址
mark 0x1063c2c10 1063c2c18 0x1063c2c20
 
# 地址范围(地址必须以0x开头)
mark [0x1063c2c10, 0x1063c2c20]
# 单个地址
mark 0x1063c2c10
 
# 多个地址
mark 0x1063c2c10 1063c2c18 0x1063c2c20
 
# 地址范围(地址必须以0x开头)
mark [0x1063c2c10, 0x1063c2c20]
# 单个地址
markd 0x12345678
 
# 多个地址
markd 0x12345678 0x87654321
# 单个地址
markd 0x12345678
 
# 多个地址
markd 0x12345678 0x87654321
dy 0xA8F4
dy 0xA8F4

传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 12小时前 被αβγδεξπ编辑 ,原因:
上传的附件:
收藏
免费 13
支持
分享
最新回复 (8)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2天前
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享
1天前
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
666
1天前
0
雪    币: 2412
活跃值: (4649)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
666
1天前
0
雪    币: 507
活跃值: (4217)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看看
1天前
0
雪    币: 3123
活跃值: (4387)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
支持
1天前
0
雪    币: 144
活跃值: (1888)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
666
1天前
0
雪    币: 5606
活跃值: (9382)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不明觉厉
14小时前
0
游客
登录 | 注册 方可回帖
返回