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





一、创建 Capstone 反汇编解析器实例对象



使用 Capstone 反汇编框架 ,

首先创建 Capstone 反汇编解析器对象 , 即 Cs 类实例对象 ;

构造函数原型如下 :

class Cs(object):
    def __init__(self, arch, mode):

创建 Capstone 实例对象代码 : 下面代码创建的是 x86 架构的 32 位模式的 Cs 对象 , 也就意味着反汇编的 ELF 文件是 32 位 x86 CPU 架构的动态库 ;

Cs(CS_ARCH_X86, CS_MODE_32)

第一个参数是 CPU 架构 , 第二个参数是 CPU 位数模式 ;


CPU 架构选择 : 有如下可选项 ; 99% 的情况下使用的是 CS_ARCH_ARM , CS_ARCH_ARM64 , CS_ARCH_X86 这三种情况 ; 其中 Android 逆向中 , CS_ARCH_ARM 和 CS_ARCH_ARM64 用的最多 ;

# architectures
CS_ARCH_ARM = 0
CS_ARCH_ARM64 = 1
CS_ARCH_MIPS = 2
CS_ARCH_X86 = 3
CS_ARCH_PPC = 4
CS_ARCH_SPARC = 5
CS_ARCH_SYSZ = 6
CS_ARCH_XCORE = 7
CS_ARCH_M68K = 8
CS_ARCH_TMS320C64X = 9
CS_ARCH_M680X = 10
CS_ARCH_EVM = 11
CS_ARCH_MAX = 12
CS_ARCH_ALL = 0xFFFF

CPU 位数模式 : 每种 CPU 架构都分 32 位 , 64 位 模式 ;

# disasm mode
CS_MODE_LITTLE_ENDIAN = 0      # little-endian mode (default mode)
CS_MODE_ARM = 0                # ARM mode
CS_MODE_16 = (1 << 1)          # 16-bit mode (for X86)
CS_MODE_32 = (1 << 2)          # 32-bit mode (for X86)
CS_MODE_64 = (1 << 3)          # 64-bit mode (for X86, PPC)
CS_MODE_THUMB = (1 << 4)       # ARM's Thumb mode, including Thumb-2
CS_MODE_MCLASS = (1 << 5)      # ARM's Cortex-M series
CS_MODE_V8 = (1 << 6)          # ARMv8 A32 encodings for ARM
CS_MODE_MICRO = (1 << 4)       # MicroMips mode (MIPS architecture)
CS_MODE_MIPS3 = (1 << 5)       # Mips III ISA
CS_MODE_MIPS32R6 = (1 << 6)    # Mips32r6 ISA
CS_MODE_MIPS2 = (1 << 7)       # Mips II ISA
CS_MODE_V9 = (1 << 4)          # Sparc V9 mode (for Sparc)
CS_MODE_QPX = (1 << 4)         # Quad Processing eXtensions mode (PPC)
CS_MODE_M68K_000 = (1 << 1)    # M68K 68000 mode
CS_MODE_M68K_010 = (1 << 2)    # M68K 68010 mode
CS_MODE_M68K_020 = (1 << 3)    # M68K 68020 mode
CS_MODE_M68K_030 = (1 << 4)    # M68K 68030 mode
CS_MODE_M68K_040 = (1 << 5)    # M68K 68040 mode
CS_MODE_M68K_060 = (1 << 6)    # M68K 68060 mode
CS_MODE_BIG_ENDIAN = (1 << 31) # big-endian mode
CS_MODE_MIPS32 = CS_MODE_32    # Mips32 ISA
CS_MODE_MIPS64 = CS_MODE_64    # Mips64 ISA
CS_MODE_M680X_6301 = (1 << 1)  # M680X HD6301/3 mode
CS_MODE_M680X_6309 = (1 << 2)  # M680X HD6309 mode
CS_MODE_M680X_6800 = (1 << 3)  # M680X M6800/2 mode
CS_MODE_M680X_6801 = (1 << 4)  # M680X M6801/3 mode
CS_MODE_M680X_6805 = (1 << 5)  # M680X M6805 mode
CS_MODE_M680X_6808 = (1 << 6)  # M680X M68HC08 mode
CS_MODE_M680X_6809 = (1 << 7)  # M680X M6809 mode
CS_MODE_M680X_6811 = (1 << 8)  # M680X M68HC11 mode
CS_MODE_M680X_CPU12 = (1 << 9)  # M680X CPU12 mode
CS_MODE_M680X_HCS08 = (1 << 10)  # M680X HCS08 mode




二、设置 Cs 汇编解析器显示细节



创建完 Capstone 汇编解析器 Cs 对象后 ,

一定要设置汇编解析器实例对象的 detail 为 true , 作用是 表示需要显示细节 , 打开后 , 会标明每条汇编代码中对寄存器的影响 ; 如 : 本条汇编代码中 , 会读写哪些寄存器 ;

            # 创建 Capstone 实例对象
            x86 = Cs(CS_ARCH_X86, CS_MODE_32)
            # 此处设置为 true , 表示需要显示细节 , 打开后 , 会标明每条汇编代码中对寄存器的影响
            #   如 : 本条汇编代码中 , 会读写哪些寄存器
            x86.detail = True
FreeRTOS是一个开源的实时操作系统,用于嵌入式系统中。ELF是一种可执行文件格式,用于存储和传输可执行程序和库。 在FreeRTOS中,程序的编译后会生成一个可执行文件,通常是ELF格式。如果我们想对这个可执行文件进行反汇编,我们可以使用相应的工具。 ELF反汇编是将二进制代码转换回汇编语言的过程。它可以帮助我们理解程序的结构和执行流程,并进行调试和优化。 可以使用一些工具进行ELF反汇编,例如GNU工具链中的objdump命令。objdump可以读取ELF格式的文件,并将其转换为可读的汇编代码。 具体来说,如果我们想对FreeRTOS的ELF文件进行反汇编,我们可以使用以下命令: ``` objdump -d [可执行文件路径] ``` 这将生成一个包含汇编代码的文件,我们可以在其中查看程序的反汇编结果。 在进行ELF反汇编时,我们可以观察指令的地址、指令的类型以及操作数等信息。通过分析反汇编结果,我们可以更好地理解程序的运行逻辑,并发现隐藏的问题或优化的机会。 然而,需要注意的是,反汇编并不总是能够完全还原原始源代码。因此,在进行ELF反汇编时,应该结合其他调试和性能分析工具,以全面理解和优化代码。 总之,ELF反汇编是一个有用的工具,可以帮助我们理解和优化FreeRTOS中的程序。通过分析反汇编结果,我们可以更好地理解程序的执行流程和结构,从而提高嵌入式系统的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值