ARM32汇编逆向分析基础

news2024/10/7 16:19:51

寄存器和指令基本格式

寄存器

寄存器名称寄存器描述
R0函数的第1个参数, 以及保存函数返回的结果
R1 - R3保存函数的第2~4个参数
R4 – R8通用寄存器,其中R7在系统调用时存储调用号
R9平台相关
R10通用寄存器, 可用于保存局部变量
R11/FP栈帧指针, 用于记录栈帧
R12过程间调用, 保存函数及其调用的子函数之间的立即数
R13/SP栈指针, 指向栈顶
R14/LR链接寄存器, 用于保存子函数调用的返回地址
R15/PC程序计数器, 保存当前执行指令地址+8
CSPR当前程序状态寄存器

常用指令

指令描述指令描述
MOV移动数据EOR按位异或
MVN移动并取反LDR加载
ADDSTR存储
SUBLDM加载多个
MULSTM存储多个
LSL逻辑左移PUSH入栈
LSR逻辑右移POP出栈
ASR算术右移B跳转
ROR循环右移BL跳转并将返回地址保存到LR寄存器
CMP比较BX跳转并切换Arm/Thumb模式
AND按位与BLX跳转,保存返回地址,并切换ARM/Thubmb模式
ORR按位或SWI/WVC系统调用

总体设计和指令规格

  • 没有隐式内存操作指令
  • 0-3个操作数,内存操作数和立即数不能同时存在,内存操作数至多出现1次,寄存器操作数总在最前

特殊情况:

  • C标志位使用
  • 读PC寄存器

断点

在 IDA 调试中,无论是断点还是单步调试都是依靠 #UND 0x10 触发断点实现,且 IDA 调试器 无法分辨出改指令是否是自己设置的,在读取数据时会按实际情况返回数据。
该指令在 Arm 模式和 Thumb 模式的硬编码不同:

  • Arm 模式断点:F0 01 F0 E7
  • Thumb 模式断点:10 DE

