2015年3月24日 星期二

手拆Unity引擎開發的遊戲APP,拔除AdMob廣告模組(以1010!為例)

雖然我現在也是寫了一支APP,想看能不能靠AdMob賺點微薄的收入啦(?)
感覺寫這篇部落格文有點沒品(?)
我寫的APP上架囉~義守學生管家!


這邊以一支上架的小遊戲
最近我在Google Store上找到的,還蠻喜歡的小遊戲XD
安裝完後,開啟遊戲畫面如下
就是遊戲畫面上方會有個Google的AdMob的廣告看起來討厭了一點...
那麼我們該怎麼逆向分析這種APP呢?

首先把APK從模擬器撈出來...然後看了一下結構:
看起來是個蠻標準的APK架構嘛...不過等等...
翻到assets資料底下一路翻到最內層會看到:
看到了UnityEngine又看到了Mono還有mscorelib(微軟.NET JIT解析核心)好開心啊~~
原來這是用C#搭Unity引擎寫出來的APP,所有編譯的Code都會轉成MSIL存放在Assembly-CSharp.dll跟Assembly-CSharp-firstpass.dll內。

看到這裡,看來我們可以知道很明顯的一件事情是:
重要的核心Code都放在這兩個.NET Dll內,其他所有物件跟資源都是框架

好,那麼先把Assembly-CSharp.dll跟Assembly-CSharp-firstpass.dll兩個Dll單獨解壓縮出來囉
接著搬出Windows上的.NET Reflector神器出來囉
很快翻一下,可以在Assembly-CSharp-firstpass.dll內翻到關於AdMob的模組
接下來就對幾個AdMob的關鍵模組打Patch囉
首先翻到CreateBanner模組,開啟Reflexil插件直接把這個函數的MSIL開頭處直接下一個ret(也就是Offset = 0那裡)讓這個函數變成空函數

接著,如法炮製對另個CreateBanner同名不同參數的函數一樣下ret讓它變空函數
RefreshAd函數也是
ReceiveAd函數也是

最後還有一個最重要的
AdMobUIManager類別下的OnGUI()也將之清空為空函數

最後把剛剛辛苦處理完的打Patch回去DLL身上
最後把DLL塞回去APK原本那個DLL(覆蓋過去)再重新替APK簽一個新的簽章上去

成果:

PS:如果想直接使用去廣告版本的1010!請點此做下載(Android)