开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比
ARM32體系中有31或33個通用寄存器,沒有特定的某種態下有r0-r15一共16個寄存器,快速中斷態下有另一組r8-r12備份寄存器,在用戶態和系統態之外其它態下都各自有一組r13-r14備份寄存器,總共33個寄存器,在特定的態下會使用其各自的特有的備份寄存器。一般用戶態常用的通用寄存器為r0-r12。而r13用作堆棧指針sp,r14用作返回地址lr,r15用作程序計數器pc。
另外還有一個狀態寄存器CPSR,在用戶態和系統態還各自有一個用于備份的SPSR寄存器,用于在退出其它態時恢復CPSR。
ARM有兩種指令集分別為arm指令和thumb指令,指令長度固定,分別是32位和16位。
arm指令不能直接對內存進行運算,沒有串傳輸指令。
arm指令可以同時對狀態標志進行判斷,如addeq, movne, bcc。我猜這個指令特性可以減少許多在運算中的跳轉,降低分支命中出錯,或避免像x86越來越復雜的指令預取和分支預測技術。
?arm和x86各有所長各有所專,系統平臺也一樣。
arm32 與 x86 寄存器類比:
| arm32 | x86 |
| r0-r7 | eax, ebx, ecx, edx, edi, esi, ebp (還少一個) |
| r8-r12 | ? |
| r13 | esp |
| r14 | ? |
| r15 | eip |
| CPSR | flags |
?
?
?
?
?
?
?
?
常用指令類比:
arm32 x86
str r0, [r1] mov [r1], r0 movl %r0, (%r1)
ldr r0, [r1] mov r0, [r1] movl (%r1), %r0
str r0, [r1, r2] ?mov [r1+r2], r0
ldr r0, [r1, r2] ?mov r0, [r1+r2]
str r0, [r1, #4] mov [r1+4],? r0
ldr r0, [r1, #4] mov r0, [r1+4]
str r0, [r1, r2, LRL #3] mov [r1+r2*8], r0
str r0, [r1, r2, LSR #3] mov r3, r2? ? ? ? ? ? ? ? ? ? ? ?x86須借用r3作中間運算
shr r3, 3
mov [r1+r3], r0
ldr r0, =0xcdcdcdcd ??mov r0, [0cdcdcdcdh]
ldr r0, [r1], #4 mov r0, [r1]
lea r1, [r1+4]
ldr r0, [r1], LRL #3 mov r0, [r1]
shl ? r1, 3
ldr r0, [r1], r2, LRL #3 mov r0, [r1+r2*8]
lea r1, [r1+r2*8]
ldr r0, [r1, #4]! lea r1, [r1+4]
?mov r0, [r1]
ldr r0, [r1, r2, LRL #3]! lea r1, [r1+r2*8]
?mov r0, [r1]
ldmfd sp!, {r0-r3} ?pop r0
pop r1??
pop r2
pop r3
stmfd sp!, {r0-r3} push r0
push r1
push r2
push r3
stmfd sp, {r0-r3} ??mov [esp], r0
mov [esp-4], r1
mov [esp-8], r2
mov [esp-12], r3
add r1, r1, r2, LRL #3 lea r1, [r1+r2*8]
add r0, r0, #4 add r0, 4
add r0, r0, r1 add r0, r1????
sub r0, r0, r1 sub r0, r1
sbc r0, r0, r1 sub r0, r1
rsb r0, r0, r1, #4 lea r2, [r1+4]
sub r2, r0
mov r0, r2
smull r0, r1, r2, r3 mov eax, r2
mul r3
mov r0, eax
mov r1, edx
smlal r0, r1, r2, r3 mov eax, r2
mul r3
add r0, eax
adc r1, edx
and r0, r0, r1 and r0, r1
orr? r0, r0, r1 or r0, r1
eor r0, r0, r1 xor r0, r1
bic r0, r0, r1 mov r2, r1
??not r2
??and r0, r2
mvn r0, r1 mov r2, r1
??not r2
??mov r0, r2
mvn r0, r1, #-1 ??mov r2, r1
neg r2
mov r0, r2
mvn r0, r0, #-1 neg r0
tst r0, r1 test r0, r1
teq r0, r1 ??mov r2, r1
xor r2, r0
test r2, r2
bl call ; 自動 mov lr, pc,保存返回地址
b jmp
bx ? ?jmp ; 帶模式切換,自動修改cpsr寄存器的控制域。
bgt jg ; 根據標志位N(SF),V(OF)
blo jb? ; 根據標志位C(CF),Z(ZF)
beq je
bne jne
addeq r0, r0, r1 jne $+n
add r0, r1
ldrb r0, [r1] movzx eax, byte ptr[ebx]
ldrsb r0, [r1] movsx eax, byte ptr[ebx]
ldrh ? r0, [r1] movzx eax, word ptr[ebx]
ldrsh ?r0, [r1] movsx eax, word ptr[ebx]
strb r0, [r1] mov byte ptr[ebx], al
strh ?r0, [r1] mov word ptr[ebx], ax
ldr r0, [r1. #0x4]! ? lead eax, [ebx+0x4]
? ?mov eax, dword ptr[ebx]
?
arm數據傳送指令方向注意事項:
arm數據傳送指令分為兩類,分別是ld(load Ld <-- Rs)和st(store Ls --> Rd);其它為默認方向。不同于x86指令(intel風格:左目標右源,at&t風格左源右目標)統一固定操作方向。
?
修改日期:2016.8.7
1.str r0, [r1, r2, LSR #3],格式修正。
2.arm數據傳送指令方向注意事項。
修改日期:2015.12.25
1. 31個通用寄存器和33個通用寄存器的區別在于,后者多了一個安全監視態。
2.bgt與blo,跟x86的jb與jl類比不適當。
3. 追加對內存進行字節,字傳輸指令類比。
修改日期: 2017.11.10
1. 添加感嘆號語句
轉載于:https://www.cnblogs.com/bbqzsl/p/5070035.html
總結
以上是生活随笔為你收集整理的开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#基础——密码加密
- 下一篇: 实验三进程调度模拟程序