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

文章目录

前言

X86 是英特尔 Intel 首先开发制造的一种微处理器体系结构的泛称,包括 Intel 8086、80186、80286、80386 以及 80486 等以 86 结尾系列,英特尔统治整个 CPU 产业链长达数十年。ARM(Advanced RISC Machines)公司是苹果、Acorn、VLSI、Technology等公司的合资企业,ARM 处理器非常适用于移动通信领域,具有低成本、高性能和低耗电的特性,ARM 的高性价比和低耗能在移动市场比英特尔更具优势。ARM 架构和 x86 架构直观区别:x86 主要用于 PC 领域如笔记本、台式机、小型服务器;arm 主要用于移动领域如手机、平板。
Android逆向基础之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 位的处理器。
Android逆向基础之ARM汇编语言知识总结注意 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 个状态影子寄存器。
Android逆向基础之ARM汇编语言知识总结
在 ARM 32 位用户模式下,处理器可访问的寄存器为:

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

相关寄存器作用如下:
Android逆向基础之ARM汇编语言知识总结
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

状态寄存器

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

1.2 寻址方式

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

1.3 汇编指令

1、ARM 指令基本格式:

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

2、指令条件码
Android逆向基础之ARM汇编语言知识总结
条件码对应于 ARM 指令格式中的执行条件 cond,16 种条件状态码依次如下:
Android逆向基础之ARM汇编语言知识总结3、常见指令汇总
Android逆向基础之ARM汇编语言知识总结Android逆向基础之ARM汇编语言知识总结

1.4 代码识别

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

1、识别 if-else 判断逻辑
Android逆向基础之ARM汇编语言知识总结Android逆向基础之ARM汇编语言知识总结Android逆向基础之ARM汇编语言知识总结
2、识别 while-do 循环逻辑

Android逆向基础之ARM汇编语言知识总结Android逆向基础之ARM汇编语言知识总结3、识别 for 循环逻辑
Android逆向基础之ARM汇编语言知识总结Android逆向基础之ARM汇编语言知识总结
4、识别 switch-case 分支逻辑
Android逆向基础之ARM汇编语言知识总结Android逆向基础之ARM汇编语言知识总结Android逆向基础之ARM汇编语言知识总结Android逆向基础之ARM汇编语言知识总结

1.5 IDA 示例

ARM64汇编

2.1 寄存器

Android逆向基础之ARM汇编语言知识总结可以对比下 8086 CPU 寄存器:
Android逆向基础之ARM汇编语言知识总结

2.2 变址寻址方式

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

2.3 常用汇编指令

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

2.4 实例程序分析

总结

本文参考文章:

  1. ARM汇编入门指南(知乎)
  2. 第七章 ARM 反汇编基础(四)(ARM 汇编语言);
  3. arm32位和arm64位架构、寄存器和指令差异分析总结
  4. 移动安全之Android逆向系列:ARM汇编&IDA动态分析源码
上一篇:wpa_supplicant开源库交叉编译(实测可以)


下一篇:尝试ARM的C语言与汇编语言混合编程