Arm 汇编

LDR load data to register
BL break with linker

寄存器和指令基本格式

  1. save Desktop 保存 opcode 长度,不用每次重新设置
  2. maps 中,内存地址前 1/4 给用户用,后 1/4 给内核用
  3. ARM 没有隐式内存操作指令,X86 直接通过栈操作,改变内存
  4. 0-3 个操作数,内存操作数和立即数操作数不能同时存在,内存操作数(中括号包含)至多出现 1 次,寄存器操作数总在最前
  5. 有=号,内存操作数,是伪指令,需要上下文,{Rx,Rx,Rx }寄存器操作数组,loc_xx 立即数操作数
  6. PSR 标志寄存器,常见位 N 正负数 Z 0 标志位 C 进位 V 溢出

读 PC 寄存器

  1. 读 arm PC,读出来的值就是 PC 值+8,不是严格的三级流水,预取指令,thumb+4 arm+8 ,典型反例(thumb 中一条指令 4 一条指令 2)
  2. F7 调试使用 CC 断点实现,UDF 异常,通过在要调试行下一行下异常,进行断点调试
  3. thumb 指令四字节对齐,PC 寻址,需要先四字节对其,如果没有对齐,向下取整
  4. MOV R0,PC MOV PC,R0 LDR R0,[PC,#4]

条件和标志位响应

N  当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零.
Z  Z=1表示运算的结果为零,Z=0表示运算的结果非零。
C  可以有4种方法设置C的值:
   加法运算(包括CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
   减法运算(包括CMP):当运算时产生了借位时(无符号数溢出),C=0,否则C=1。
   对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
   对于其它的非加/减运算指令,C的值通常不会改变。
V  可以有2种方法设置V的值:
   对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
   对于其它的非加/减运算指令,V的值通常不会改变。

N 正负数 Z 0 标志位 C 进位 V 溢出
无符号 Higher lower
有符号 Greater less

cond Mnemonic extension integer floating-point conditional flags
0000 EQ Equal Equal Z == 1
0001 NE Not Equal Not Equal,or unordered Z == 0
0010 CS^b Carry set Greater than,equal,or unordered C == 1
0011 CC^C Carry clear Less than C == 0
0100 MI Minus,negative Less than N == 1
0101 PL Plus,positive or zero Greater than,equal or unordered N == 0
0110 VS Overflow Unordered V == 1
0111 VC No overflow Not unordered V == 0
1000 HI Unsigned higher Greater than,or unordered C == 1 and Z == 0
1001 LS Unsigned lower or same Less than or equal C == 0 or Z == 1
1010 GE Signed greater than or equal Greater than or equal N == V
1011 LT Signed less than Less than, or unordered N != V
1100 GT Signed greated than Greater than Z == 0 and N ==V
1101 LE Signed less than or equal Less than,equal,or unordered Z == 1 or N != V
1110 None

带s的指令 影响标志位
CMP CMN 只更新标志位

MOV 指令

MOV r0,0x40000000 01 01 A0 E3 0x10000000 = 0x01 ROR 2*01
MOV r0,0x80000000 02 01 A0 E3 0x10000000 = 0x02 ROR 2*01
MOV r0,0x10000000 02 02 A0 E3 0x10000000 = 0x02 ROR 2*02

movt 写寄存器的高16位 与mov一起操作,完成32位的数据写入
实际c语言中,ldr指向一个地址,地址是一个DCD数据,向寄存器赋值
mov 支持shift  MOV R0,R1,LSL#4
可以理解成移位指令是MOV的宏

stype表示,逻辑左移,逻辑右移,算术右移,循环移位
           LSL      LSR      ASR      ROR

基本整形运算

ADD(ADR,ADRL),SUB(CMP),RSB(反减),AND(TST),BIC(反AND),ORR(或),EOR异或(TEQ),LSL,LSR,ASR

ADR R12,0x508 = ADD R12,PC,0
ADD 12位立即数
RSB 反减

访存指令

LDR R0,[R1,#4]! 从R1+4表示的地址取完数据之后,还要把R1更新为R1+4 
LDR R0,[R1],#4  从R1表示的地址取完数据之后,还要把R1更新为R1+4 

push r0: str r0,[sp,#-4] 
pop r1 : ldr r1,[sp],#4

在0x5F4中
按Q键,可以将=(aHello-0x5FA),变为纯值,再加上PC,算偏移,可以得到真正的数据
aHello指向的是数据地址,因为下一句要相加PC,所以提前减掉PC+4,即0x5FA 
在实际运行时,还是加上内存中的基址

块访存指令

向指定位置,批量保存寄存器
寄存器较小的放到低地址,寄存器较大的放到高地址
FD FullDescending
IA load memory increase after 
IB increase before 
LDMIA R0,{R1-R4}
push STMDB = STMFD 栈操作时指令一样,第一个参数为sp时,优先翻译为STMFD  
pop  LDMIA = LDMFD 
IA:快速复制内存

分支和模式切换

1. 跳转目标
2. 模式切换
3. 写入LR
B   imm
BL  imm
BX  reg
BLX imm
BLX reg 
B的寻址范围 2^26

无限循环,跳转到自己, 
可以在一个elf的_start函数起始地点改为FEFFFFEA,从而可以挂载上(如果没有while的情况)

BL 把当前指令的下一条指令的地址与T位做一个或,放到LR的最低位
BX 把寄存器的值的最低为写入T标志位,所以hook的时候,很多都是直接去地址+1
blx 立即数 一定会带有模式切换

根据函数的导出地址的最低一位判断是arm实现还是thumb实现

mov pc, reg和BX的区别:
不会根据寄存器最低一位判断指令模式


LDR PC,[R0]来跳转指令,也可以更改模式

Thumb模式,IT块

短指令一般不用r8-r12,
一般没有条件码和标志响应位,
运算指令优先对第一,第二操作数相同情况时有短指令编码
.w后缀,长编码,
STMFD thumb模式下直接简化为push

movs 短编码,mov长编码

IT指令会影响紧接着的1条指令
ITTTT指令会影响紧接着的4条指令

受影响的指令可能会加上条件 STRGE

ITTET ,if then if else

T块的长度取决于,opcode中最低0-3个bit中,最右边的1距离最左边的长度

PSR中IT,IT2取决于opcode中的bit,如果都为0,则代表已经出去IT块

调用约定和栈帧分析

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容