最近下了一個apk程序,但是一啟動會彈出一個流氓廣告。這個廣告不是原廠商加的,而是有人在原有apk程序的基礎上,加了一個殼,讓apk先啟動他加的廣告,再啟動原來的程序,很惡心。於是想去掉它。
試了幾個apk反編譯工具,最終感覺apkdb這個工具最方便。
這個軟件集成了資源管理器右鍵菜單。而且集成了一系列工具,包括apk提取軟件apktool、dex轉jar的軟件dex2jar,以及將jar轉成java代碼的軟件jd-gui.exe。
1、首先下載apkdb 2.0並安裝:http://idoog.me/
2、安裝好之后,在電腦apk文件上右鍵會有“使用apkdb反編譯”工具。按提示反編譯,可以得到apk的所有資源和源代碼。不過源代碼是smali的,不是java。試了轉smali為java的class文件,但修改過的class文件沒找到好辦法再回轉為smali,於是放棄了改java代碼。
3、於是嘗試直接改smali代碼。根據jd-gui.exe中的java代碼,跟smali文件中的代碼對比,其實不是很難看懂。我只想跳過廣告,於是直接在它廣告的方法一開始就return了,如下紅色是我加的一行代碼。
.method private Ads()V return-void .locals 13 .prologue const/16 v12, 0xe
...省略...
對應java代碼就是:
private void Ads() { return; ...省略...
另外還改了一處(紅色部分是我加的,抄了下面的綠色代碼):
.method private init()V invoke-direct {p0}, Lcom/example/assetexam/Welcome;->Welcome()V return-void .locals 1 .prologue .line 67 invoke-virtual {p0}, Lcom/example/assetexam/Welcome;->getPackageManager()Landroid/content/pm/PackageManager; move-result-object v0 invoke-virtual {p0, v0}, Lcom/example/assetexam/Welcome;->isAppInstall(Landroid/content/pm/PackageManager;)Z move-result v0 if-eqz v0, :cond_0 .line 68 invoke-direct {p0}, Lcom/example/assetexam/Welcome;->Welcome()V
...省略...
對應java代碼是:
private void init() { Welcome();retrun; if(isAppInstall(getPackageManager())) { Welcome(); return; } Ads(); }
改好的smali文件直接在原文件保存。
4、然后再整個反編譯出來的文件夾(就是“apk文件名-src”的文件夾)上點右鍵“使用apkdb回編譯”,就可以將修改過的smali代碼再編譯為apk文件!真是太方便了。途中有點小問題,一開始在apk提示簽名時,使用原有簽名,結果apk安裝不了,后來直接重新簽名就可以了。另外,不要用系統記事本改,會報錯,可以用Notepad++去改smali文件,估計是BOM問題。
apk裝好之后,終於沒有廣告了~
2017.3續:
今天試了下adpdb反編譯報錯,然后下了個新版本,就可以反編譯了。
然后又從網上看到一個比較方便的工具 - jadx:
https://github.com/skylot/jadx/releases
可以直接將apk反編譯為gradle項目,共android studio使用。但是試了下,編譯時還是有很多報錯,主要是資源文件的問題。有時間再看下