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