前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )

【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )

作者头像
韩曙亮
发布2023-03-29 19:52:58
8360
发布2023-03-29 19:52:58
举报

文章目录

一、PyCharm 中创建 Python 程序


在 PyCharm 的欢迎界面中 , 点击 " New Project " 按钮 , 开始创建 Python 工程 ;

选择 Python 工程安装路径 , 以及依赖的 Python SDK 版本 2.7 即可 ;

二、导入 ELFFile 依赖库


参考 【错误记录】Python 安装依赖库报错 ( ERROR: Could not find a version that satisfies the requirement elftools ) 博客中导入依赖库过程 ;

三、 解析 ELF 文件


工程结构 : 将要解析的 libwtcrypto.so 动态库拷贝到工程根目录 , 执行 main.py 即可完成解析 ;

完整代码示例 :

代码语言:javascript
复制
# coding=utf-8
# 解析 elf 文件需要导入的依赖库
#   安装 pyelftools 库
from elftools.elf.elffile import ELFFile


def main():
    # 要解析的动态库路径
    elf_path = r'libwtcrypto.so'
    # 打开 elf 文件
    file = open(elf_path, 'rb')
    # 创建 ELFFile 对象 , 该对象是核心对象
    elf_file = ELFFile(file)

    # 打印 elf 文件头
    print(elf_file.header)
    # 打印 程序头入口 个数
    print(elf_file.num_segments())
    # 打印 节区头入口 个数
    print(elf_file.num_sections())

    # 遍历打印 程序头入口
    for segment in elf_file.iter_segments():
        print(segment.header)
        print(segment.header['p_align'])

    # 遍历打印 节区头入口
    for section in elf_file.iter_sections():
        print('name:', section.name)
        print('header', section.header)

    # 关闭文件
    file.close()
    pass


if __name__ == '__main__':
    main()

执行结果 :

