二十一、ARM64汇编(三)

一、叶子函数

sp:stack point,作用是存储着某块内存的地址。一般是通过sp来指定一块内存给函数使用。

叶子函数的堆栈平衡(通过指令生成汇编文件)

栈空间的回收,仅仅是sp指针的挪动。




二、非叶子函数01-开辟栈空间

区别:
1、非叶子函数多了现场保护现场恢复
2、有16个字节用来保护现场(fp-x29lr-x30),执行完操作最后,恢复现场。

sp:栈顶指针
fp:占地指针
sp和fp之间的空间,就是函数的空间:

开辟空间和堆栈保护

当sp恢复后,那32个字节的内存就是垃圾内存了,相当于被回收了。

栈空间

从上面的汇编代码和图片来看,可使用区的内存并没有用完还有8个字节,这是因为在分配内存的大小为16的倍数原因,是为了提高CPU的访问速度。




三、非叶子函数02-恢复堆栈平衡

bl带返回跳转指令会修改lr寄存器的内容。

本小节见上。




四、OC方法内存断点

简单应用汇编——点击微信红包的时候做了什么。

1、连接登录到手机;
2、debugserver粘附到WeChat;
3、点击微信红包,看打印台那个是点击事件,记录方法名;
4、hooper打开微信脱壳包,搜索该方法名;
5、方法名的地址+偏移地址,打断点该方法;




五、用debugserver启动APP

image.png

我们还想知道方法传递了什么参数?

——x0-x7用来放参数。

首先我们要知道方法调用的本质:

OC方法调用本质即参数对应的寄存器
打印方法的具体参数

方法的调用者是谁?方法一

—— 通过函数调用栈得知

frame1调用了frame0,所以拿到frame1地址减去偏移值,得到一个地址,在hooper中找:

方法的调用者是谁?方法二

——通过lr寄存器

register write
返回到自己写的插件里去了

在cydia中把微信插件删掉,再调试会更好,看到的就都是微信的东西了。




六、用debugserver启动APP

如何从微信启动那一刻,看它都做了什么:

观察启动微信那一刻,如何debugserver
最开始是_dyld_start
开始单步执行往下

开始单步执行,一行一行往下看,要费点时间,后面会来到main函数。




七、破解命令行程序

命令行代码
找到可执行文件拖拽出来
执行

软件模拟:

命令行代码
找到可执行文件拖拽出
执行

破解:

把可执行文件拖拽到hopper。

破解方法之一:跳过while循环;

image.png
重新生成可执行文件
image.png
破解成功

不过,这只是个mac程序,我们要破解的是iPhone程序。

hopper其他技能:

image.png




八、破解iOS程序

密码输入正确的时候,按钮才会显示蓝色且能点击。

需求:

1、从手机中导出可执行文件;
2、完成需求方法一:编写tweak项目;方法二:在hopper中改汇编代码。
3、假设我们利用知识储备,知道了目标方法是viewDidAppear:。

image.png
nop的结果

应该不弹框了。需求一完成。

需求二:

1、假设我们经过分析得知int a = 10 是个全局变量;
2、改全局变量的值,全局变量在哪呢,借助MachOView工具。

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容