有些情況下我們想要了解別人的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;
所有用到的工具下載