破解前準備
安裝好Android開發環境(SDK,Android studio)
安裝插件 smalidea, smali support
下載最新的apktool.jar
使用apktool解包,打包
1. 執行命令 java -jar apktool.jar d xxx.apk
如果apk沒有加固,執行完命令,就能看到反編譯后的smali文件,可以閱讀這些smali文件.
2. 打包命令 java -jar apktool.jar b 解包后的目錄 >xxx.apk
可以執行打包命令,將解包,修改后的smali再打包. 如果需要調試,需要在AndroidManifest.xml文件中,加上debugable.
<application android:[debuggable](https://developer.android.com/guide/topics/manifest/application-element#debug)="true">
</application>
此時得到的apk包沒有簽名,需要簽名后才能安裝
3. 簽名 jarsigner -verbose -keystore .\xxx.jks -signedjar signed.apk xxx.apk 'benzhuo'
輸入密碼后,簽名完畢,簽名后的包是signed.apk,安裝這個包.
smali調試
1. 執行 java -jar apktool.jar d signed.apk. 解壓剛才簽名的安裝包
2. 用Android Studio 打開解壓后的文件夾,此時需要設置一下工程的SDK.
3. 連接上測試手機, 執行命令 adb shell am start -D -W -n 包名/LauncherActivity ,以debug模式打開應用,此時手機上打開應用會彈出提示框, Waiting For Debugger.
4. 點擊Android Studio的Attach Debugger 按鈕.
5. 選擇調試的程序,然后就可以調試了
6. 修改了Smali文件之后,需要重新打包,然后安裝在手機上,再調試.
smali語言
1. 原始類型
|smali類型|java類型|
|----|---|
|B|byte|
|C|char|
|D|double|
|F|float|
|I|int|
|J|long|
|S|short|
|V|void|
|Z|boolean|
|[x| x類型數組|
|Lpackage/Object|對象|
2. 方法
- 第一行 .locals 11 表示這個方法使用了多少個寄存器, 從0開始,v0- v10
.locals 11
方法中 p0,p1表示參數的寄存器.
invoke-virtual 表示調用函數方法, {} 中的第一個參數是調用對象的寄存器,后面參數表示方法的參數,方法名后面的是返回值
invoke-virtual {p1}, Ljava/lang/Double;->doubleValue()D
- invoke-static 是調用靜態方法,{}中的都是方法參數.
invoke-static {v1, v2, v3, v4}, Lcom/meituan/retail/c/android/utils/v;->a(DD)Z
invoke-direct 調用私有方法
invoke-super 調用父類方法
move-result 是將前面方法的返回值賦值給某個寄存器.
move-result v1
- move-object 從寄存器v9賦值到寄存器v3
move-object v3, v9
- const-string 將字符串賦值給v10寄存器
const-string v10, "5e6d"
- const-class 將類對象賦值給v2寄存器
const-class v2, Context
- const/4 將int值賦值給v1寄存器
const/4 v1, 0x1