zoukankan      html  css  js  c++  java
  • 开始逆向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. 添加感叹号语句

    逆向深入objc,c++ windows下仿objc动画层UI引擎
  • 相关阅读:
    Javascript 中的浮点数精度丢失问题
    react中使用字符串中生成HTML
    前端-HTML规范
    js 数组(Array)的使用
    ES6变量声明解析
    cookies sessionlStorage和localStroage的区别
    面向对象
    迭代器、生成器、装饰器
    内置函数和文件读取
    函数
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/5070035.html
Copyright © 2011-2022 走看看