Android逆向之指令集和CPU架构

文章目录

    • 前言
      • 引子
    • 指令集
      • 复杂指令集(CISC)
      • 精简指令集(RISC)
      • RISC-V
      • ARM和x86的区别
      • 指令集和汇编
        • 汇编语言是用人类看得懂的语言来描述指令集
        • 不同指令集对应不同的汇编语言
      • ARM和x86指令集差异
        • ARM指令集
        • x86指令集
    • CPU架构和ABI
      • 什么是ABI
      • ABI对不上会怎么样
      • CPU架构和对应的ABI库
    • 参考

前言

CPU架构以及对应的指令集是计算机组成原理一书的重点,同样也是逆向工程中必须要掌握的知识点。逆向中分析二进制文件是必不可少的,经常需要把二进制文件反汇编出汇编指令,那么看懂汇编指令就显得很重要了。

本篇博客主要介绍ARM和x86指令集的区别,以及汇编指令上的区别。同时也给出CPU架构以及对应ABI的版本和解释,一起学习。

引子

我们在反编译安卓代码之后,有些代码是写在了native中,搜索函数名,然后我们就会发现函数所在目录为:

resources/lib/armeabi-v7a/*.so

疑问:

  • 这里的armeabi-v7a代表的是ARM指令集的版本吗?
  • 除了ARM指令集还有什么指令集?
  • ARM指令集的汇编指令和其他指令集的汇编指令有什么区别呢?

带着问题,我们一起去学习和尝试解答这些问题。

指令集

复杂指令集(CISC)

  1. 最新的x86-64指令集中,指令的数量超过了3000条
  2. 设计初衷是为了最大限度地提高硬件的性能。
  3. 存在兼容效率低,硬件发热高,编译器优化慢,扩展性低等问题

精简指令集(RISC)

  1. ARMv7架构支持大约37条指令,而在ARMv8-A架构中,其指令集增加到了大约54条。
  2. RISC的指令简单、定长,通过编译器实现简单指令的组合,完成复杂功能。

Intel和ARM处理器的第一个区别是,前者使用复杂指令集(CISC),后者使用精简指令集(RISC)。

RISC-V

它是开源的RISC,可以说是CPU界的Linux。

ARM和x86的区别

  • arm 架构注重的是续航能力
    • 由于节能的特点,ARM处理器非常适用于移动通信领域,匹配其主要设计目标为低成本、高性能、低耗电的特性。
  • x86 架构注重的是性能
    • X86结构的电脑无论如何都比ARM结构的系统在性能方面要快得多、强得多。

指令集和汇编

汇编语言是用人类看得懂的语言来描述指令集

否则指令集的机器码都是一堆二进制数字,人类读起来非常麻烦,但汇编是用类似人类语言的方式描述指令集,读起来方便多了。
虽然汇编语言读起来方便了,但也有缺陷。首先汇编语言操作起来还是挺麻烦的。其次汇编语言对应一条条指令集,所以当指令集改变时,就得修改相应汇编语言,导致其可移植性很差,不能跨平台使用,如ARM的汇编语言与Intel X86的就不同。这时人们就想开发一种更方便操作,超越指令集的语言,于是有了C,C++等高级语言
但处理器只能识别二进制码,那怎么能识别高级语言呢?于是人们开发了编译器,依照如下顺序,将高级语言翻译成二进制码: 高级语言 → 汇编语言 → 二进制机器码。

不同指令集对应不同的汇编语言

不同指令集里,对应的汇编代码会对应这个指令集的机器码。 “汇编语言”其实可以理解成“机器码”的一种别名或者书写方式,不同的指令集和体系结构的机器会有不同的“机器码” 高级语言在转换成为机器码的时候,是通过编译器进行的,需要编译器指定编译成哪种汇编/机器码。
物理机自己执行的时候只有机器码,并不认识汇编代码。

ARM和x86指令集差异

image.png

ARM指令集

这个截图中的汇编语言指令集是ARM指令集。
汇编语言指令含义如下:

ldr是装载(Load)指令,用于从内存中取出数值放入寄存器中。
str是存储(Store)指令,用于将寄存器的值存储到内存中。
mov 指令用于将一个寄存器的值复制到另一个寄存器,或者将一个立即值(即一个固定的数,
例如一个整型或者字符型的常量)复制到一个寄存器。

x86指令集

还是以上案例,对应x86的汇编语言指令为:

装载操作:mov eax, [ebx] 这个指令会将由寄存器ebx指向的内存地址中的内容加载到寄存器eax中。
存储操作:mov [eax], ebx 这个指令会将寄存器ebx的值存入寄存器eax指向的内存地址。

在x86指令集中,mov指令功能很丰富,可以实现从内存到寄存器,寄存器到内存,寄存器到寄存器,以及立即值到寄存器或内存,连寄存器和内存之间都可以直接传送数据。
所以在x86指令集中,不需要ldr和str,全部都是由mov指令实现。我们看到ldr和str就可以推断出,是ARM指令集。

CPU架构和ABI

什么是ABI

全称是"Application Binary Interface",即应用程序二进制接口。它是一个接口标准,定义了应用程序和操作系统之间或者不同应用程序模块间所必须遵守的一个约定。
这关乎到应用程序的二进制兼容性问题。你可以把它看作是一种约定,即:

  1. 如何在运行时找到并执行程序的入口函数
  2. 系统如何调用在程序二进制文件中定义的函数,以及
  3. 如何将参数从调用函数传递给被调用函数,以及从被调用函数返回结果给调用函数。

ABI对不上会怎么样

如果 ABI 接口对不上,那么程序可能无法在指定设备上运行,或者会出现各种预期外的问题,例如性能差、运行不稳定或应用崩溃等。这是因为 ABI 接口定义了应用程序和操作系统之间的二进制接口规范,包括如何调用函数、参数传递方式等,如果不匹配,那么程序和操作系统之间的交互就会出现问题。

CPU架构和对应的ABI库

  • ARMv5
  • ARMv7 (从2010年起)
  • x86 (从2011年起)
  • MIPS (从2012年起)
  • ARMv8
  • MIPS64
  • x86_64 (从2014年起)

在Android系统上,每一个CPU架构对应一个ABI:

  • armeabi
  • armeabi-v7a
  • x86
  • mips
  • arm64-v8a
  • mips64
  • x86_64

参考

从CISC到RISC-V:指令集的未来在哪里
iOS汇编教程:理解ARM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/337821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YARN节点故障的容错方案

YARN节点故障的容错方案 1. RM高可用1.1 选主和HA切换逻辑 2. NM高可用2.1 感知NM节点异常2.2 异常NM上的任务处理 4. 疑问和思考4,1 RM感知NM异常需要10min,对于app来说是否太长了? 5. 参考文档 本文主要探讨yarn集群的高可用容错方案和容错能力的探讨。…

HCIP之BGP联邦实验

华子目录 实验拓扑及要求规划网段和IP地址实验步骤配置IP地址先让IGP通建BGP邻居修改ospf下环回接口网络类型修改联邦之间的最大跳数每台运行BGP的路由器批量宣告路由修改本地下一跳测试 实验拓扑及要求 规划网段和IP地址 实验步骤 配置IP地址 r1配置,依次类推 […

软件需求规格说明书-word

软件需求规格说明书编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件开发全文档获取:软件项目开发全套文档下载_软件项目文档-CSDN博客

【Linux学习】进程信号

目录 十七.进程信号 导言 17.1 linux中的信号列表 17.2 标准信号与实时信号 17.3 信号的产生 17.3.1 通过终端按键产生信号 17.3.2 调用系统函数产生信号 17.3.3 软件条件产生信号 17.3.4 硬件异常产生信号 17.3.5 【补充】核心转储 Core Dump 17.4 信号的阻塞 17.4.1 信号相关…

Hive-SQL语法大全

Hive SQL 语法大全 基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C)如上语法,在语法描述中出现: [],表示可选,如上[LOCATI…

vue3-模版引用

模版引用 ref 属性 场景&#xff1a;需要直接访问底层 DOM 元素。 方法&#xff1a;使用特殊的 ref 属性。 <input ref"input">ref 属性 允许我们在一个特定的 DOM 元素或子组件实例被挂载后&#xff0c;获得对它的直接引用。 访问模板引用 小 Demo: 当 i…

游戏渲染管道

高级的渲染步骤是由管道&#xff08;软件架构&#xff09;实现&#xff0c;各个阶段会操作输入流中的数据项&#xff0c;并对输出流产生数据。 管道每个阶段独立于其他阶段&#xff0c;所以管道的最大有点在于非常适合并行化。 渲染管道分为3个概要阶段。但在这里多讲几个阶段…

【大数据分析与挖掘技术】Mahout聚类算法

目录 一、聚类的基本概念 二、常见的Mahout数据结构 &#xff08;一&#xff09;向量&#xff08;Vector&#xff09; &#xff08;二&#xff09;文本文档 三、聚类算法种类 &#xff08;一&#xff09;K-means &#xff08;二&#xff09;模糊K-means &#xff08;…

中国电子学会2022年6月份青少年软件编程Scratch图形化等级考试试卷一级真题

一、单选题(共25题&#xff0c;共50分) 1.广场中有声控喷泉&#xff0c;当声音的音量大于60的时候&#xff0c;喷泉就会喷出水&#xff0c;现在的音量为30&#xff0c;下列哪个选项可以让喷泉喷出水&#xff1f;&#xff08;2分&#xff09; A. B. C. D. 答案解析&#x…

搭建开源数据库中间件MyCat2-配置mysql数据库双主双从

mycat2官网&#xff1a;MyCat2 前言&#xff1a;mycat2下载地址无法访问&#xff0c;不知道是不是被DNS污染了&#xff0c;还是需要搭梯子访问&#xff0c;所以我只能找到1.21的版本进行安装。搭建mycat2的前提是搭建数据库主从复制。 架构&#xff1a;双主双从 配置&#xf…

基于OpenSSL的SSL/TLS加密套件全解析

概述 SSL/TLS握手时&#xff0c;客户端与服务端协商加密套件是很重要的一个步骤&#xff0c;协商出加密套件后才能继续完成后续的握手和加密通信。而现在SSL/TLS协议通信的实现&#xff0c;基本都是通过OpenSSL开源库&#xff0c;本文章就主要介绍下加密套件的含义以及如何在O…

通信入门系列——连续卷积定理、循环卷积、离散卷积定理

本节目录 一、连续卷积定理 1、时域卷积定理 2、频域卷积定理 二、循环卷积 三、离散卷积定理本节内容 一、连续卷积定理 卷积定理在信号分析中占有重要的地位&#xff0c;包括时域卷积定理和频域卷积定理。在信号分析领域&#xff0c;通常采用基于卷积定理的时频域分析&#…

vectorCast——CBA功能实现代码手动覆盖

选择被测文件&#xff0c;点击右键&#xff0c;选择add coverage analysis.选择添加覆盖分析后&#xff0c;会自动打开CBA。此时就可以在代码里选择没有覆盖的代码&#xff0c;勾选后填写未覆盖分析并保存&#xff0c;就可以实现代码覆盖了。查看覆盖率报告。 手动覆盖代码完成…

结构体内存对齐(面试重点)

结构体内存对齐 1. 结构体类型的声明1.1 结构体的概念1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的自引用 2. 结构体内存对齐2.1 对齐规则2.1.1 练习1:2.1.2 练习2:2.1.3 练习3:2.1.4 练习4: 2.2 offsetof宏的使用2.3 为什么存在内存对齐?2.…

Vue2的双向数据绑定

Vue2的双向数据绑定 Observer&#xff1a;观察者&#xff0c;这里的主要工作是递归地监听对象上的所有属性&#xff0c;在属性值改变的时候&#xff0c;触发相应的watcher。 Watcher&#xff1a;订阅者&#xff0c;当监听的数据值修改时&#xff0c;执行响应的回调函数&#x…

基于Springboot的民宿在线预定平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的民宿在线预定平台(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

通过完善价值观评价,建立企业多维度评价体系

一、背景A公司是一家互联网公司&#xff0c;主要负责技术开发、软件应用方面的工作&#xff0c;致力于长期的软件研发、服务器开发、游戏端开发等&#xff0c;依托于专业技术实力和长期的实践积累&#xff0c;公司不断整合各类资源、深入开发技术&#xff0c;规模不断扩大&…

详解Redisson

第1章&#xff1a;Redisson简介 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Redisson&#xff0c;Redisson不只是简单地对Redis进行了封装&#xff0c;它还提供了一系列高级的分布式Java数据结构&#xff0c;像是分布式锁、原子长整型这种。 首先&#xff0c;Redi…

02_Collection

文章目录 集合Java的集合类 Collectioniterator方法 集合 在Java中&#xff0c;指的就是存放数据的容器&#xff0c;是一个载体&#xff0c;可以一次容纳多个对象。 解决Bug的两种方法&#xff1a; 打印 System.out.println();log.info(); debug 检查数据 Java的集合类 Co…

项目管理十大知识领域之项目干系人管理

一、项目干系人管理的概念解析 项目干系人管理是指在项目执行过程中&#xff0c;对项目相关方的需求进行识别、分析和管理的过程。项目干系人管理的核心在于有效地沟通、协调和满足各方的需求&#xff0c;以确保项目能够顺利实施并达到预期的成果。在现代项目管理实践中&#…