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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向使用 Python 代码解析 ELF 文件 ( 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 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'Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 完整代码示例 ) ★★★

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编框架 | PyCharm 中导入 Capstone 反汇编框架 )

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

Android 逆向逆向修改游戏应用 ( APK 解析工具 | 解包 -> 分析 -> 重打包 -> 签名 流程 )

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )

Android 逆向arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )