手动为闭源二进制文件生成符号文件

逆向工程 数据库 调试符号
2021-06-17 11:36:43

我有一个闭源二进制文件 ( minecraft-pi)。对于程序集的给定部分,如下所示:

   a2ed4:       e92d45f8        push    {r3, r4, r5, r6, r7, r8, sl, lr}
   a2ed8:       e1a04000        mov     r4, r0
   a2edc:       e59d0024        ldr     r0, [sp, #36]   ; 0x24
   a2ee0:       e352007f        cmp     r2, #127        ; 0x7f
   a2ee4:       d3a02000        movle   r2, #0
   a2ee8:       c3a02001        movgt   r2, #1
   a2eec:       e1922fa0        orrs    r2, r2, r0, lsr #31
   a2ef0:       1a000015        bne     a2f4c

方便的是,还有另一个二进制文件libminecraftpe.so,它包含带有符号的代码,同时包含类似的反汇编指令,以及函数之间类似的相对位置,例如:

0013a3ac <_ZN5Level11hasChunksAtEiiiiii>:
  13a3ac:       e92d 43f8       stmdb   sp!, {r3, r4, r5, r6, r7, r8, r9, lr}
  13a3b0:       2a7f            cmp     r2, #127        ; 0x7f
  13a3b2:       4604            mov     r4, r0
  13a3b4:       9809            ldr     r0, [sp, #36]   ; 0x24
  13a3b6:       bfd4            ite     le
  13a3b8:       2200            movle   r2, #0
  13a3ba:       2201            movgt   r2, #1
  13a3bc:       ea52 72d0       orrs.w  r2, r2, r0, lsr #31
  13a3c0:       d119            bne.n   13a3f6 <_ZN5Level11hasChunksAtEiiiiii+0x4a>

_ZN5Level11hasChunksAtEiiiiii~Level::hasChunksAt(int, int, int, int, int, int)根据c++filt)。

这是匹配的,因为尽管一个是 ARM + Linux,另一个是 ARM/Thumb + Android,但它们来自大致相同的代码库。

因此minecraft-pi,手动构建符号文件并在 gdb 中使用它很有吸引力即使主要是单步执行程序集,如果我可以在函数名称上设置断点并查看信息丰富的回溯,也会非常有帮助。

因此,如果我已经编写了地址到符号名称的映射,我如何生成相应的符号文件二进制文件(通过symbol-file命令加载到 gdb 中,甚至嵌入到可执行文件中)?

我熟悉人类可读的调试符号格式,如 Breakpad syms,但是否有以这种方式生成 DWARF 二进制文件的工具?

我发现与IDA集成在堆栈交易所的其他问题,dwarfexportpwndebug,和unstrip(包括在下面的链接)。florisschabert/unstrip 具有 ARM 支持,但似乎面向插入基于 Objective-C 标准库的符号,这在此处不适用。使用 IDAdwarfexport可能是一种选择,但我更喜欢可以编写脚本的命令行解决方案。在尝试使用有限文档的这些各种工具之前,我基本上是在寻找有关一般推荐做法的建议。

链接:

0个回答
没有发现任何回复~