最近更換了本身的Apple帳號,而後發現網易雲音樂在該區沒有上架。因爲不想在一臺手機上搞兩個帳號互相切換,因而便想到將App重簽名一下安裝到手機中。同時,本身蠻討厭開屏廣告的,就順手寫了個Tweak來屏蔽開屏廣告。期間有一些小坑,寫篇博客來記錄一下。html
第一步就是砸殼了,結果發現使用離合器砸殼出錯,沒有成功生成脫殼的IPA文件。具體緣由沒有深研,可是看錯誤提示,猜想應該是離合器不支撐StickerPack的擴展致使的。git
嘗試使用dumpdecrypted來砸殼,測試成功。砸殼的方法參考了這篇博客。獲得砸殼後的可執行文件以後,從越獄機中將App拷貝貝出來,替換掉可執行文件便可。github
Theos工程的Makefile中添加下面一句:web
ADDITIONAL_OBJCFLAGS = -fobjc-arc
複製代碼
因爲開屏廣告的顯示時間很是靠前,不可能等到App啓動後,從網絡獲取到數據後再顯示,通常的作法就是提早加載好以後要顯示開屏廣告數據緩存到本地,App每次剛啓動後,直接從本地取出數據,而後顯示須要的開屏廣告給用戶。面試
將二進制拖到Hopper中,搜索關鍵字advertisement
瀏覽一下搜索結果,很快便發現了一個NMAdvertisementManager
名叫類。一番分析後,實現邏輯的Tweak的代碼以下:緩存
%hook NMAdvertisementManager
- (void)fetchStartupAdvertisement {
[[%c(NMAdvertisementManager) defaultManager] performSelector:@selector(clearCachedResources)];
[[%c(NMAdvertisementManager) defaultManager] performSelector:@selector(removeOldAdItems)];
}
%end
複製代碼
邏輯是:hook了獲取數據的函數,每次這個函數被調用的時候,就清除本地緩存的廣告數據。這樣本地沒有了廣告數據,也就不會再顯示開屏廣告了。bash
雖然我理解App加開屏廣告的初衷,可是做爲一個用戶,真的很是討厭這個行爲。有些App甚至是在程序從後臺切到前臺的狀況都會顯示廣告,很是煩人。好了,用逆向來把生活變得美好一些吧。網絡