前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ARM64下用汇编写一个死循环及函数保护栈

ARM64下用汇编写一个死循环及函数保护栈

原创
作者头像
Wilbur-L
修改2021-01-29 18:00:07
1.8K0
修改2021-01-29 18:00:07
举报
文章被收录于专栏:iOS底层原理iOS底层原理

一·代码

.text

.global _A,_B

_A:

mov x0,#0x04b

bl _B

mov x0,#0x04b

ret

_B:

mov x0,#0x0b4e

ret

二·lr寄存器的变化

初始main-lr值

lr-1
lr-1

我们单步执行s指令

lr-2
lr-2

bl指令会跳转到标记处,同时将下一条指令放入lr x30寄存器中去

跳转到B函数返回到A

lr-3
lr-3

此时 lr=pc

而且ret 会默认使用lr x30寄存器里存放的值。也既是返回到A函数的第四句汇编代码。实现死循环

三·Xcode生成空函数的汇编

我们看看Xcode自动生成的标准汇编代码

void c(){

return;

}

void d(){

c();

}

int main(){

d();

}

Xcode生成的汇编
Xcode生成的汇编

汇编代码翻译:

stp x29,x30,[sp,#-0x10]!

sp往下减16字节,存放在x29,x30

这里是一句简写形式,转化为原本的形式

sub sp,sp,#0x10

stp x29,x30,[sp]

mov x29 ,sp 把sp的值存到x29

bl 0x10414a174 跳转到a174

ldp x29, x30, [sp], #0x10 将sp偏移16个字节的值取出来,存入到x29, x30当中

add sp,sp,#0x10

ldp x29, x30 , [sp]

四·手动写一个函数保护栈

_A:

mov x0,#0x0004b

str x30, [sp,#-0x10]!

bl _B

mov x0,#0x004b

ldr x30, [sp], #0x10

ret

_B:

mov x0,#0x4b0e

ret

注:arm64中,对栈的操作必须是16字节对齐0x10

保护成功,返回到main函数

lr-A
lr-A
lr-Main
lr-Main

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一·代码
  • 二·lr寄存器的变化
  • 三·Xcode生成空函数的汇编
  • 四·手动写一个函数保护栈
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com