寻找包含函数的二进制文件

2024-10-03 21:34:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用python扩展来确定给定的帧是否是从给定符号所来自的相同二进制文件执行的。具体来说:

我正在查看一个Ruby堆栈跟踪,希望自动判断一个帧是来自Ruby/libruby,还是另一个二进制文件。主要标准是:帧的pc是否与符号ruby_exec_node属于同一个soname

这在gdb本身是可行的:

#69 0x00007fe00444e783 in invoke_block (...) at vm.c:921
921 in vm.c
(gdb) info symbol 0x00007fe00444e783
invoke_block.isra + 387 in section .text of /host/ruby-2.3.3
(gdb) info symbol ruby_exec_node
ruby_exec_node in section .text of /host/ruby-2.3.3

您可以看到这两个符号都来自/host/ruby-2.3.3

从文档中看,python应该可以通过gdb.solib_name访问它,但是我不能把它说出来:

ruby_exec_node = gdb.lookup_global_symbol('ruby_exec_node')
ruby_solib = gdb.solib_name(ruby_exec_node.value().address)
print(ruby_solib)

给我None。我怎样才能从符号中得到这些信息

第二部分是从pc地址获取相同的信息。我可以执行以下操作来获取地址:

gdb.selected_frame().pc()

但是如何找到它对应的符号,类似于info symbol ...


Tags: 文件ininfonodehost二进制符号symbol
1条回答
网友
1楼 · 发布于 2024-10-03 21:34:15

这两个问题的解决方案是:

从符号到对象文件(不一定可以比较路径-objfile):

ruby_exec_node = gdb.lookup_global_symbol('ruby_exec_node')
ruby_file = ruby_exec_node.symtab.objfile

查找当前帧的objfilecurrent):

sal = current.find_sal()
if not sal.symtab:
    # skip frame - doesn't contain symtab

if sal.symtab.objfile == ruby_file:
    # this frame executes code from the ruby binary

相关问题 更多 >