iOS安全

iOS逆向(二)函数本质

2018-04-26  本文已影响0人  Tycool

概念

一、寄存器

1.数据地址寄存器

通常用来做数据计算的临时存储、累加、计数、地址保存等功能。定义这些寄存器的作用主要用于在CPU指令保存操作数,在CPU中当作常规变量来使用。

ARM64中

2.浮点和向量寄存器

因为浮点数存储以及运算的特殊性,CPU中专门提供浮点寄存器来处理浮点数

现在CPU支持向量运算(在图形处理相关领域用的非常多)为了支持向量计算,系统也提供了众多向量寄存器

3.SP和FP寄存器

4.X30寄存器

二、栈

栈是一种具有特殊访问方式的存储空间(后进先出,Last In Out First,LIFO)

三、指令

str(store register) -> 变种stp(可以操作两个寄存器)
将数据从寄存器中读出来,存到内存中

ldr(load register) -> 变种ldp(可以操作两个寄存器)
将数据从内存中读出来,存到寄存器中

bl
将下一条指令地址放入lr(X30)寄存器
跳转到标号处执行指令

ret
默认使用lr(X30)寄存器的值,通过底层指令提示CPU此处作为下条指令地址
ARM64的特色指令,它面向硬件做了优化处理

四、函数的参数与返回值

ARM64下,函数的参数是存放在X0 - X7(W0 - W7)这8个寄存器中,如果超过8个参数,则会入栈
函数的返回值放在X0寄存器中

五、函数的局部变量

函数局部变量放在栈里

六、实践

  1. 新建demo,添加汇编文件,汇编代码


    添加汇编文件.png
.text
.global _A  // 全局函数

_A:
sub sp, sp, #0x20       // 将sp减#0x20(向低地址拉伸栈空间32个字节)
stp x0, x1, [sp, #0x10] // stp:操作两个寄存器,将x0,x1放入内存  [sp, #0x10]:sp加上#0x10
ldp x1, x0, [sp, #0x10] // ldp:操作两个寄存器,将sp内容写入寄存器,交换
add sp, sp, #0x20       // 栈平衡,如果不处理,造成内存不够用,函数调用完不要了
ret

2.运行查看寄存器

lldb:
单步执行:ni
写寄存器:register write x0 0xffffffff
读寄存器:register read x0

上一篇下一篇

猜你喜欢

热点阅读