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种条件

条件 说明 英文 EQ 结果为0 EQual to 0 NE 结果不为0 Not Equal to 0 CS 有进位或错位 Carry Set HS 同CS unsigned Higher or Same CC 没有进位或错位 Carry clear LO 同CC unsigned LOwer MI 结果小于0 MInus PL 结果大于等于0 PLus VS 溢出 oVerflow Set VC 无溢出 oVerflow Clear HI 无符号比较大小 unsigned HIgher LS 无符号比较小于等于 unsigned Lower or Same GE 有符号比较大于等于 signed Greater than or Equal LT 有符号比较小于 signed Less Than GT 有符号比较大于 signed Greater Than LE 无符号比较小于等于 signed Less than or Equal AL 无条件(默认) Always
  • “cound”的用法很简单,例如
cmp R0,R1mov GE R2,R0mov LT R2,R1

比较R0和R1的值,如果R0大于R1则R2=R2;否则R2=R1

  • “s”的作用是指定指令“op”是否设置flag,共有下面4中flag;
指令 说明 N(Negative) 如果结果小于0则置1,否则置0 Z(Zero) 如果结果是0则置1,否则置0 C(Carry) 对于加操作(包括CMN)来说,如果产生进位则置1 ,否则置;对于减操作(包括CMP)来说,Carry相当于Not-Borrow,如果产生借位则置0 ,否则置1 ,对于有位移操作的非加/减操作来说,C置移出值得最后一位;对于其他的非加/减操作来说,c的值一般不变; V(oVerflow) 如果操作导致溢出,则置1,否则置0

注意: 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种:

符号 说明 B(unsigned Byte) 无符号byte(执行时扩展到32bit,以0填充) SB(Signed Byte) 有符号byte(仅用于LDR指令,执行时扩展到32bit,以符号位填充) H(unsigned Halfword) 无符号halfword(执行时扩展到32bit,以0填充) SH(Signed Halfword) 有符号halfword(仅用于LDR指令;执行时扩展到32bit,以符号位填充)

如果不指定“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中变化规律:如下

符号 说明 IA(Increment After) 每次传输后增加Rd的值 IB(Increment Before) 每次传输前增加Rd的值 DA(Decrement After) 每次传输后减少Rd的值 DB(Decrement Before) 每次传输前减少Rd的值

分支指令

分支指令可以分为无条件分支和条件分支两种

  • 无条件分支
B Label             ;//PC = LabelBL Label            ;//LR = PC - 4; PC = LabelBX Rd               ;//PC = Rd 并切换指令集
  • 条件分支

上面已经罗列,不在重复叙述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝极速退款后商家拒收快递怎么办 运费险退到天猫垫付账户了怎么办 淘宝卖家食品有问题该怎么办 美团外卖不要辣椒给放了怎么办 旺旺卖家拒收我的消息怎么办 淘宝清空购物车大奖到上限了怎么办 游戏无响应除了退出还能怎么办 淘宝给差评了卖家一直打电话怎么办 电脑说带宽问题无法观看视频怎么办 手机淘宝上的购买信息删除了怎么办 为什么支付宝有钱淘宝付不了怎么办 苹果平板电脑上的淘宝点不开怎么办 淘宝付了两次款只有一个订单怎么办 淘宝付款显示支付宝账号异常怎么办 手机老卡换新卡淘宝付不了款怎么办 淘宝买东西退款卖家拒绝退款怎么办 淘宝店铺收藏图片怎么点不了怎么办 手机淘宝显示用户被限制登录怎么办 淘宝设置登录密码原密码忘了怎么办 斑马智行淘宝号换没法登录了怎么办 淘宝卖家手机版显示宝贝不全怎么办 在电脑上登的淘宝账号退不了怎么办 淘宝买家退款不退货写假货怎么办 淘宝卖家已发布商品没货了怎么办 京东换货附近没有京东自提点怎么办 一直显示手机淘宝已停止运行怎么办 唯品会买了不可以退货的衣服怎么办 淘宝店卖东西邮费太贵怎么办 支付宝登录上去必须手机验证怎么办 支付宝里的钱被盗了怎么办 淘宝绑定的支付宝账号忘记了怎么办 支付宝绑定的微博账号忘记了怎么办 怎么知道自己的淘宝密码忘了怎么办 更换扣扣头像图片太大放不下怎么办 每次登入淘宝都要手机验证码怎么办 手机停机收不到唯品会验证码怎么办 魅蓝手机账户密码忘了怎么办 支付宝登录失败请稍后再试怎么办 万王之王3d限制注册了怎么办 绑定手机号无法登陆以前微信怎么办 手机号注册了淘宝如果不用了怎么办