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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 【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  


目录
相关文章
|
28天前
|
Java 开发工具 Android开发
Android与iOS开发环境搭建全解析####
本文深入探讨了Android与iOS两大移动操作系统的开发环境搭建流程,旨在为初学者及有一定基础的开发者提供详尽指南。我们将从开发工具的选择、环境配置到第一个简单应用的创建,一步步引导读者步入移动应用开发的殿堂。无论你是Android Studio的新手还是Xcode的探索者,本文都将为你扫清开发道路上的障碍,助你快速上手并享受跨平台移动开发的乐趣。 ####
|
21天前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
21天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
27天前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
1月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
45 0
|
2月前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
30 3
|
1月前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
52 0
|
18天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
17天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
5天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
98 80

推荐镜像

更多