如何为LLDB中已剥离的无名符号重命名?
解决方案
LLDB 临时重命名合成符号
LLDB没有原生直接重命名符号的命令,但可以通过Python脚本实现临时替换,新名称会在回溯、反汇编中显示,且可用于设置断点。
步骤1:编写Python脚本
创建名为rename_symbol.py的文件,内容如下:
import lldb def rename_unnamed_symbol(debugger, command, result, internal_dict): args = command.strip().split(maxsplit=1) if len(args) != 2: result.AppendError("用法:rename-symbol <旧符号名> <新名称>") return old_sym_name, new_name = args target = debugger.GetSelectedTarget() for module in target.modules: sym = module.FindFirstSymbol(old_sym_name) if sym.IsValid(): sym_addr = sym.GetStartAddress() target.SetSymbolNameForAddress(sym_addr, new_name) result.AppendMessage(f"已将符号 {old_sym_name} 重命名为 {new_name},地址:{sym_addr}") return result.AppendError(f"未找到符号 {old_sym_name}") # 注册自定义命令 lldb.debugger.HandleCommand('command script add -f rename_symbol.rename_unnamed_symbol rename-symbol')
步骤2:加载脚本到LLDB
启动LLDB并加载目标二进制后,执行:
command script import /path/to/rename_symbol.py
步骤3:执行重命名
以将___lldb_unnamed_symbol42改为WriteEfiVariable为例:
rename-symbol ___lldb_unnamed_symbol42 WriteEfiVariable
验证效果:
- 反汇编查看:
di -s WriteEfiVariable - 设置断点:
br set -n WriteEfiVariable -s firmwarepasswd - 程序触发断点时,回溯信息会显示新名称
GDB 方案
若可切换到GDB,操作更简洁:
直接重命名符号(GDB 7.10+)
- 先获取无名函数的地址:
info symbol ___lldb_unnamed_symbol42
- 执行重命名:
rename-symbol 0x<函数地址> WriteEfiVariable
若GDB可识别原合成名称,也可直接运行:
rename-symbol ___lldb_unnamed_symbol42 WriteEfiVariable
验证效果:
- 反汇编:
disassemble WriteEfiVariable - 设置断点:
break WriteEfiVariable - 回溯时会显示新名称
其他开源工具方案
Radare2
Radare2是开源逆向工程工具,支持临时重命名函数:
- 加载二进制文件:
r2 -d firmwarepasswd
- 查找目标函数地址:
is | grep ___lldb_unnamed_symbol42
- 执行重命名:
afn WriteEfiVariable 0x<函数地址>
之后调试时,函数会以新名称显示,支持用新名称设置断点、查看反汇编等操作。
内容的提问来源于stack exchange,提问作者mavenor
相关产品推荐
相关产品推荐

