文章目录
一、PyCharm 中创建 Python 程序二、导入 ELFFile 依赖库三、 解析 ELF 文件四、 博客源码一、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 即可完成解析 ;
完整代码示例 :
# coding=utf-8# 解析 elf 文件需要导入的依赖库# 安装 pyelftools 库from elftools.elf.elffile import ELFFiledef 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()passif __name__ == '__main__':main()
执行结果 :
Y:\002_WorkSpace\PycharmProjects\ELF_Parser\venv\Scripts\python.exe Y:/002_WorkSpace/PycharmProjects/ELF_Parser/main.pyContainer({'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})721Container({'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})4Container({'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})4096Container({'p_memsz': 4568, 'p_flags': 6, 'p_offset': 15944, 'p_type': 'PT_LOAD', 'p_align': 4096, 'p_paddr': 0, 'p_filesz': 444, 'p_vaddr': 0})4096Container({'p_memsz': 272, 'p_flags': 6, 'p_offset': 15956, 'p_type': 'PT_DYNAMIC', 'p_align': 4, 'p_paddr': 2, 'p_filesz': 272, 'p_vaddr': 2})4Container({'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})4Container({'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})0Container({'p_memsz': 440, 'p_flags': 6, 'p_offset': 15944, 'p_type': 'PT_GNU_RELRO', 'p_align': 4, 'p_paddr': 0, 'p_filesz': 440, 'p_vaddr': 0})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': 0, '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': 8, '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': 2, '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 :/han120/ELF_Parser
CSDN 下载 :
【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )
如果觉得《【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 》对你有帮助,请点赞、收藏,并留下你的观点哦!