ARM64逆向基础

article/2025/9/17 1:26:28

为什么要学ARM64?

android 5.0系统就开始引入Arm64-v8a,它用于支持全新的AArch64架构,这个架构也就是我们要学习的arm64汇编。目前android系统已经发展到anroid 11版本。因此现在主流的apk都是支持AArch64架构。那么我们利用IDA(反汇编工具)进行静态逆向分析so文件、或者IDA动态调试so文件,都需要和arm64汇编代码打交道,因此对于学习掌握好ARM64汇编对阅读反汇编代码能达到事半功倍的效果。

ARM64汇编由什么组成的?

• 汇编中共有34个寄存器。其中包括31个通用寄存器、SP寄存器、PC寄存器,CPSR寄存器。•31个通用寄存器中:
X0-X30:表示是64位的寄存器。
W0-W30:表示是32位的寄存器。•X31 : 也称为零寄存器(它一般用于变量的初始化),它也有两表现形式:XZR:表示是64位的零寄存器, 它在内存中是用8个字节存储。WZR:表示是32位的零寄存器,它在内存中是用4个字节存储。•SP : 保存栈指针(栈顶指针),使用SP或WSP来进行对SP寄存器的访问,也就是用于操作局部变量地址。•PC:程序计数器(PC指针寄存器),它用于指向即将要执行的下一条指令。•CPSR:状态寄存器•FP(X29):保存栈帧地址(栈底指针)•LP(X30):通常称X30为程序的链接寄存器,保存子程序结束后需要执行的下一条指令。

通用寄存器作用是什么?

图片

•在汇编代码中使用 X0 - X30寄存器进行访问操作数据时,它就表示的是一个64位的数据。•在汇编代码中使用 W0 - W30寄存器进行访问操作数据时,它表示的是一个32位的数据。

图片

 

栈寄存器是什么怎么用?

1.栈结构及作用?

栈是一种具有特殊的访问方式的存储空间,先进后出(后进先出),它是从高地址到低地址的, 栈底是高地址,栈顶是低地址。
它的主要的作用:用于存放参数和局部变量(临时变量)。

 2. 栈寄存器表示指令有那些?

SP:栈顶寄存器
FP:栈底寄存器

 3. 操作栈寄存器的有那些指令?

STP指令:表示入栈指令
LDP指令:表示出栈指令
入栈操作的汇编代码片段

图片

出栈操作的汇编代码片段

图片

状态寄存器由那些状态组成?

ARM64的汇编指令集中,有一部分指令的执行时影响状态寄存器的,比如add、sub、or汇编指令等,他们大都是运算指令(进行逻辑或算数运算)

图片

CPSR的低8位(包括I、F、T和M[0~4])称为控制位,程序无法修改,除非CPU运行于特权模式下,程序才能修改控制位! N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。

 1. N(Negative)标志

CPSR的第31位是 N,符号标志位。它记录相关指令执行后,其结果是否为负。如果为负 N = 1,如果是非负数 N = 0。

 2. Z(Zero)标志

CPSR的第30位是Z,零标志位。它记录相关指令执行后,其结果是否为0。如果结果为0,那么Z = 1;如果结果不为0,那么Z = 0。

 3. C(Carry)标志

CPSR的第29位是C,进位标志位。一般情况下,进行无符号数的运算。
加法运算(add指令):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。减法运算(sub指令):当运算时产生了借位时(无符号数溢出),C=0,否则C=1。

4. V(Overflow)溢出标志

CPSR的第28位是V,溢出标志位。在进行有符号数运算的时候,如果超过了机器所能标识的范围,称为溢出。
下面几种情况会出现溢出
正数 + 正数 为负数 溢出
负数 + 负数 为正数 溢出
正数 + 负数 不可能溢出

ARM64特有的汇编指令

•adrp指令(address page)

它是一条地址读取指令,是用于计算指定的数据地址到当前PC值的相对偏移。
下面是它具体的用法及解释

图片

得到一个大小为4KB的页的基址,而且在该页中有全局变量g的地址;ADRP就是讲该页的基址存到寄存器X6中;
ADD指令会算出g的地址,X6+#_g@PAGEOFF,#_g@PAGEOFF是一个偏移量;这样就得到了g的地址X6;

•内存读写指令(ldr、ldur、ldp, str、stur、stp)

STR、STP、STUR为存储数据指令(注:以ST开头的表示为存储指令)
LDR、LDP、LDUR为取出数据指令(注:以LD开头的表示为取出数据)
以下是具体指令说明及汇编代码分析
STR指令:将数据从寄存器中读出来,存储到内存中。
STUR指令:将寄存器中的负数数据读取出来,存放到内存中。
STP指令:表示入栈指令。

 

图片

LDR指令:将数据从内存中取出来,存放到寄存器中。
LDUR指令:将内存中负数的数据取出来,并存放到寄存器中。
LDP指令:表示出栈指令

图片

ARM64汇编的函数有那些需要重点关注?

 

 

