一筐带、葉子函數(shù)
sp:stack point今穿,作用是存儲著某塊內(nèi)存的地址。一般是通過sp來指定一塊內(nèi)存給函數(shù)使用伦籍。
葉子函數(shù)的堆棧平衡(通過指令生成匯編文件)
椑渡梗空間的回收,僅僅是sp指針的挪動帖鸦。
二芝薇、非葉子函數(shù)01-開辟棧空間
區(qū)別:
1作儿、非葉子函數(shù)多了現(xiàn)場保護
與現(xiàn)場恢復(fù)
洛二;
2、有16個字節(jié)用來保護現(xiàn)場(fp-x29攻锰、lr-x30)灭红,執(zhí)行完操作最后,恢復(fù)現(xiàn)場口注。
sp:棧頂指針
fp:占地指針
sp和fp之間的空間,就是函數(shù)的空間:
當(dāng)sp恢復(fù)后君珠,那32個字節(jié)的內(nèi)存就是垃圾內(nèi)存了寝志,相當(dāng)于被回收了。
從上面的匯編代碼和圖片來看材部,可使用區(qū)的內(nèi)存并沒有用完還有8個字節(jié),這是因為在分配內(nèi)存的大小為16的倍數(shù)原因唯竹,是為了提高CPU的訪問速度乐导。
三、非葉子函數(shù)02-恢復(fù)堆棧平衡
bl帶返回跳轉(zhuǎn)指令會修改lr寄存器的內(nèi)容浸颓。
本小節(jié)見上物臂。
四旺拉、OC方法內(nèi)存斷點
簡單應(yīng)用匯編——點擊微信紅包的時候做了什么。
1棵磷、連接登錄到手機蛾狗;
2、debugserver粘附到WeChat仪媒;
3沉桌、點擊微信紅包,看打印臺那個是點擊事件算吩,記錄方法名留凭;
4、hooper打開微信脫殼包偎巢,搜索該方法名蔼夜;
5、方法名的地址+偏移地址艘狭,打斷點該方法挎扰;
五、用debugserver啟動APP
我們還想知道方法傳遞了什么參數(shù)巢音?
——x0-x7用來放參數(shù)遵倦。
首先我們要知道方法調(diào)用的本質(zhì):
方法的調(diào)用者是誰?方法一
—— 通過函數(shù)調(diào)用棧得知
frame1調(diào)用了frame0官撼,所以拿到frame1地址減去偏移值梧躺,得到一個地址,在hooper中找:
方法的調(diào)用者是誰傲绣?方法二
——通過lr寄存器
register write
在cydia中把微信插件刪掉掠哥,再調(diào)試會更好,看到的就都是微信的東西了秃诵。
六续搀、用debugserver啟動APP
如何從微信啟動那一刻,看它都做了什么:
開始單步執(zhí)行禁舷,一行一行往下看,要費點時間毅往,后面會來到main函數(shù)牵咙。
七、破解命令行程序
軟件模擬:
破解:
把可執(zhí)行文件拖拽到hopper攀唯。
破解方法之一:跳過while循環(huán)洁桌;
不過,這只是個mac程序侯嘀,我們要破解的是iPhone程序另凌。
hopper其他技能:
八谱轨、破解iOS程序
密碼輸入正確的時候,按鈕才會顯示藍色且能點擊途茫。
需求:
1碟嘴、從手機中導(dǎo)出可執(zhí)行文件;
2囊卜、完成需求方法一:編寫tweak項目娜扇;方法二:在hopper中改匯編代碼。
3栅组、假設(shè)我們利用知識儲備雀瓢,知道了目標(biāo)方法是viewDidAppear:。
應(yīng)該不彈框了玉掸。需求一完成刃麸。
需求二:
1、假設(shè)我們經(jīng)過分析得知int a = 10 是個全局變量司浪;
2泊业、改全局變量的值,全局變量在哪呢啊易,借助MachOView工具吁伺。