IOS逆向--ARM/THUMB解读
来源:互联网 发布:淘宝html源代码 编辑:程序博客网 时间:2024/06/05 23:05
ARM处理器用到的指令集分为*ARM和THUMB两种;ARM指令长度均为32bit,THUMB指令长度均为16bit。所有指令可大致分为3类,分别是数据操作指令,内存指令和分支指令。*
数据操作指令
数据操作指令有一下2条规则
1. 所有操作数均为32bit
2. 所有结果均为32bit,且只能存放在寄存器中。
总的来说,数据指令的基本格式是:
op (cond) {s} Rd, Rn, Op2
其中“cond”和“s”是两个可选后缀;“cond”的作用是指定指令“op”在什么条件下执行。下面列举17种条件
- “cound”的用法很简单,例如
cmp R0,R1mov GE R2,R0mov LT R2,R1
比较R0和R1的值,如果R0大于R1则R2=R2;否则R2=R1
- “s”的作用是指定指令“op”是否设置flag,共有下面4中flag;
注意: C flag
标识无符号数运算结果是否溢出;V flag
表示有符号运算结果是否溢出。
- 算术操作
ADD R0,R1,R2 ;//RO = R1 + R2ADC RO,R1,R2 ;//RO = R1 + R2 + C(arry)SUB R0,R1,R2 ;//RO = R1 - R2SBC R0,R1,R2 ;//RO = R1 - R2 - !CRSB R0,R1,R2 ;//RO = R2 - R1RSC R0,R1,R2 ;//RO = R2 - R1 - !C
算术操作中,ADD和SUB为基础操作,其他两者皆为变种。RSB是“Reverse Sub”的缩写,仅仅是吧SUB的恋歌操作数调换了位置而已;以“C”(即Carry)结尾的变种代表有进位和借位的加减法,当产生进位和借位的加减法,当产生进位或没有借位时,将Carry flag 置 1。
- 逻辑操作
AND R0,R1,R2 ;//RO = R1 & R2ORR R0,R1,R2 ;//RO = R1 | R2EOR R0,R1,R2 ;//RO = R1 ^ R2BIC R0,R1,R2 ;//RO = R1 &~ R2MOV R0,R2 ;//RO = R2MVN R0,R2 ;//RO = ~R2
- 移位指令
LSR //逻辑左移LSL //逻辑右移ASR //算术右ROR //循环右移
- 比较指令操作
CMP R1 ,R2 ;执行R1 - R2 并依结果设置flagCMN R1 ,R2 ;执行R1 + R2 并依结果设置flagTST R1 ,R2 ;执行R1 & R2 并依结果设置flagTEQ R1 ,R2 ;执行R1 ^ R2 并依结果设置flag
比较操作其实就是改变flag的算术逻辑或逻辑操作,只是操作结果不保留在寄存器中。
- 乘法操作
MUL R4, R3 ,R2 ;//R4= R3 * R2MLA R4, R3, R2, R1 ;//R4 =R3 * R2 + R1
乘法操作的操作数必须来自寄存器。
内存操作指令
内存操作指令的基本格式是:
op {cond}{type} Rd, [Rn , Op2]
其中Rn是基址寄存器,用于存放基地址;“cond”的作用与数据操作指令相同;“type”指定指令“op”的操作的数据类型,共有如下4种:
如果不指定“type”,则默认数据类型是word
ARM内存操作基础指令只有两个:****LDR(LoaD Register)将数据从内存中读出来,存到寄存器中;STR(STore Register)将数据从寄存器中读出来,存到内存中。使用方式如下:
* LDR
LDR Rt, [Rn {,#offset}] ;//Rt = *(Rn {+ offset}), {}代表可选LDR Rt, [Rn #offset] ;//Rt = *(Rn + offset), Rn =Rn + offsetLDR Rt, [Rn] ,#offset ;//Rt = *Rn ;Rn =Rn + offset
- STR
STR Rt, [Rn {,#offset}] ;//* (Rn {+ offset}) = RtSTR Rt, [Rn, #offset] ;//* (Rn {+ offset}) = Rt ;Rn = Rn + offsetSTR Rt, [Rn],#offset ;//* Rn = Rt; Rn =Rn +offset
此外,LDR和STR的变种LDRD和STRD 可以操作双字(Doubleword),即一次性操作2次寄存器,其基本格式如下:
op {cond} Rt, Rt2, [Rn {,#offset}]
其用法与原型类似如下:
- STRD
STRD R4, R5 ,[R9,#offset] ; // *(R9 + offset) =R4 ;*(R9 + offset +4)=R5
- LDRD
LDRD R4, R5, [R9 ,#offset] ;//R4 = *(R9 + offset) ; R5 = *(R9 + offset +4)
除了LDR 和 STR 外,还可以通过LDM(LoaD Multiple)和STM(STore Multipe)进行块传输,一次性操作多个寄存器。其块传输指令的基本格式是:
op {cond} {mode} Rd{!},reglist
其中Rd是基址寄存器,可选的“!”指定Rd变化后的值是否写回Rd; reglist是一系列寄存器,用大括号括起来,他们之间可以用“,”分割,也可以用“-”标识一个范围。比如:
{R4 - R6,R8} // 表示寄存器R4,R5,R6,R8
“mode”指定Rd值得4中变化规律:如下
分支指令
分支指令可以分为无条件分支和条件分支两种
- 无条件分支
B Label ;//PC = LabelBL Label ;//LR = PC - 4; PC = LabelBX Rd ;//PC = Rd 并切换指令集
- 条件分支
上面已经罗列,不在重复叙述
- IOS逆向--ARM/THUMB解读
- ARM&THUMB
- iOS 逆向--ARM汇编
- iOS 逆向之ARM汇编
- iOS 逆向之ARM汇编
- iOS 逆向之ARM汇编
- iOS 逆向之ARM汇编
- iOS 逆向之ARM汇编
- iOS 逆向之ARM汇编
- ARM汇编基础(iOS逆向)
- iOS 逆向之ARM汇编
- iOS 逆向之ARM汇编
- iOS 逆向之ARM汇编
- ARM、THUMB指令集
- ARM、THUMB指令集
- ARM、THUMB指令集
- arm与thumb
- ARM/Thumb指令相关。
- 前端静态资源版本更新与缓存之——通过gulp 在原html文件上自动化添加js、css版本号
- C++ 多态 (纯)虚函数 虚函数表解析
- 雪花
- servlet 参考
- Android Studio生成自定义jar包(同时将assets目录打入jar包)
- IOS逆向--ARM/THUMB解读
- Windows下Git的安装和基本使用方法
- 从面试实习来产品经理与技术岗的一些区别和注意事项
- delphi窗体继承
- iOS资源库AssetsLibrary
- 最大子序列分治实现以及改进
- 时间戳转换
- maven打本地可执行jar包
- 删除nginx