Python 有没有能从 elf 文件中解析出函数调用关系的 lib?

2021-06-01 20:29:59 +08:00
 XIVN1987

我现在是用 fromelf 生成反汇编文件,然后再用正则表达式从反汇编文件中解析出函数调用关系(单片机程序,只有几十 K )

但是反汇编文件本身没有标准,每个编译器生成的反汇编文件格式都不一样,,而且还会随着时间变化,,不方便维护

我就想,fromelf 能从 elf 文件解析出函数调用关系,那说明 elf 文件中是存储了这种信息的,而 elf 格式本身是标准化的,,那直接从 elf 文件中解析函数调用关系岂不是更稳定、更全面

网上搜到的 elf 解析库主要是 pyelftools,,但是感觉它只能解析 elf 文件的各种 header 和符号表,,似乎没有解析函数调用关系的能力

请问各位大佬,,python 有 lib 能实现这种功能吗?

2492 次点击
所在节点    Python
9 条回复
codehz
2021-06-01 20:47:04 +08:00
建议直接 ida (指它内置的 py
SingeeKing
2021-06-01 20:47:22 +08:00
elf 没存,能做到是反汇编的
mconintet
2021-06-01 21:23:32 +08:00
可能确实需要先反汇编然后分析一波
no1xsyzy
2021-06-01 22:02:31 +08:00
需要反汇编,而且应当不能完全分析,C 语言允许使用函数指针实现一定程度的动态,还有在结构体里塞函数指针装作自己是面向对象这样的操作
zk8802
2021-06-01 23:25:44 +08:00
angr 这个是纯 Python 的库
Ghidra 好像有 Python binding
IDA Pro 有 Python binding
radare2
XIVN1987
2021-06-01 23:26:15 +08:00
@no1xsyzy
嗯,确实,,函数指针间接调用很难分析出来,,看来我这个需求不大可能实现啊
secondwtq
2021-06-02 00:37:37 +08:00
方向错了,ELF 只是个容器,里面啥都可以存的
也就是说你这个问题相当于,有没有一个机箱可以玩 2077 ?
Nitroethane
2021-06-02 01:41:57 +08:00
我没看懂你的描述,是先用 fromelf 生成反汇编文件,然后自己写正则表达式去匹配还是 fromelf 去做?然后你都研究到这么底层了,大致的思路应该有吧。比如函数调用的汇编指令是 call,amd64 架构下函数参数通过寄存器传递,rdi 、rsi 、rdx 、rcx 、r8 、r9 对应第一到第五个参数。不过 call 指令分好几种,自己看汇编手册就知道了。capstone ( https://github.com/aquynh/capstone )可能会有帮助
XIVN1987
2021-06-02 07:39:32 +08:00
@Nitroethane
https://github.com/XIVN1987/JHFView

上面这个是我需要的功能,现在是通过正则表达式分析 fromelf 生成的反汇编解析出函数调用关系,,功能已经实现,,不过 MDK 、IAR 、GCC 三个编译器的反汇编文件格式不一样,,必须分别解析,,而且我担心它们的格式会变动导致之前写的代码失效

所以希望能直接从 elf 文件中解析出函数调用关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/780697

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX