如何(重新)命名剥离(未命名)的 LLDB 符号?

问题描述 投票:0回答:1

TL;博士

我正在尝试调试一个已被剥离的二进制文件,因此缺少某些过程的符号名称。有什么方法可以 - 即使只是为了会话 - 命名特定的未命名/剥离程序以方便调试?

使用这些符号(甚至可能是调试信息)重新编译二进制文件是不是一个选项


更详细...

当 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 报告符号表的摘录: (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 中是微不足道的,我需要切换?


背景与环境

相关可执行文件最初是用
Objective-C 编写的,其源代码已丢失。
    lldb-1400.0.38.17
  • (LLVM/clang 14.0.0,来自 Xcode 14.2 的 clang-1400.0.29.51
  • macOS 蒙特利 12.7.4
    
    
    参考文献
  • 另一个关于 iOS 应用程序中未命名 LLDB 符号的问题
任何
    image dump symtab
  1. 的LLDB输出(我尝试过,但没有找到相关的LLDB文档)。
  2. lldb 目前没有用户可自定义的符号名称替换功能。没有理由不可以,但没有人足够需要它来添加它。您可以使用 lldb 的一些脚本功能来为各种用例添加此功能。
对于回溯,您可以使用
frame-format
macos debugging lldb debug-symbols
1个回答
1
投票
${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 名称的识别器,并将其替换为已知的名称。


© www.soinside.com 2019 - 2024. All rights reserved.