我正在尝试调试一个已被剥离的二进制文件,因此缺少某些过程的符号名称。有什么方法可以 - 即使只是为了会话 - 命名特定的未命名/剥离程序以方便调试?
使用这些符号(甚至可能是调试信息)重新编译二进制文件是不是一个选项。
当 LLDB 导入图像时,它似乎会自动使用
___lldb_unnamed_symbolXXX
[1] 来命名符号表中不存在的所有过程,其中 XXX
是 符号索引,按数字递增顺序(运行时)加载地址。当使用 im dump symt <image>
打印二进制文件的符号表时,LLDB 将这些自动命名的过程标记为 Synthetic Symbols[2]。
我希望能够以某种方式用特定名称标记这些“合成符号”——即使是暂时的,也仅在 LLDB 调试会话期间;我也希望能够在功能上使用该名称,例如使用 br set -n myRenamedProc -s myBinary
设置断点。重要的是,我希望显示名称来代替合成的自动生成的名称(即
___lldb_unnamed_symbolXXX
)。因此,理想情况下,与其采用即时替换现有自动生成名称的解决方案,不如替换它。 相关问题 注意:
与这篇文章和这个文章不同,我既不记得原始方法的名称,也不希望以任何方式使用原始名称。 在这篇文章中,OP建议他们可能想要实现与我想要的类似的东西——现有符号的“别名”——作为另一个潜在问题的“前瞻性解决方案”,但它仍未得到探索。此外,我希望这个名字能够反映出来,而不仅仅是一个功能别名;即,我正在寻找替换无用的___lldb_unnamed_symbolXXX
名称,以便对过程的引用(例如,当使用di
打印反汇编指令时,或回溯中显示的名称)然后使用新名称。
如果不是这个要求,这篇文章
中的解决方案可以使用函数指针实现良好的别名。
示例
(lldb) im dump symt firmwarepasswd
Symtab, file = <path-to-my-binary>, num_symbols = 68:
Debug symbol
|Synthetic symbol
||Externally Visible
|||
Index UserID DSX Type ... Name
------- ------ --- --------------- ... ----------------------------------
...
[ 42] 42 S Code ... ___lldb_unnamed_symbol42
...
___lldb_unnamed_symbol42
,例如,
WriteEfiVariable
。 我知道 IDA Pro 和 Hopper 等更复杂的调试/反汇编工具(都是免费增值软件)能够做到这一点,但我找不到任何与 LLDB 相关的东西。尽管 LLDB 解决方案是首选,但任何带有 FOSS(调试器)工具的解决方案也可以工作。也许这在 GDB 中是微不足道的,我需要切换?
背景与环境相关可执行文件最初是用
lldb-1400.0.38.17
clang-1400.0.29.51
)参考文献
image dump symtab
frame-format
${function.name-with-args}
设置中删除
frame-format
标记,并将其替换为
${script.frame:my_translator:translate}
,然后在该翻译函数中进行名称替换:https://lldb.llvm.org/use/formatting.html您还可以制作自己的用于反汇编的Python包装器,首先查询您的查找表,然后将未处理的名称发送到实际的反汇编命令:
https://lldb.llvm.org/use/python-reference.html#create-a-new-lldb-command-using-a-python-function
顺便说一句,如果有人有动力尝试将其添加到 lldb,那么将
function_name()
API 添加到 lldb 中的帧识别器基础设施将非常简单。然后您可以注册 ___lldb_unnamed_symbol
名称的识别器,并将其替换为已知的名称。