PC寄存器相关指令

  • MOV PC, R0:相当于 PC = R0
  • MOV R0, PC
    • 在 Arm 模式中相当于 R0 = PC + 8
    • 在 Thumb 模式中相当于 R0 = PC +4
  • LDR R0, [PC,#x]
    可以看做 3 步:
    • 读 PC 寄存器的值,规则与 MOV R0, PC 相同,即根据处于 Arm 或 Thumb 模式加上相应的偏移
    • 将读出的值再加上偏移 x 作为地址,然后将地址向下取整做 4 字节对齐
    • 从计算出的地址的值读入到 R0 寄存器中

条件和标志位响应

CPSR 寄存器

CPSR 寄存器结构如下图所示:
在这里插入图片描述
各标志位含义:

  • N,bit[31]
    若运算结果为 0 或正数则该该标志位置 0,若运算结果为负数则该标志位置 1 。
  • Z,bit[30]
    运算结果为 0 则置 1,否则置 0 。
  • C,bit[29]
    无符号数溢出,加法溢出置 1,减法溢出置 0
  • V,bit[28]
    有符号数溢出
  • T
    • T = 0 表示 Arm 模式
    • T = 1 表示 Thumb 模式。

注意:指令是否影响标志位取决于是否是否加 S 后缀(大多数情况,具体看指令硬编码第 20 位是否置 1),比如 MOV 不影响标志位但 MOVS 影响标志位。

执行条件

cond 标志的值及其对应含义如下表所示:
在这里插入图片描述
cond 标志位位于指令硬编码的高 4 比特,在执行时根据标志寄存器决定该指令是否执行。

MOV 指令

MOV 不访问内存,因此操作数只能是寄存器或立即数。

MOV 立即数

由于 ARM 汇编指令长度的影响,对立即数范围有严格的限制。允许 MOV 的立即数有如下几类:

  • 立即数不超过 16 位
    在这里插入图片描述
    该指令在给寄存器低 16 比特赋值的同时会将寄存器高 16 比特清零。
  • 立即数可以用 不超过8 比特的数循环右移不超过 32 的偶数得到
    在这里插入图片描述
    其中 imm12 中的低 8 比特是需要循环右移的数,高 4 比特乘 2 是需要循环右移的次数。
  • (MOVT)立即数不超过 16 位且需要移动到寄存器高 16 位(通常与 MOV 配合使且应当先 MOV 后 MOVT)
    在这里插入图片描述
    该指令在给寄存器高 16 比特赋值的同时不会将寄存器低 16 比特清零。

MOV 寄存器, 寄存器

  • 寄存器 + 立即数移位
    在这里插入图片描述
    例如 MOV R0, R1,LSL#4 ,该指令等同于 LSL R0, R1,#4
    移位类型由 stype 决定,移位的值为 imm5 。
  • 寄存器 + 寄存器移位
    在这里插入图片描述
    例如 MOV R0, R1,LSR R2 ,该指令等同于 LSR R0, R1,R2

基本整型运算

相关指令

  • ADD:加
    • ADR:PC 与操作数相加结果放入结果寄存器中
    • ADRL:伪指令,与 ADR 相似,不过通过类似 MOV + MOVT 的方式使得寻址范围更大
    • CMN:加,只影响标志寄存器
  • SUB:减
    • CMP:减,只影响标志寄存器
  • RSB :反减
  • AND:与
    • TST:与,只影响标志寄存器
  • BIC:第二个操作数与第三个操作数的反码逻辑与结果放在第一个寄存器中
  • ORR:或
  • EOR:异或
    • TEQ:异或,只影响标志寄存器
  • LSL:逻辑左移
  • LSR:逻辑右移
  • ASR:算术右移

ADD 指令(举例)

  • ADD 立即数
    在这里插入图片描述
    这里 12 比特长的立即数与前面 MOV 的机制一样,采用移位的方式将其扩展为 32 位范围。
  • ADD 寄存器,立即数移位
    在这里插入图片描述
    与 MOV 机制相同,例如 ADD R0, R1, R2,LSL #4
  • ADD 寄存器,寄存器移位
    在这里插入图片描述
  • ADR
    本质还是 ADD,不过被加数为 PC 寄存器。由于设计到读 PC 寄存器,因此根据当前所处的模式,读出来的 PC 寄存器的值会加上相应的偏移。

访存指令

数据流向

  • LDR:内存 -> 寄存器
  • STR:寄存器 -> 内存

操作的寄存器和内存地址

  • 寄存器:LDR R0, [R1]
  • 寄存器 + 偏移(立即数):LDR R0, [R1,#4]
    在这里插入图片描述
    • 12 位立即数即偏移,不存在移位扩展。
    • U 为立即数的正负号。
    • P = 0 则外偏移,W = 1 则内偏移,内外偏移不能同时存在。
  • 寄存器 + 移位偏移(寄存器):
    • LDR R0, [R1,R2,LSL #4]
      在这里插入图片描述

    • LDR R0, [R1,R2,LSL R3]

后续的附加行为

  • 内偏移:LDR R0, [R1,#4]!
    该指令表示将 [R1+4] 赋值给 R0 ,然后将 R1 的值设为 R1 + 4
  • 外偏移:LDR R0, [R1],#4
    该指令表示将 [R1] 赋值给 R0 ,然后将 R1 的值设为 R1 + 4

注意:外偏移和内偏移不能同时存在。

根据附加附加行为性质可知:

  • PUSH R0 相当于 STR R0, [SP,#-4]!
  • POP R0 相当于 LDR R0, [SP],#4

块访存指令

指令结构

LDM\STM+后缀 寄存器(!), {寄存器组}

  • LDM 表示将寄存器指向的地址的数据依次存放在寄存器组中。
  • STM 表示将寄存器组中的数据依次存放在寄存器指向的地址。
  • 寄存器组可以写作范围,比如 {R0-R4} ;也可指定具体寄存器,比如 {R0,R2,R3}。但是读写操作是按照寄存器下标的顺序依次操作寄存器组中的寄存器(编号小的在低地址),因为指令对应硬编码无法体现出寄存器组的顺序。

以 LDM 为例:
在这里插入图片描述

后缀类型

在这里插入图片描述

  • I 表示地址加;D 表示地址减。
  • A 表示先读写内存,再改变指向;B 表示先改变指向,再读写内存。
  • 带 ! 表示修改的指向写入寄存器;不带 ! 表示修改的指向不写入寄存器。
  • 如果操作地址寄存器为 SP 时LDMFD 相当于 LDMIA ;STMFD 相当于 STMDB 。

根据不同后缀类型的性质可以确定如下用法:

  • STMFD 相当于 PUSH
  • LDMFD 相当于 POP
  • STM\LDMIA 可以快速复制内存

分支和模式切换

B + imm

在这里插入图片描述

  • 跳转目标:立即数
  • 模式切换:不带模式切换
  • 写入 LR 的值:不影响 LR 寄存器

指令编码的立即数为目标地址与 PC 寄存器的差值除 4 。由于涉及读 PC 寄存器,因此根据当前模式要加上相应的偏移。跳转范围为 PC 值加上正负 32M 的偏移。

BL + imm

在这里插入图片描述

  • 跳转目标:立即数
  • 模式切换:不带模式切换
  • 写入 LR 的值:下一条指令的地址 | T 标志位

BX + reg

在这里插入图片描述

  • 跳转目标:寄存器中的值去掉最低一位
  • 模式切换:跳转时将寄存器中存储的地址的最低一位写入 T 标志位
  • 写入 LR 的值:不影响 LR 寄存器。

BLX + imm

在这里插入图片描述

  • 跳转目标:立即数
  • 模式切换:一定切换模式
  • 写入 LR 的值:下一条指令的地址 | T 标志位

BLX + reg

在这里插入图片描述

  • 跳转目标:寄存器中的值去掉最低一位
  • 模式切换:跳转时将寄存器中存储的地址的最低一位写入 T 标志位
  • 写入 LR 的值:下一条指令的地址 | T 标志位

拓展

  • BX regMOV PC, reg 的区别:BX 可以切换模式,MOV 不能切换模式。
  • LDR PC, [R0]:可以做模式切换,常用于 PLT 表中调用 GOT 表中对应的函数地址(最低位表示模式)。
  • LDMFD SP!, {R11,PC}:同样可以做模式切换,常与 STMFD SP!, {R11,PC} 一起用于函数调用时保存栈帧和返回地址。

Thumb 模式

特点

  • 段指令一般不使用 R8-R12
  • 一般没有条件码和标志响应位,指令默认影响标志位
  • 运算指令优先对第一,第二操作数相同情况有短指令编码。对于 STMFD 和 LDMFD,如果以 SP 寄存器的值作为地址则简写为 PUSH 和 POP 。

IT 块

在这里插入图片描述

结构如下图:
在这里插入图片描述
IT 指令的 mask 编码为从高到低,T 为 0,E 为 1 ,最后填一个 1 表示结束。比如 ITTEE EQ 的 mask 的二进制形式为 0111

调用约定

  • 前 4 个参数:R0-R3,其它参数栈传递
  • 非异变寄存器:R4-R11,使用此类寄存器的函数负责恢复寄存器原来的值。
  • R11:栈帧指针,类似 EBP。
  • R12:导入表寻址

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

欣奥诚分享:企业最应避讳这八类广告宣传词汇

广告宣传中,企业最应避讳这八类词汇 众所周知,拥有一个朗朗上口、脍炙人口的广告标语、广告口号,对于企业战略部署、发展壮大具有最要作用。一个好的广告标语,不仅可以传达产品买点、展现品牌魅力,激发购买欲望&#…

安装多版本node

一、安装多版本node的原因: 在项目开发过程中,不同项目使用的nodejs版本不同,有时会因为node版本过高或太低,导致报错; 解决方式 利用nvm进行管理(本文使用此种方式)配置环境变量(如…

iOS 组件化开发----(一)图片资源管理的方式

1.直接拖拽到工程,勾选Target membership 1)Resource 的使用方式 将文件直接拖入到工程目录下, 并告诉Xcode打包项目时候把这些图片文件打包进去. 这样在应用的".app"文件夹中就有这些图片. 在项目中, 读取这些图片可以通过以下方式来获取图片…

JavaWeb开发(一)——maven仓库

一、maven仓库 1、maven的定义 Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。 2、maven的约定配置 -- /src/main/java //项目java源代码 -- /src/main/resources //项目的资源文件,比如springmvc.xml -- /src/…

极狐gitlib的安装和使用

极狐gitlib的安装和使用一、实验环境二、安装部署(不带邮箱)三、一些操作3.1 常用命令3.2 备份3.2.1 备份文件分为两步:3.2.2 自定义备份位置3.3 恢复3.4 一些问题3.5 包含的组件四、使用极狐gitlib4.1 初始登录说明4.2 新建用户4.3 新建一个…

CSS之文字样式

1、字体类型设置 标签名&#xff1a;font-family注意&#xff1a;英文字体只适用于英文&#xff0c;中文字体可以适用中文和英文代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-…

Linux学习-81-Apache安装过程

17.9 Apache安装过程 Apache&#xff1a;作为LAMP架构的前端是一款功能强大&#xff0c;稳定性好的Web服务器程序&#xff0c;该服务器直接面向用户提供网站访问&#xff0c;发送网页&#xff0c;图片等文件内容。之前的名称就叫做 Apache&#xff0c;不过后来改名字叫做 httpd…

如何将Unity开发的AR程序编译到IPad/iPhone上真机运行

如何将Unity项目编译成iOS app&#xff0c;并在ipad或者iphone上真机运行呢&#xff1f;大体步骤分为三步&#xff1a; 使用Unity生成 .xcodeproj 文件使用XCode将AR APP编译到IPad/iPhone在真机上设置开发者模式和信任开发者 我的环境&#xff1a; 使用MacBook Pro 进行开发…

分布式操作系统 - 7.分布式一致性与复制管理

文章目录1.一致性与复制1.1 对象复制问题&#xff08;1&#xff09;单副本对象的同步控制&#xff08;2&#xff09;单副本同步控制方法&#xff08;3&#xff09;多副本对象的同步控制方法1.2 支持伸缩性的复制技术2.以数据为中心的一致性模型2.1 分布式数据仓&#xff08;dat…

Redis框架(五):大众点评项目 商品目录 添加Redis缓存

大众点评项目 商品目录 添加Redis缓存需求&#xff1a;基于Redis查询商品信息业务实现给商品添加缓存给店铺类型添加缓存总结和业务流程SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则…

Vue Demi是如何让你的库同时支持Vue2和Vue3的

Vue Demi是什么 如果你想开发一个同时支持Vue2和Vue3的库可能想到以下两种方式&#xff1a; 1.创建两个分支&#xff0c;分别支持Vue2和Vue3 2.只使用Vue2和Vue3都支持的API 这两种方式都有缺点&#xff0c;第一种很麻烦&#xff0c;第二种无法使用Vue3新增的组合式 API&am…

【Redis】Redis跳表与实现源码解析(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

Tomcat下载和安装

下载 Tomcat官网网址 我选择的是8&#xff0c;根据自己需要选择不同版本 选择64位下载 下载有点慢&#xff0c;等一会儿就行 安装 首先确认安装了JDK&#xff1a;命令行窗口输入java -version 配置Tomcat环境变量 配完之后验证是否成功。 winR->cmd->输入startup.bat…

什么是社交新零售?社交新零售的底层商业又是逻辑是什么?

一千个品牌商心中&#xff0c;有一千个新零售——自从马云2016年10月提出新零售的概念后&#xff0c;电商平台、传统商超、电商品牌、线下品牌&#xff0c;汹涌而至&#xff0c;都想搭上“新零售快车”。 新零售模式是依靠于大数据的开发应用&#xff0c;国内新零售模式发展多年…

Node.js快速入门

一、简介 1、什么是Node.js 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Google的V8引擎&#xff0c;V8引擎执行Javascript的速度非常快&#xff0c;性能非常好。 2、Node.js有什么用 如果你是一个前端程序…

【有料c++题目周刊 | 第一期】希腊诸神

文章目录第一题&#xff1a;珀耳修斯点金题目描述输入描述输入示例输出描述输出示例解题思路&C题解第二题&#xff1a;女神赫拉题目描述输入描述输入示例输出描述输出示例解题思路&C题解第一题&#xff1a;珀耳修斯点金 题目描述 某希腊神话故事中&#xff0c;有一个…

物联网通信技术|课堂笔记week2-2|9月7日·21日

sudo ifconfig bridge101 hw ether 9e:3e:53:38:45:66 目录 Linux网络管理命令 (1)route (2)ip (3)netstat (4)ping ​​​​​​两台电脑连起来后ping不通? (5)telnet (6)ssh (7)wget Linux网络管理命令 (1)route 路由为互联网的中转站 静态路由 动态路由 rout…

Go代码审计学习(一)

文章目录Vulnerability-goapp/assets// 根目录/login/new/top/profile/profile/edit/upload/post /timeline/timeline/searchpost/adminconfirm /adminlogin /adminusersCSRF网上有关Go的代码审计好少哇&#xff0c;能找到的文章也不多&#xff0c;害&#xff0c;没办法也得学 …

网络协议—应用层的HTTP协议

URL&#xff0c;叫作统一资源定位符。之所以叫统一&#xff0c;是因为它是有格式的。HTTP 称为协议&#xff0c;www.163.com 是一个域名&#xff0c;表示互联网上的一个位置。正是因为这个东西是统一的&#xff0c;所以当你把这样一个字符串输入到浏览器的框里的时候&#xff0…

软件测试是要学习什么技能?

推荐阅读&#xff1a; 2022年简历石沉大海&#xff0c;软件测试行业当前找工作有多难&#xff1f; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ 在确定软件开发可行的状态下&#xff0c;对软件是要实现的各个功能做到详细分析。要求分析阶段是一个很…