文章目录
一、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 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()
执行结果 :
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