Android apk反編譯,smali文件修改,重新打包

 有些情況下我們想要了解別人的app怎麼實現,總是會想到反編譯一下,看下佈局,看下代碼實現。或者想改變一些關鍵位置的邏輯,但是初學者,根本就不知道怎麼反編譯,這篇是 一個樣例。

一、工具介紹:

1.apktool:aapt.exe,apktool.bat,apktool.jar;三個在同一目錄結合使用,用來反編譯apk,apk重新打包;

2.dex2jar:該工具作用是將classes.dex文件,反編譯出源碼(如果apk未加固),反編譯出文件,使用jd-gui工具進行查看;

3.apk 簽名 ,將重新打包的apk進https://blog.csdn.net/q610098308/article/details/105138228

行簽名,如果不簽名,無法安裝使用。

工具下載地址:http://download.csdn.net/detail/wxk105/9782180

使用場景:項目源碼丟失,只有線上apk,並且沒有加固,要求修改apk接口地址,並且重新打包,再發布。

 

首先下載好 test.apk

用ApkTool反編譯android程序

用apktool反編譯,命令如下:

apktool.bat d test.apk


生成test 目錄 如下:

這就是反編譯之後的Android程序了,可以看出,這個目錄結構跟我們編寫android代碼時的目錄結構非常相似,除了java代碼是以smali的格式呈現之外,其他都基本是原來的代碼。其實有很多人抄界面,到這一步就可以抄出完整的界面了。如manifest文件,裏面的Activity定義都可以看的很清楚了。然後layout文件,各種res都可以看見了。

改代碼重新編譯也是要在這個文件夾中改smali文件的,所以smali的語法還是要熟悉一點。但是看代碼邏輯我們不用去看晦澀難懂的smali語言,這就是下一步要做的工作。反編譯出java代碼。
用dex2jar反編譯出java源代碼

第一步做的工作先放在這,我們需要重新操作apk文件,其實apk文件就是一種壓縮包,所以我們把後綴名改成rar,用解壓縮工具打開。
 這裏其他文件在apktool那一步已經反編譯出來了,我們需要的僅僅是class文件,這是java代碼編譯後生成的文件,用dex2jar這個工具就可以反編譯出原代碼(java格式)了。把這個class文件解壓出來,放在dex2jar的同級目錄下。

dex2jar.bat   classes.dex

 

命令如上,成功之後就會在同級目錄下生成jar文件了。

用gui查看代碼

還記得一開始我們說過的工具gui,通過gui打開jar文件,就能看到java代碼了

jd-gui 還有另存源碼功能,在File 菜單中;通過查看源碼可以瞭解到相關的功能邏輯;

破解apk,重新打包

破解這塊不多說,根據 gui 找到相關的 類,相關函數,找對應 ApkTool反編譯 smail 文件夾中對應 的smail 類,打開 一般是修改相關的跳轉指令如:

"if-eqz vA, :cond_**"   如果vA等於0則跳轉到:cond_**

if函數的java代碼:

private boolean ifSense(){
        boolean tempFlag = ((3-2)==1)? true : false;
        if (tempFlag) {
            return true;
        }else{
            return false;
        }
    }

smail    if函數分析:

.method private ifSense()Z
    .locals 2

    .prologue
    .line 22
    const/4 v0, 0x1     // v0賦值爲1

    .line 24
    .local v0, tempFlag:Z
    if-eqz v0, :cond_0            // 判斷v0是否等於0, 不符合條件向下走, 符合條件執行cond_0分支

    .line 25
    const/4 v1, 0x1            // 符合條件分支

    .line 27
    :goto_0
    return v1

    :cond_0
    const/4 v1, 0x0            // cond_0分支

    goto :goto_0
.end method

###文字描述:如果符合if分支則程序往下走,最終return ; 而如果條件不符合則會走到 :cond_0分支 , 最終執行 goto :goto_0走回 :goto_0返回

  if-eqz v0, :cond_0  這裏用來跳轉

只要修改 v0 值 可以完成;

 const/4 v0, 0x1     // v0賦值爲1 這樣,就可以跳過,繼續向下走,不跳轉;

當然,如果想研究 需要學習 smail 語言;

改好後保存;

重新打包,簽名;

下面,開始進行最重要的工作,修改代碼,二次打包。其實這裏你可以什麼代碼先都別改,只重新打包一次,看看程序是否能夠正常運行,如果不能,估計初學者不要玩了;這裏不展開;

使用命令:

apktool.bat b test

會在 test 目錄 dist 目錄下 生成 apk ; 此 apk 不能正常安裝,因爲沒有簽名,android studio 打出的包 debug 也會有debug 簽名;如果沒簽名不能安裝一般;

簽名:

可參考:https://blog.csdn.net/q610098308/article/details/105138228

首先對齊

Zipalign -v 4 test.apk align.apk

成功後簽名:

先自己創建一個簽名文件 proxy.jks 執行下面命令

apksigner sign --ks  proxy.jks --ks-key-alias wwy --ks-pass pass:123456 --key-pass pass:123456 --out  dst.apk aligned.apk
 

到這裏就完成了整個流程,安裝 apk

adb install dst.apk

運行,一般成功就沒有問題。

 

當然,如果代碼量大,你也可以使用 Android studio 加載導出的源碼,Android studio 安裝插件 java2smail ,將修改好的 java 文件轉成 smail,再對比修改 smail;

所有用到的工具下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章