apk反編譯、smali修改、回編譯筆記


最近下了一個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使用。但是試了下,編譯時還是有很多報錯,主要是資源文件的問題。有時間再看下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM