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 · 2220 次点击
    这是一个创建于 1031 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在是用 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  
       2021-06-01 20:47:22 +08:00 via iPhone
    elf 没存,能做到是反汇编的
    mconintet
        3
    mconintet  
       2021-06-01 21:23:32 +08:00
    可能确实需要先反汇编然后分析一波
    no1xsyzy
        4
    no1xsyzy  
       2021-06-01 22:02:31 +08:00
    需要反汇编,而且应当不能完全分析,C 语言允许使用函数指针实现一定程度的动态,还有在结构体里塞函数指针装作自己是面向对象这样的操作
    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   ·   我们的愿景   ·   实用小工具   ·   4969 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 01:13 · PVG 09:13 · LAX 18:13 · JFK 21:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.