1.函数调用约定是什么约定?
ARM64使用的是ATPCS(ARM-Thumb Procedure Call Standard/ARM-Thumb过程调用标准)的函数调用约定。2.函数需要用到到的指令有那些?
B:无条件跳转,一般是函数内部的if、switch条件判断的跳转
Bl:带函数返回值的跳转,一般是用于调用其他的函数。RET:子程序返回指令,返回地址默认保存在X30寄存器(LR链接寄存器)
LR:保存子程序结束后需要执行的下一条指令
PC:表示当前执行的指令的地址。3.函数的参数怎么存储传递?
3.1. 通常情况下函数的参数存放在X0-X7(32位的为W0-W7)这8个寄存器,如果函数参数超过8个,那么就需要用到栈存储的方式来存储参数。
3.2. 函数参数如果少于8个参数的那么依次从左往右传参,如果多于8个的参数那么依次从右往左进行入栈的。
3.3 函数中8个参数和9个参数的具体情况(不过在开发过程中参数超过8个的情况是比较少的,因此在逆向过程中这种超过8个参数的情况也会比较少的)      3.3.1函数中有八个参数的,直接用寄存器W0-W7表示       源代码:

图片


       ARM64汇编代码:

图片

      3.3.2 函数中有九个参数的,需要用栈寄存器来传递参数     源代码:

图片

     ARM64汇编代码:

图片

4.函数中的堆栈怎么平衡?
堆栈平衡需要被调用者进行恢复平衡。       

图片

图片


5.函数的返回值怎么进行接收?
函数的返回值通常情况下是存放在X0寄存器里面,ret将X0寄存器的地地址值放入X30寄存器(也就是LR链接寄存器)。

图片

 

安卓逆向之ARM汇编基础

 

大佬们留个关注再走呗,后续精彩文章不断图片

图片


http://chatgpt.dhexx.cn/article/mW9UueQy.shtml

相关文章

第一章 QEMU虚拟机与ARM64平台搭建

系列文件目录 《ARM64体系结构结构编程与实践》学习与应用记录 第一章 QEMU虚拟机与ARM64平台搭建 文章目录 系列文件目录本章前言一、ubuntu虚拟机安装1.ubuntu20.04镜像下载2.镜像安装3.工具安装 二、代码下载1.git配置2.runninglinuxkernel代码下载3.代码编译 总结 本章前言…

搭建arm64的qemu环境

说明 qemu在调试内核方面还是比较方便、效率的。以前基本上多是用arm32的平台,网上大部分资源也是关于arm32的。现在arm64的也比较普遍了,最近刚好要看一些内核的东西,花了2天的时间搭建了这个环境,希望看到的朋友少走弯路&#…

x86_64(intel64、amd64)和ARM64的区别以及发展

文章目录 区别引用 区别 ARM64架构 ARM 公司研发的,用的是精简指令集(追求节能,低功耗)。通常用于手机、平板等CPU,目前笔记本电脑也会采用ARM64构架的CPU,比如mac m1就是arm64(查看命令:uname…

x86 x64 arm64的区别

x86 x64 arm64的区别 源地址:https://www.cnblogs.com/zhaoqingqing/p/13145115.html 我们常说的高通 865,麒麟990 不是 CPU 是 SoC(System On Chip),SoC 除了 CPU 外,还有 GPU,还有可选的浮…

Python线性方程求解-矩阵左除“\“、右除“/“

目录 1 线性方程组求解方法 2 左除“\”→AxB 3 右除"/"→xAB 4 其它说明 1 线性方程组求解方法 如果AxB,则xA\B,称为左除;如果xAB,则xB/A,称为右除。 式中x为未知数。一般情况下,左除用的系…

Matlab:用矩阵的除法替代逆运算的操作(inv)

在matlab中直接用逆运算常常会提示,建议用矩阵的左除或右除替换,因为inv(A)*b速度更慢且准确度更低。 matlab中部分详细信息:为了求解线性方程组,矩阵的逆主要是理论值。 切勿使用矩阵的逆 ,即 x inv(A)*b 来求解线性…

逆矩阵的概念、应用和求解

目录 逆矩阵的概念 求解逆矩阵 应用例子 可能没有逆矩阵 求解逆-方法1:初等行运算(高斯-若尔当) 求解逆-方法2:余子式、代数余子式和伴随 求解逆-方法3:程序库 逆矩阵的概念 矩阵运算中,…

利用矩阵的逆(伪逆)与除法求解

利用矩阵的逆(伪逆)与除法求解: 对于线性方程组Axb,若其为恰定方程组且A是非奇异的,则求x最明显的方法便是利用矩阵的逆,即xA\b;若不是恰定方程组,则可利用伪逆来求其一个特解。 运用pinv命令…

9、矩阵的简单运算

目录 一、矩阵的加减运算 二、矩阵的乘方运算 1.数与矩阵的乘法 2.矩阵与矩阵的乘法 三、矩阵的除法 四、矩阵的幂运算 五、矩阵元素的查找 六、矩阵元素的排序 七、矩阵元素的求和 八、矩阵元素的求积 九、矩阵元素的差分 一、矩阵的加减运算 进行矩阵加法、减法运…

矩阵的相乘与相除

这里写自定义目录标题 矩阵的数组乘/除及乘方参与除运算的两个矩阵同维时参与运算的矩阵有一个标量时数组乘方的运算规则Matlab的符号计算:Matlab画图 矩阵的数组乘/除及乘方 参与除运算的两个矩阵同维时 运算为矩阵相应的元素相除 参与运算的矩阵有一个标量时 …

矩阵乘法

两个矩阵可以相乘&#xff0c;必须满足的条件是&#xff1a;左边矩阵的列等于右边矩阵的行 如&#xff1a;一个3x4的矩阵和一个4x2的矩阵相乘&#xff0c;得到一个3x2的矩阵&#xff1b; 矩阵乘法函数&#xff1a; mat3 add(mat1 A,mat2 B){mat3 ans; for(int i0;i<s1;i)f…

算法——矩阵算法

目录 一.矩阵快速幂&#xff08;1&#xff09;矩阵定义&#xff08;2&#xff09;加法运算&#xff08;3&#xff09;减法运算&#xff08;4&#xff09;数乘&#xff08;5&#xff09;P3390 【模板】矩阵快速幂 二.矩阵求斐波那契数列三.[一个详解矩阵各种高难应用的博客] 一.…

python中的除法运算_python中矩阵除法运算的三种实现方法

介绍过python矩阵的乘法运算&#xff0c;numpy库中虽然乘法是矩阵运算的主要运算&#xff0c;但是numpy作为python中实现矩阵运算的好工具&#xff0c;也是可以轻松实现除法计算的&#xff0c;本文python中矩阵除法的三种实现方法&#xff1a;1、x/y计算对应元素相除(矩阵点除)…

矩阵算法之矩阵乘法

矩阵算法在图像处理、神经网络、模式识别等领域有着广泛的用途。 在矩阵乘法中&#xff0c;A矩阵和B矩阵可以做乘法运算必须满足A矩阵的列的数量等于B矩阵的行的数量。 运算规则&#xff1a;A的每一行中的数字对应乘以B的每一列的数字把结果相加起来。 定义 注意事项 1、当矩阵…

MATLAB数值计算——矩阵运算乘法、除法、乘方

一、矩阵 矩阵是线性代数的基本单元矩阵含有M行N列数值矩阵中的元素可以是实数或复数矩阵相关的基本运算&#xff1a;加、减、内积、逆矩阵、转置、线性方程式、特征值、特征向量、矩阵分解 二、矩阵的运算 2.1、矩阵的乘法运算 运算符&#xff1a; * %矩阵乘法 …

第三章 矩阵运算

矩阵运算 生成矩阵如何生成数值矩阵 如何生成复数矩阵矩阵变换矩阵求值矩阵的特征值和特征向量稀疏矩阵 矩阵是数组的一种表现形式。 生成矩阵 两种方式&#xff1a;1.枚举式直接赋值法。2.用函数 如何生成数值矩阵 1.实数矩阵输入规则 所有元素都要放在“[ ]”中&#xff1…

两个元素的矩阵乘除法

矩阵的乘除法&#xff1a; 1 矩阵相乘&#xff0c;两个矩阵只有当左边的矩阵的列数等于右边矩阵的行数时,两个矩阵才可以进行矩阵的乘法运算 主要方法就是&#xff1a;用左边矩阵的第一行&#xff0c;逐个乘以右边矩阵的列&#xff0c;第一行与第一列各个元素的乘积相加&#x…

线性代数代码实现(六)矩阵除法(C++)

前言&#xff1a; 距离上一篇文章发布已经五天过去了&#xff0c;在这里先给一直等待的伙伴们说声抱歉&#xff0c;因为博主最近的事情很多&#xff0c;只好暂时停更&#xff0c;望大家理解&#xff01;上一篇文章中&#xff0c;我们介绍了求解逆矩阵的方法&#xff0c;我提到&…

Comsol 2020全套教学视频 教程入门讲解新手的福音

本视频为官方中文教学视频&#xff0c;给各位想学仿真的同学提供一点福音。本培训视频共有59个视频&#xff0c;本分享提供了前4节基础强化视频&#xff0c;如有需要剩下的各个板块的内容请评论区留言。 百度云链接&#xff1a;https://pan.baidu.com/s/16CdQY77zJ2akNpJxNTlvO…

COMSOL中文指导教程全集

个人体会&#xff0c;学习COMSOL&#xff0c;案例教学最有效&#xff0c;首先从官方案例入手&#xff0c;然后是几何建模教程、网格划分教程、后处理教程&#xff0c;学完这四个部分你基本就入门了。再结合自己的研究方向多学几个案例&#xff0c;基本就可以熟练了。 最有用的…