Android逆向系列之ARM语法篇
指令&指令格式
31-28 | 27-20 | 19-16 | 15-12 | 11-0 |
---|---|---|---|---|
cond | opcode | Rn | Rd | Op2 |
<opcode> {<cond>} {s} <Rd>,<Rn>{,<operand2>}
例如:
ADDEQS R0,R1,#0x8;
备注: <>内的项是必须的,{}内的项是可选的
ARM指令分类
分类:
- 数据处理指令
- 数据加载/存储指令
- 分支(跳转)指令
- 程序状态寄存器指令
- 协处理器指令
- 异常产生指令
常见指令:
指令条件后缀
条件后缀影响指令是否执行,不影响指令内容和寄存器内容
编码 | 后缀助记符 | 标志位 | 定义 |
---|---|---|---|
0000 | EQ | Z=1 | 相等 |
0001 | NE | Z=0 | 不相等 |
0010 | CS | C=1 | 无符号大于或者等于 |
0011 | CC | C=0 | 无符号小于 |
0100 | MI | N=1 | 负值 |
0101 | PL | N=0 | 正值或0 |
0110 | VS | V=1 | 溢出 |
0111 | VC | V=0 | 无溢出 |
1000 | HI | C=1且Z=0 | 无符号大于 |
1001 | LS | C=0或Z=1 | 无符号小于或等于 |
1010 | GE | N和V相同 | 有符号大于或等于 |
1011 | LT | N和V不同 | 有符号小于 |
1100 | GT | Z=0且N等于V | 有符号大于 |
1101 | LE | Z=1或N不等于V | 有符号小于或等于 |
1110 | AL | 无条件 | 无条件 |
指令可选后缀
S
S:是否影响CPSR寄存器的值
例如:
R0 = 0x1 ,R3 = 0x3 ,CPSR = nzcvqIFt_SVC
SUB R1,R0,R3 ;R0的值减去R3的值,结果存入R1
SUBS R1,R0,R3 ;R0的值减去R3的值,结果存入R1,影响标识位
!
!: 是否影响基址寄存器的值
例如:
LDR R3,[R0,#4]
LDR R3,[R0,#4]!
寻址方式
- 立即数寻址
- MOV R1,#0x1
- 寄存器寻址
- MOV R1,R2
- 寄存器间接寻址
- LDR R1,[R2]
- 寄存器移位寻址
- MOV R0,R1,LSL,#1
- 基址变址寻址
- LDR R1,[R2,#4]
- 相对寻址
- BL sub_1234
- 多寄存器寻址
- LDMIA R0!,{R1-R4}
- 堆栈寻址
- STMFD R13!,{R0-R4}
数据加载/存储指令
LDR/STR
地址索引
- 前索引
- LDR R0,[R4,#0x4]
- R4+0x4的地址数据加载到R0,R4不变
- 后索引
- LDR R0,[R4],#0x4
- R4的地址数据加载到R0,R4改变,R4 = R4 + 0x4
- 自动索引
- LDR R0,[R4,#0x4]!
- R4+0x4的地址数据加载到R0,R4改变,R4 = R4 + 0x4
栈
- 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA,STMFA等。
- 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA,STMEA等。
- 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD,STMFD等。
- 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED,STMED等。
寻址方式 | 说明 | POP | LDM | PUSH | STM |
---|---|---|---|---|---|
FA | 递增满 | LDMFA | LDMDA | STMFA | STMIB |
FD | 递减满 | LDMFD | LDMIA | STMFD | STMDB |
EA | 递增空 | LDMEA | LDMDB | STMEA | STMIA |
ED | 递减空 | LDMED | LDMIB | STMED | STMDA |
Android逆向系列之ARM语法篇相关推荐
- 移动安全Android逆向系列:Dalvik概念破解实例
本篇文章是Android逆向系列的第三篇,开始介绍Dalvik虚拟机的相关知识,认识dex和smali文件格式和熟悉Dalvik字节码及指令集,对Dalvik指令集有个大概的了解就可以开始简单的反编译 ...
- Android逆向系列--JDWP协议
Android逆向系列--JDWP协议 背景 简介 使用 源码调用 参考 背景 经常会遇到各种各样需要使用jdwp知识的场景,比如调试Java源码.比如抓帧等等,这些关联知识点通常都会极其复杂,如果不 ...
- 【原创】【2021 android逆向系列】2:MIUI安装xposed问题全览(从本人简书博客移入)
书接上文[原创][android逆向系列]1:真机(小米note 3)root,本文和大家说一说MIUI安装xposed爬过的坑,以及如何安装xposed~ 一.xposed基础知识: xposed ...
- Android逆向系列(一):初探Android逆向
这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法. 谨此以本文开始记录 ...
- android逆向安全技术大全,Android逆向系列(一):初探Android逆向
这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法. 谨此以本文开始记录 ...
- Android逆向入门7——Smali语法学习(1)
这一节我们一起探讨smali语法和smali在Android逆向中的应用,它是Android逆向世界中不可或缺的一部分. 简单的来说,Dex反编译的结果就是Smali,Smali和dex之间的关系,我 ...
- Android APM 系列一(原理篇)
图片来自 https://unsplash.com 一. 前言 性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿.响应速度慢.发热严重.流量电量消耗大 ...
- Android 3D系列之基本概念篇
为了提高性能,通常还需要将浮点数组存入一个字节缓冲中.所以有了下面的操作: ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4 ...
- android逆向分析之smali语法
一 .smali数据类型 1.Dalvik字节码 Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个连续的寄存器表示: Dalvik字节码有两种类型 ...
最新文章
- ECS控制台使用小贴士
- muduo之Connector
- android手机编译可运行的linux程序
- SmartPDA图片
- RSA公钥文件(PEM)解析
- 数据分析转软件测试,(转)性能测试用户模型(三):基础数据分析、场景数据...
- 差分电荷密度怎么画_科学网差分电荷密度图、电荷局域密度图(ELF)的画
- Unity面试题精选(2)
- 代码重构(四):条件表达式重构规则
- [label][paypal] Paypal 支付页面的语言显示问题
- Spring学习之路——简单入门HelloWorld
- 树莓派 - 蓝牙 (1) 试试Beacon
- Selenium2+python自动化6-八种元素元素定位(Firebug和firepath)
- H5页面原生gps 定位获取经纬度
- 美团饿了么外卖返利CPS公众号小程序话费加油团购源码淘客APP
- 删除右键菜单中的 “上传到wps云文档”
- 新猿木子李:0基础学python培训教程 python下载文件的多种方法汇总
- svn 提交仍处于树冲突 One or more files are in a conflicted state
- Java小技巧输出26个英文字母,不用一个一个手打
- 将NX,JT, step等一些常见3维格式文件直接发布到网页上,可在线浏览
热门文章
- list 查找_趣味图解算法之二分查找
- Python对图像进行二维Gabor滤波加速
- 考研初试将近,收好这份准备清单,祝你一战成硕
- PHP依赖管理工具Composer配置安装及基本使用
- 本地函数定义是非法的_使用函数计算三步实现深度学习 AI 推理在线服务
- risc-v 编译 linux,linux - 如何为RISC-V编译Linux Kernel 4.20 - 堆栈内存溢出
- springboot做网站_Github点赞接近100k的SpringBoot学习教程+实战推荐!牛批!
- 与计算机运算速度相关参数,计算机CPU运算速度是多少
- css表格强制不换行符,css控制table单元格强制换行与强制不换行
- hive 如何将数组转成字符串_Hive 字符串操作[转]