Python 有没有能从 elf 文件中解析出函数调用关系的 lib? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
XIVN1987
V2EX    Python

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

  •  
  •   XIVN1987 2021-06-01 20:29:59 +08:00 2979 次点击
    这是一个创建于 1658 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    9 条回复    2021-06-02 07:39:32 +08:00
    codehz
        1
    codehz  
       2021-06-01 20:47:04 +08:00 via Android
    建议直接 ida (指它内置的 py
    SingeeKing
        2
    SingeeKing  
    PRO
       2021-06-01 20:47:22 +08:00 via iPhone
    elf 没存,能做到是反汇编的
    mconintet
        3
    mconintet  
       2021-06-01 21:23:32 +08:00
    可能确实需要先反汇编然后分析一波
    td width="auto" valign="top" align="left">
        4
    no1xsyzy  
       2021-06-01 22:02:31 +08:00
    需要反汇编,而且应当不能完全分析,C 语言允许使用函数指针实现一定程度的动态,还有在结构体里塞函数指针装作自己是面向对象这样的操作
    no1xsyzy
    zk8802
        5
    zk8802  
       2021-06-01 23:25:44 +08:00 via iPhone   1
    angr 这个是纯 Python 的库
    Ghidra 好像有 Python binding
    IDA Pro 有 Python binding
    radare2
    XIVN1987
        6
    XIVN1987  
    OP
       2021-06-01 23:26:15 +08:00
    @no1xsyzy
    嗯,确实,,函数指针间接调用很难分析出来,,看来我这个需求不大可能实现啊
    secondwtq
        7
    secondwtq  
       2021-06-02 00:37:37 +08:00
    方向错了,ELF 只是个容器,里面啥都可以存的
    也就是说你这个问题相当于,有没有一个机箱可以玩 2077 ?
    Nitroethane
        8
    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
        9
    XIVN1987  
    OP
       2021-06-02 07:39:32 +08:00
    @Nitroethane
    https://github.com/XIVN1987/JHFView

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

    所以希望能直接从 elf 文件中解析出函数调用关系
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     917 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 19:36 PVG 03:36 LAX 11:36 JFK 14:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86