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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )相关的知识,希望对你有一定的参考价值。





一、反汇编二进制机器码



在创建 Capstone 实例对象 , 并设置 detail 属性为 True ;

在之前读取了 节区 二进制数据 , 这些数据就是需要反汇编的机器码数据 ;

调用 反汇编解析器 的 disasm 方法 , 向汇编解析器中传入 节区数据 对应的 二进制数据 , 这些二进制数据都是机器码数据 , 即 , 需要反汇编这些二进制数据为 汇编 代码 ;

  • 第一个参数设置二进制数据 ;
  • 第二个参数指的是读取 raw 二进制数据的起始地址 , 一般设置 0 即可 ;

调用 反汇编解析器 的 disasm 方法 , 得到的是反汇编后的汇编代码列表 , 如果反汇编失败 , 此处为空 ;


            # 读取 节区 二进制数据
            #   这是需要反汇编的机器码数据
            raw = file.read(sh_size)
            # 创建 Capstone 实例对象
            capstone = Cs(CS_ARCH_X86, CS_MODE_32)
            # 此处设置为 true , 表示需要显示细节 , 打开后 , 会标明每条汇编代码中对寄存器的影响
            #   如 : 本条汇编代码中 , 会读写哪些寄存器
            capstone.detail = True
            # 向汇编解析器中传入 节区数据 对应的 二进制数据 , 这些二进制数据都是机器码数据
            #   即 , 需要反汇编这些二进制数据为 汇编 代码
            # 第一个参数设置二进制数据
            # 第二个参数指的是读取 raw 二进制数据的起始地址 , 一般设置 0 即可
            # 得到的是反汇编后的汇编代码列表 , 如果反汇编失败 , 此处为空
            disasm = capstone.disasm(raw, 0)




二、打印反汇编数据



调用 反汇编解析器 的 disasm 方法 , 得到的是反汇编后的汇编代码列表 ;

遍历该汇编代码列表 , 可以得到该行汇编代码对应的 汇编代码 ;

要打印的结果如下 :

00000000: push ebx                                     ; 读寄存器:esp. 写寄存器:esp ; 机器码 :53 

在开始位置打印汇编代码地址 , 然后是 汇编指令 , 操作对象 ;

之后将汇编代码 读取的寄存器 , 写出的寄存器 打印出来 ;

最后打印出该行汇编代码对应的机器码 ;


打印汇编代码 :

            # 遍历反汇编代码列表
            for line in disasm:
                # 打印每行汇编代码的 地址 , 指令 , 操作对象
                text = '%08X: %s %s ' % (line.address, line.mnemonic, line.op_str)
                # 统计汇编代码行的字符串个数 , 保证在第 55 字节处打印寄存器读写信息
                # 00000000: push ebx                                     ; 读寄存器:esp 写寄存器:esp ; 机器码 :53
                length = len(text)
                if length < 55:
                    text += ' ' * (55 - length)
                text += ';'
                # 读取操作影响到的寄存器
                if hasattr(line, 'regs_read') and len(line.regs_read) > 0:
                    text += ' 读寄存器:'
                    for j, r in enumerate(line.regs_read):
                        if j > 0:
                            text += ','
                        text += '%s' % line.reg_name(r)
                # 写出操作影响到的寄存器
                if hasattr(line, 'regs_write') and len(line.regs_write) > 0:
                    text += ' 写寄存器:'
                    for j, r in enumerate(line.regs_write):
                        if j > 0:
                            text += ','
                        text += '%s' % line.reg_name(r)
                text += ' ; 机器码 :'
                # 打印 本条汇编代码对应的 机器码
                for i in range(line.size):
                    text += '%02X ' % line.bytes[i]
                # 打印最终数据
                print(text)

分析 打印结果 :

该操作是 入栈操作 , 肯定会影响到 esp 栈寄存器 ; 该汇编代码对应的机器码是 0x53 ;

00000000: push ebx                                     ; 读寄存器:esp. 写寄存器:esp ; 机器码 :53 

下面的汇编代码 , 调用 0xab , 会读取 esp,eip 寄存器 , 写出 esp 寄存器 ;

00000001: call 0xab                                    ; 读寄存器:esp,eip. 写寄存器:esp ; 机器码 :E8 A5 00 00 00 

以上是关于Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 完整代码示例 ) ★★★

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

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

Android 逆向Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )