概述
當(dāng)我們要調(diào)試一個(gè)三方APP的時(shí)候惠赫,就少不了讓三方的APP執(zhí)行我們自己寫的代碼赘娄,或者是截獲三方APP的某一些方法仆潮,這樣我們就要把我們寫的代碼注入到三方APP,這個(gè)過程也叫HOOK遣臼。一般情況下都是采用動(dòng)態(tài)庫注入的方式性置,在做代碼注入之前首先要對APP重簽名,可以參考我的這篇文章揍堰。
在iOS應(yīng)用中鹏浅,我們所寫的代碼最終都會(huì)被放入MachO文件中被執(zhí)行,如果我們想改變?nèi)紸PP的代碼屏歹,就要改變可執(zhí)行文件
注入方式分為靜態(tài)注入和動(dòng)態(tài)注入
靜態(tài)注入:對可執(zhí)行文件進(jìn)行直接修改(比較困難隐砸,一般不用)
動(dòng)態(tài)注入:程序運(yùn)行的過程中,通過底層的函數(shù)去注入蝙眶,常用方framework動(dòng)態(tài)庫注入
一季希、Framework注入
1、重簽名安裝三方APP
3式塌、將framework寫入machO文件,使用工具yololib,下載工具放入usr/local/bin目錄下 友浸,可以通過MachOView工具查看是否已經(jīng)注入
$yololib 可執(zhí)行文件名 framework路徑 (yololib WeChat FrameWorks/Hook.framework/Hook.framework)
可以通過MachOView工具查看是否已經(jīng)注入
4峰尝、將調(diào)試的三方APP的MachO文件替換為注入framework的MachO文件,運(yùn)行成功代表已經(jīng)注入
5尾菇、在framework中添加文件境析,想要代碼在程序加載的時(shí)候就執(zhí)行,
需要把方法寫在load方法內(nèi)
二派诬、破壞微信的注冊
1劳淆、在開始之前首先使用class-dump 導(dǎo)出微信頭文件(具體如何導(dǎo)出后續(xù)會(huì)在補(bǔ)充,大家可以先搜索一下安裝步驟和使用方法默赂,一定要是砸殼之后的才可以導(dǎo)出頭文件)
2沛鸵、重簽名微信,并運(yùn)行在真機(jī)上
3缆八、通過Debug View調(diào)試拿到注冊按鈕所在的類曲掰,和方法名稱
如圖可知,類名為:WCAccountLoginControlLogic 方法名稱為:onFirstViewRegester
4奈辰、創(chuàng)建一個(gè)類栏妖,歸屬于注入的Framework,在load方法內(nèi)利用runtime的方法交換奖恰,交換微信注冊按鈕的點(diǎn)擊方法為我們自定義的方法
+(void)load{
Method old = class_getInstanceMethod(objc_getClass("WCAccountLoginControlLogic"), @selector(onFirstViewRegester));
Method new = class_getInstanceMethod(self, @selector(test));
method_exchangeImplementations(old, new);
}
- (void)test{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"哈哈吊趾,不能注冊" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定",nil];
[alert show];
}
5、運(yùn)行項(xiàng)目瑟啃,效果如圖论泛,至此已經(jīng)大功告成
補(bǔ)充
要實(shí)現(xiàn)上面的功能其實(shí)還有很多的準(zhǔn)備工作要做,我在這里只是介紹了重點(diǎn)的部分蛹屿,后續(xù)會(huì)慢慢補(bǔ)充上一些其他相關(guān)的內(nèi)容屁奏,歡迎有興趣的朋友一起交流學(xué)習(xí),如果大家有什么疑問错负,歡迎留言坟瓢。
特此聲明:以上所使用的三方APP僅限學(xué)習(xí)交流,不做其他任何用途