blx 从thumb调用arm(或者从arm调用thumb), x切换指令状态,

注意一点,汇编中 mov r1, #2 mov r2, #0x2 没有0x的就是十进制的,有0x的是16进制的

Arm常用汇编指令
1.数据处理指令

    MOV
    ADD
    SUB
    AND     &
    ORR     |
    EOR     ^ 异或
    BIC

2.移位指令

    LSL   左移
    LSR   右移
    ROR   循环右移指令,全称是Rotate Right 

3.乘法指令

    MUL
    MLA   mla r0,r0,r1,r2   r0 = r0*r1+r2

4.内存访问指令

    LDR     读四个字节
    LDRB    读一个字节
    LDRH    读两个字节 
    STR   写四个字节  str r0,[r2]   ;debug r2[0] = r0 把 r0 的数,存到 r2 指向的内存
    STRB   只写一个字节
    STRH    写两个字节 (Store Halfword)

5.跳转指令

    B 无条件跳转指令,  强制跳转
    BL  带返回的跳转指令
    BLX     带返回和带状态切换的跳转指令
    BX      带状态切换的跳转指令
            thumb -> arm
            arm -> thumb

6.数据加载与存储指令

    堆栈: (其实就是一个桶,r1 r2 r3顺序,得到值,不会乱序)
    push {r1, r2, r3} → 按r3→r2→r1的顺序把数据存入栈(右到左);
    pop {r1, r2, r3} → 按r1→r2→r3的顺序把栈数据写回寄存器(左到右);
    寄存器:
    LDM     LDMIA sp,{r0,r1,r2} ;debug 从sp里面依次把值拿出来 r0=sp[0] r1=sp[4] r2=sp[8]
    STM     STMIA sp,{r0,r1,r2} ;debug 
            STMDB 先减地址,再写数据。 地址向低地址增长,适合满递减栈的压栈
|    | 栈地址是向下面增加的,栈压栈专属 STMDB/PUSH;
|    |
|    |
|____|

读取指针的内容 hexdump(xxx.readPointer())
this.context.x8 // x8寄存器
hexdump(ptr(this.arg8).add(Process.pointerSize *2).readPointer());
x8在arm64比较特殊,返回的内容大于16字节就用x8来存储返回内容的地址
arm64传参规则:函数的第 1~8 个参数,固定依次使用 X0、X1、X2、X3、X4、X5、X6、X7 这 8 个寄存器传递

// 一行获取全局ApplicationContext
var appCtx = Java.use("android.app.ActivityThread").currentApplication().getApplicationContext();
native主动调用 给native方法传递字符串 Memory.allocUtf8String("xxxxxx");

分类: app逆向

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注

站点统计

  • 文章总数:328 篇
  • 分类总数:20 个
  • 标签总数:193 个
  • 运行天数:1564 天
  • 访问总数:950950 人次

浙公网安备33011302000604

辽ICP备20003309号