Android开发

Android逆向基础之ARM汇编语言知识总结

本文主要是介绍Android逆向基础之ARM汇编语言知识总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 前言
  • ARM32汇编
    • 1.1 寄存器
    • 1.2 寻址方式
    • 1.3 汇编指令
    • 1.4 代码识别
    • 1.5 IDA 示例
  • ARM64汇编
    • 2.1 寄存器
    • 2.2 变址寻址方式
    • 2.3 常用汇编指令
    • 2.4 实例程序分析
  • 总结

前言

X86 是英特尔 Intel 首先开发制造的一种微处理器体系结构的泛称,包括 Intel 8086、80186、80286、80386 以及 80486 等以 86 结尾系列,英特尔统治整个 CPU 产业链长达数十年。ARM(Advanced RISC Machines)公司是苹果、Acorn、VLSI、Technology等公司的合资企业,ARM 处理器非常适用于移动通信领域,具有低成本、高性能和低耗电的特性,ARM 的高性价比和低耗能在移动市场比英特尔更具优势。ARM 架构和 x86 架构直观区别:x86 主要用于 PC 领域如笔记本、台式机、小型服务器;arm 主要用于移动领域如手机、平板。
在这里插入图片描述

从前面几篇学习二进制文件动态调试的文章中可以看出,exe、elf 等在 PC 服务器上运行的可执行文件的汇编指令由 x86 汇编指令构成,因为其载体(服务器)是基于 x86 架构的 CPU 处理器。但是对于 Android 逆向来说则不能只会 x86 汇编指令,因为手机采用的是 arm 架构的 CPU 处理器,需要 arm 汇编指令进行操作,故本文学习记录一下 ARM 汇编语言的知识。

ARM32汇编

Arm 32 位是 ARMv7 架构,32 位的操作长度,对应处理器为 Cortex-A15等, IPhone5 以前均是 32 位的;ARM 64 位采用 ARMv8 架构,64 位操作长度,对应处理器有 Cortex-A53、Cortex-A57、Cortex-A73、iphones的 A7 和 A8 等,苹果手机从 IPhone 5s 开始使用 64 位的处理器。
在这里插入图片描述注意 ARM32 和 ARM64 架构的 CPU 所采用的汇编语言有所差异,需要加以区分学习。

1.1 寄存器

ARM 处理器支持的 7 种运行模式:

用户模式(usr):ARM 处理器正常的程序执行状态
快速中断模式(fiq):用于高速数据传输或通道处理
外部中断模式(irq):用于通用的中断处理
管理模式(svc):操作系统使用的保护模式
数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
系统模式(sys):运行具有特权的操作系统任务
未定义指令中止模式(und):当未定义的指令执行时进入该模式

ARM 微处理器的运行模式可以通过软件改变(修改状态寄存器 CPSR 后 5 位),也可以通过中断或者异常处理改变。不同模式下处理器使用的寄存器不尽相同,可供访问的资源也不一样。以上模式除了用户模式,都是特权模式,特权模式下,处理器可任意访问受保护的系统资源。现在只关注 ARM 程序逆向分析技术涉及的用户模式。

ARM 32 位的微处理器共有 37 个 32 位寄存器:31 个通用寄存器(Inter + 6 个为状态寄存器,也可细致划分为 16 个通用寄存器(R0~R15) + 1个状态寄存器 + 15 个通用影子寄存器 + 5 个状态影子寄存器。
在这里插入图片描述
在 ARM 32 位用户模式下,处理器可访问的寄存器为:

不分组寄存器:R0~R7;
分组寄存器:R8~R14(R13通常用作栈指针 SP,R14通常用作子程序链接寄存器 LR);
程序计数器:R15(PC)
当前程序状态寄存器 CPSR。

相关寄存器作用如下:
在这里插入图片描述
ARM 处理器有两种工作状态,即 ARM 状态和 Thumb 状态,处理器可在这两种状态间随意切换。处理器处于 ARM 状态时,会执行 32 位对齐的 ARM 指令;处于 Thumb 状态时,会执行 16 位对齐的 Thumb 指令。Thumb 状态下对寄存器的命名与 ARM 状态下有所差异,它们的关系:

Thumb 状态下的 R0 ~ R7 与 ARM 状态下的 R0 ~ R7 相同
Thumb 状态下的 CPSR 与 ARM 状态下的 CPSR 相同
Thumb 状态下的 FP 对应 ARM 状态下的 R11
Thumb 状态下的 IP 对应 ARM 状态下的 R12
Thumb 状态下的 SP 对应 ARM 状态下的 R13
Thumb 状态下的 LR 对应 ARM 状态下的 R14
Thumb 状态下的 PC 对应 ARM 状态下的 R15

状态寄存器

在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.2 寻址方式

在这里插入图片描述在这里插入图片描述

1.3 汇编指令

1、ARM 指令基本格式:

<opcode>{<cond>}{S}  <Rd>,<Rn>{,<opcode2}
opcode      指令助记符,如LDR, STR等
cond        执行条件,如EQ, NE等
S           是否影响CPSR寄存器的值,书写时影响CPSR,否则不影响
Rd          目标寄存器
Rn          第一个操作数的寄存器
opcode2     第二个操作数
备注:
    中括号<>内的项是必须的
    大括号{}内的项是可选的

2、指令条件码
在这里插入图片描述
条件码对应于 ARM 指令格式中的执行条件 cond,16 种条件状态码依次如下:
在这里插入图片描述3、常见指令汇总
在这里插入图片描述在这里插入图片描述

1.4 代码识别

下面总结介绍下常见 C/C++ 逻辑代码对应的汇编指令,帮助快速从晦涩难懂的汇编语言中识别背后的代码逻辑。

1、识别 if-else 判断逻辑
在这里插入图片描述在这里插入图片描述在这里插入图片描述
2、识别 while-do 循环逻辑

在这里插入图片描述在这里插入图片描述3、识别 for 循环逻辑
在这里插入图片描述在这里插入图片描述
4、识别 switch-case 分支逻辑
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.5 IDA 示例

ARM64汇编

2.1 寄存器

在这里插入图片描述可以对比下 8086 CPU 寄存器:
在这里插入图片描述

2.2 变址寻址方式

在这里插入图片描述

2.3 常用汇编指令

在这里插入图片描述在这里插入图片描述

2.4 实例程序分析

总结

本文参考文章:

  1. ARM汇编入门指南(知乎);
  2. 第七章 ARM 反汇编基础(四)(ARM 汇编语言);
  3. arm32位和arm64位架构、寄存器和指令差异分析总结;
  4. 移动安全之Android逆向系列:ARM汇编&IDA动态分析源码。
这篇关于Android逆向基础之ARM汇编语言知识总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!