IOS逆向-arm64汇编

本文详细解析了ARM64汇编的寄存器结构、LLDB调试指令,涵盖了mov、ret、add、sub、cmp等基础指令,以及内存操作的load/store、pc/lr和堆栈处理。实战部分涉及破解Mac/iPhone程序,教你如何利用汇编进行内存修改和函数调试。

真机和模拟器上的 汇编指令是不一样的

1. 寄存器

1.1 寄存器介绍

  • 通用寄存器:
    • 64bit的:x0 ~ x28
    • 32bit : w0 ~ w28(属于x0 ~ x28的低32bit)
    • x0-x7通常用来拿来存放函数的参数,更多的是参数使用堆栈来传递
    • x0通常拿来存放函数的返回值
  • 程序寄存器: pc(program Counter)
  • 堆栈指针寄存器:sp(Stack Pointer)、fp(Frame Pointer)
  • 链接寄存器:lr(Link Register), 也就是x30
  • 程序状态寄存器:
    • cpsr:(Cuurent Progame Status Register)
    • spsr: (Saved Program Status Register)

1.2 一些调试LLDB的相关指令

  • LLDB指令:

    • memory read : 读取所有寄存器的值
    • memory write 寄存器 值:给某个寄存器写入值
    • po $x0:打印方法调用者
    • x/s $s1: 打印方法名
    • po $x2:打印参数(以此类推, x3,x4也可能是参数)
    • 如果是非arm64,寄存器就是r0,r1,r2
  • 首先我们创建一个Xcode项目,打个断点,然后通过LLDB调试环境来查看汇编语言的寄存器信息:在这里插入图片描述

我们可以读取并修改寄存器的值:在这里插入图片描述

2. 汇编常用指令

2.1 在Xcode中创建汇编文件

  • 汇编文件的后缀为.asm,这里简写成.s文件
  • 我们以函数的形式来学习汇编的指令

在这里插入图片描述
在这里插入图片描述

  • 但是当我们编译项目后,报如下错误:

在这里插入图片描述

  • 分析错误发现是找不到_test函数,其实我们表面是调用test()函数,但是底层实质是寻找_test()函数 ,所以我们编写汇编代码的时候,需要修改函数名称为_test

在这里插入图片描述
当修改问函数名之后,在次编译发现还是报上述那个错误,找不到_test方法,其实如果是直接在方法前面加上_表示私有函数,我们还需要使用.global关键字来声明下函数

在这里插入图片描述

2.2 mov、ret

  • mov : 赋值
    • 指令格式:mov {条件} {S} 目的寄存器,源操作数
    • mov指令可完成从另外一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项指令的操作是否影响CPSR中条件标志位的值,当没有S指令不更新CPSR中条件标志位的值
    • 指令示例:
      • mov R1, R0 :将寄存器R0的值传递到寄存器R1
      • mov PC, R14:将寄存器R14的值传送到PC,常用语子程序返回
      • mov R1, R0, LSL#3:将寄存器R0的值左移3位传送到R1
  • ret:函数返回,将lr(x30)寄存器的值赋值给pc寄存器
  • mov的示例代码如下
// 作用 告诉写的函数放在哪个段,.text:表示函数放在代码段
.text
//表示函数是公开的,可以被被人访问,而函数的实现在下面
.global _test
//函数名称 test . 相当于打个标记  
_test:
mov x0, #0x8 // 把立即数8储存到寄存器x0中
mov x1, x0  //把寄存器x0的值传到寄存器x1中
ret

在这里插入图片描述

2.3 add

  • add: 加法
    • 指令格式:add {条件} {S}目的寄存器,操作数1,操作数2
    • add指令用于把两个数相加,并将结果存放到目的寄存器中,操作数据1,应该是一个寄存器,操作数2也可以是一个寄存器,被移位的寄存器,或一个立即数
    • 指令示例:
      • add R0, R1, R2: R0 = R1 + R2
      • add R0, R1, #256: R0 = R1 + 256
      • add R0, R2, R3, LSL#1: R0 = R2 + (R3 << 1)
  • add的示例代码
.text
.global _add
;add指令
_add:
mov x0, #0x1
mov x1, #0x2
add x0, x0, x1
ret

在这里插入图片描述

2.3 sub

  • sub:减法
    • 指令格式:sub {条件} {S}目的寄存器,操作数1,操作数2
    • sub指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存区,操作数2可以是一个寄存器,被移位的寄存器,或是一个立即数。该指令可用于有符号或无符号数的减法运算
    • 指令示例:
      • add R0, R1, R2: R0 = R1 - R2
      • add R0, R1, #256: R0 = R1 - 256
      • add R0, R2, R3, LSL#1: R0 = R2 - (R3 << 1
  • sub代码示例
.text
.global _sub
;sub指令
_sub:
sub x0, x0, x1 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值