一、叶子函数
sp:stack point,作用是存储着某块内存的地址。一般是通过sp来指定一块内存给函数使用。
叶子函数的堆栈平衡(通过指令生成汇编文件)
栈空间的回收,仅仅是sp指针的挪动。
二、非叶子函数01-开辟栈空间
区别:
1、非叶子函数多了现场保护
与现场恢复
;
2、有16个字节用来保护现场(fp-x29、lr-x30),执行完操作最后,恢复现场。
sp:栈顶指针
fp:占地指针
sp和fp之间的空间,就是函数的空间:
当sp恢复后,那32个字节的内存就是垃圾内存了,相当于被回收了。
从上面的汇编代码和图片来看,可使用区的内存并没有用完还有8个字节,这是因为在分配内存的大小为16的倍数原因,是为了提高CPU的访问速度。
三、非叶子函数02-恢复堆栈平衡
bl带返回跳转指令会修改lr寄存器的内容。
本小节见上。
四、OC方法内存断点
简单应用汇编——点击微信红包的时候做了什么。
1、连接登录到手机;
2、debugserver粘附到WeChat;
3、点击微信红包,看打印台那个是点击事件,记录方法名;
4、hooper打开微信脱壳包,搜索该方法名;
5、方法名的地址+偏移地址,打断点该方法;
五、用debugserver启动APP
我们还想知道方法传递了什么参数?
——x0-x7用来放参数。
首先我们要知道方法调用的本质:
方法的调用者是谁?方法一
—— 通过函数调用栈得知
frame1调用了frame0,所以拿到frame1地址减去偏移值,得到一个地址,在hooper中找:
方法的调用者是谁?方法二
——通过lr寄存器
register write
在cydia中把微信插件删掉,再调试会更好,看到的就都是微信的东西了。
六、用debugserver启动APP
如何从微信启动那一刻,看它都做了什么:
开始单步执行,一行一行往下看,要费点时间,后面会来到main函数。
七、破解命令行程序
软件模拟:
破解:
把可执行文件拖拽到hopper。
破解方法之一:跳过while循环;
不过,这只是个mac程序,我们要破解的是iPhone程序。
hopper其他技能:
八、破解iOS程序
密码输入正确的时候,按钮才会显示蓝色且能点击。
需求:
1、从手机中导出可执行文件;
2、完成需求方法一:编写tweak项目;方法二:在hopper中改汇编代码。
3、假设我们利用知识储备,知道了目标方法是viewDidAppear:。
应该不弹框了。需求一完成。
需求二:
1、假设我们经过分析得知int a = 10 是个全局变量;
2、改全局变量的值,全局变量在哪呢,借助MachOView工具。