代码语言:javascript
复制
Y:\002_WorkSpace\PycharmProjects\ELF_Parser\venv\Scripts\python.exe Y:/002_WorkSpace/PycharmProjects/ELF_Parser/main.py
Container({'e_flags': 0, 'e_shoff': 16652, 'e_phoff': 52, 'e_shnum': 21, 'e_entry': 0, 'e_version': 'EV_CURRENT', 'e_machine': 'EM_386', 'e_phnum': 7, 'e_shentsize': 40, 'e_ident': Container({'EI_DATA': 'ELFDATA2LSB', 'EI_OSABI': 'ELFOSABI_SYSV', 'EI_VERSION': 'EV_CURRENT', 'EI_CLASS': 'ELFCLASS32', 'EI_ABIVERSION': 0, 'EI_MAG': [127, 69, 76, 70]}), 'e_type': 'ET_DYN', 'e_phentsize': 32, 'e_shstrndx': 20, 'e_ehsize': 52})
7
21
Container({'p_memsz': 224, 'p_flags': 4, 'p_offset': 52, 'p_type': 'PT_PHDR', 'p_align': 4, 'p_paddr': 52, 'p_filesz': 224, 'p_vaddr': 52})
4
Container({'p_memsz': 11872, 'p_flags': 5, 'p_offset': 0, 'p_type': 'PT_LOAD', 'p_align': 4096, 'p_paddr': 0, 'p_filesz': 11872, 'p_vaddr': 0})
4096
Container({'p_memsz': 4568, 'p_flags': 6, 'p_offset': 15944, 'p_type': 'PT_LOAD', 'p_align': 4096, 'p_paddr': 20040, 'p_filesz': 444, 'p_vaddr': 20040})
4096
Container({'p_memsz': 272, 'p_flags': 6, 'p_offset': 15956, 'p_type': 'PT_DYNAMIC', 'p_align': 4, 'p_paddr': 20052, 'p_filesz': 272, 'p_vaddr': 20052})
4
Container({'p_memsz': 156, 'p_flags': 4, 'p_offset': 11716, 'p_type': 'PT_GNU_EH_FRAME', 'p_align': 4, 'p_paddr': 11716, 'p_filesz': 156, 'p_vaddr': 11716})
4
Container({'p_memsz': 0, 'p_flags': 6, 'p_offset': 0, 'p_type': 'PT_GNU_STACK', 'p_align': 0, 'p_paddr': 0, 'p_filesz': 0, 'p_vaddr': 0})
0
Container({'p_memsz': 440, 'p_flags': 6, 'p_offset': 15944, 'p_type': 'PT_GNU_RELRO', 'p_align': 4, 'p_paddr': 20040, 'p_filesz': 440, 'p_vaddr': 20040})
4
('name:', '')
('header', Container({'sh_type': 'SHT_NULL', 'sh_addralign': 0, 'sh_offset': 0, 'sh_entsize': 0, 'sh_name': 0, 'sh_flags': 0, 'sh_size': 0, 'sh_addr': 0, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.dynsym')
('header', Container({'sh_type': 'SHT_DYNSYM', 'sh_addralign': 4, 'sh_offset': 276, 'sh_entsize': 16, 'sh_name': 11, 'sh_flags': 2, 'sh_size': 832, 'sh_addr': 276, 'sh_link': 2, 'sh_info': 1}))
('name:', u'.dynstr')
('header', Container({'sh_type': 'SHT_STRTAB', 'sh_addralign': 1, 'sh_offset': 1108, 'sh_entsize': 0, 'sh_name': 19, 'sh_flags': 2, 'sh_size': 892, 'sh_addr': 1108, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.hash')
('header', Container({'sh_type': 'SHT_HASH', 'sh_addralign': 4, 'sh_offset': 2000, 'sh_entsize': 4, 'sh_name': 27, 'sh_flags': 2, 'sh_size': 364, 'sh_addr': 2000, 'sh_link': 1, 'sh_info': 0}))
('name:', u'.rel.dyn')
('header', Container({'sh_type': 'SHT_REL', 'sh_addralign': 4, 'sh_offset': 2364, 'sh_entsize': 8, 'sh_name': 33, 'sh_flags': 2, 'sh_size': 24, 'sh_addr': 2364, 'sh_link': 1, 'sh_info': 0}))
('name:', u'.rel.plt')
('header', Container({'sh_type': 'SHT_REL', 'sh_addralign': 4, 'sh_offset': 2388, 'sh_entsize': 8, 'sh_name': 42, 'sh_flags': 2, 'sh_size': 280, 'sh_addr': 2388, 'sh_link': 1, 'sh_info': 6}))
('name:', u'.plt')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 16, 'sh_offset': 2672, 'sh_entsize': 4, 'sh_name': 46, 'sh_flags': 6, 'sh_size': 576, 'sh_addr': 2672, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.text')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 16, 'sh_offset': 3248, 'sh_entsize': 0, 'sh_name': 51, 'sh_flags': 6, 'sh_size': 6327, 'sh_addr': 3248, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.rodata')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 4, 'sh_offset': 9576, 'sh_entsize': 1, 'sh_name': 57, 'sh_flags': 50, 'sh_size': 1177, 'sh_addr': 9576, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.eh_frame')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 4, 'sh_offset': 10756, 'sh_entsize': 0, 'sh_name': 65, 'sh_flags': 2, 'sh_size': 960, 'sh_addr': 10756, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.eh_frame_hdr')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 4, 'sh_offset': 11716, 'sh_entsize': 0, 'sh_name': 75, 'sh_flags': 2, 'sh_size': 156, 'sh_addr': 11716, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.fini_array')
('header', Container({'sh_type': 'SHT_FINI_ARRAY', 'sh_addralign': 4, 'sh_offset': 15944, 'sh_entsize': 0, 'sh_name': 89, 'sh_flags': 3, 'sh_size': 8, 'sh_addr': 20040, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.init_array')
('header', Container({'sh_type': 'SHT_INIT_ARRAY', 'sh_addralign': 1, 'sh_offset': 15952, 'sh_entsize': 0, 'sh_name': 101, 'sh_flags': 3, 'sh_size': 4, 'sh_addr': 20048, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.dynamic')
('header', Container({'sh_type': 'SHT_DYNAMIC', 'sh_addralign': 4, 'sh_offset': 15956, 'sh_entsize': 8, 'sh_name': 113, 'sh_flags': 3, 'sh_size': 272, 'sh_addr': 20052, 'sh_link': 2, 'sh_info': 0}))
('name:', u'.got')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 4, 'sh_offset': 16228, 'sh_entsize': 0, 'sh_name': 122, 'sh_flags': 3, 'sh_size': 4, 'sh_addr': 20324, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.got.plt')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 4, 'sh_offset': 16232, 'sh_entsize': 0, 'sh_name': 127, 'sh_flags': 3, 'sh_size': 152, 'sh_addr': 20328, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.data')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 4, 'sh_offset': 16384, 'sh_entsize': 0, 'sh_name': 136, 'sh_flags': 3, 'sh_size': 4, 'sh_addr': 20480, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.bss')
('header', Container({'sh_type': 'SHT_NOBITS', 'sh_addralign': 32, 'sh_offset': 16388, 'sh_entsize': 0, 'sh_name': 142, 'sh_flags': 3, 'sh_size': 4096, 'sh_addr': 20512, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.comment')
('header', Container({'sh_type': 'SHT_PROGBITS', 'sh_addralign': 1, 'sh_offset': 16388, 'sh_entsize': 1, 'sh_name': 147, 'sh_flags': 48, 'sh_size': 53, 'sh_addr': 0, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.note.gnu.gold-version')
('header', Container({'sh_type': 'SHT_NOTE', 'sh_addralign': 4, 'sh_offset': 16444, 'sh_entsize': 0, 'sh_name': 156, 'sh_flags': 0, 'sh_size': 28, 'sh_addr': 0, 'sh_link': 0, 'sh_info': 0}))
('name:', u'.shstrtab')
('header', Container({'sh_type': 'SHT_STRTAB', 'sh_addralign': 1, 'sh_offset': 16472, 'sh_entsize': 0, 'sh_name': 1, 'sh_flags': 0, 'sh_size': 179, 'sh_addr': 0, 'sh_link': 0, 'sh_info': 0}))

Process finished with exit code 0

将执行结果与 【Android 逆向】ELF 文件格式 ( 程序头数据 | 节区头数据 | 动态符号表 ) 博客中使用 010 Editor 工具解析的数据进行参照对比 ;

四、 博客源码


GitHub : https://github.com/han1202012/ELF_Parser

CSDN 下载 :

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、PyCharm 中创建 Python 程序
  • 二、导入 ELFFile 依赖库
  • 三、 解析 ELF 文件
  • 四、 博客源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档