本文章主要是實(shí)現(xiàn)在非越獄機(jī)上去掉騰訊視頻廣告的一個(gè)功能抗果,僅供學(xué)習(xí)交流=钐!冤馏!
一日麸、獲取褪殼app
首先我們需要一個(gè)去殼的ipa文件,以前在PP助手可以下載逮光。但是后來(lái)PP助手不能用了代箭,也沒(méi)找到其他地方下載,只能自己動(dòng)手了涕刚。下面推薦三種去殼的方式 : Clutch dumpdecrypted frida-ios-dump嗡综。過(guò)程在此不多做贅述,下面是我的使用心得杜漠。
Clutch:失敗率比較高,對(duì)幾個(gè)小app砸殼成功极景,對(duì)幾個(gè)大廠的app砸殼均失敗。失敗幾次后就暫且擱置碑幅。
dumpdecrypted:可以順利砸殼但是操作麻煩戴陡,且對(duì)于framework 中的Mach-O文件沒(méi)有找到去殼方式
frida-ios-dump:配置簡(jiǎn)單,使用相對(duì)順利沟涨,支持python2 python3(推薦)
砸殼過(guò)得ipa直接解壓獲得文件
我們可以進(jìn)去看一下是否砸殼成功恤批。進(jìn)入qqlive目錄(右鍵顯示包內(nèi)容)可以看到這么一個(gè)Mach-O可執(zhí)行文件
進(jìn)入文件目錄執(zhí)行
otool -l live4iphoneRel | grep cryp
其中cryptid為0代表已經(jīng)砸殼
二、獲取頭文件
用 class-dump 獲取頭文件裹赴。
class-dump -H /Users/qin/Desktop/tx/Payload/qqlive.app/live4iphoneRel -o /Users/qin/Desktop/tx/qliveHeaders
對(duì) Mach-O文件執(zhí)行完畢之后可以看到目標(biāo)目錄下產(chǎn)生很多頭文件喜庞。
诀浪,這個(gè)頭文件并不是所有的頭文件。如果直接在這個(gè)里面找會(huì)有很多文件找不到延都。騰訊視頻應(yīng)是遵循組件化的開(kāi)發(fā)方式雷猪,將很多功能做成功能庫(kù)加載進(jìn)項(xiàng)目。因此要將項(xiàng)目Frameworks下的Mach-O頭文件都導(dǎo)出來(lái)晰房。
但是這個(gè)framework實(shí)在是不少求摇,逐個(gè)去執(zhí)行class-dump要很久。所以這邊是做了一個(gè)腳本all_class_dump去完成這個(gè)工作(腳本本身只是完成一個(gè)遍歷查詢(xún)Mach-O文件并執(zhí)行class-dump的工作殊者,所以運(yùn)行腳本需要安裝class-dump)与境。
執(zhí)行
python3 /Users/qin/Desktop/all_class_dump.py /Users/qin/Desktop/tx/騰訊視頻.ipa
執(zhí)行前
三、MonkeyDev運(yùn)行破殼ipa
新建MonkeyApp運(yùn)行ipa文件
將xm的文件類(lèi)型改為c++
進(jìn)入播放界面后將程序停住分析
通過(guò)UI尋找入口猖吴,到了這里之后就是慢慢找保持耐心慢慢看摔刁。
這個(gè)方法讓有點(diǎn)想法共屈,將其hook不執(zhí)行其內(nèi)部邏輯,嘗試后無(wú)效党窜。還做了一些其他嘗試也都無(wú)效拗引。找其父類(lèi)
嘗試代碼 一
%hook QNBPlayerVideoAdsViewController
- (id)initWithEventProxy:(id)arg1 withPlayerInfo:(id)arg2 withParentViewController:(id)arg3 withPageViewController:(id)arg4 withAddToParenViewControllerNow:(_Bool)arg5{
return nil;
}
- (id)initWithEventProxy:(id)arg1 withPlayerInfo:(id)arg2 withParentViewController:(id)arg3 withParentEventViewController:(id)arg4 withAddToParenViewControllerNow:(_Bool)arg5{
return nil;
}
- (id)initWithEventProxy:(id)arg1 withPlayerInfo:(id)arg2 withParentViewController:(id)arg3 withAddToParenViewControllerNow:(_Bool)arg4{
return nil;
}
- (id)initWithEventProxy:(id)arg1 withPlayerInfo:(id)arg2 withParentViewController:(id)arg3 withParentEventViewController:(id)arg4{
return nil;
}
- (id)initWithEventProxy:(id)arg1 withPlayerInfo:(id)arg2 withParentViewController:(id)arg3{
return nil;
}
%end
運(yùn)行后可以看到廣告播放界面是沒(méi)了,但是聲音還在幌衣,視頻也不能放寺擂。
再次運(yùn)行程序,加了上述代碼QNBPlayerVideoAdsViewController這個(gè)控制器已經(jīng)不再界面層級(jí)中了泼掠。控制器層級(jí)中有很多QAD作為前綴的控制器垦细。
嘗試代碼 二
%hook QADViewController
- (BOOL)enableVideoAdPlay {
return NO;
}
%end
聲音沒(méi)有了但是 還是不能放择镇,推測(cè)應(yīng)該是有參數(shù)控制廣告時(shí)長(zhǎng),目前我們只是把廣告播放去掉了括改。QADRootViewController和QADViewController 都有QADPlayAdInfo這個(gè)成員變量
嘗試代碼 三
%hook QADPlayAdInfo
-(id)init {
return nil;
}
%end
搞定D逋恪!嘱能!
最后嘗試發(fā)現(xiàn)只要嘗試代碼三 加上 嘗試一二要不要都無(wú)所謂吝梅,繞了一圈。
中間還有很多無(wú)效嘗試就不一一列出了
最終去廣告代碼
%hook QADPlayAdInfo
-(id)init {
return nil;
}
%end