apk反編譯打包
① apk反編譯/回編譯
再次記錄一次apk反編譯/回編譯過程,鏈接失效請留言,會及時更新。
參考博客: https://blog.csdn.net/w327918069/article/details/82761437
首先,我們需要一個apk,下圖是Android Studio編寫並打包的一個apk。
其實apk就相當於一個zip壓縮包,通過 WinRar 工具可以對其解壓縮,像這樣:
此時,祭出我們的神器----> apktool ,當當當當~~~~~~~。
一行命令進行apk反編譯:
apktool d -r app-debug.apk 一定要加入參數 -r ,不然後面回編譯回報錯。
apk反編譯到此結束。
回編譯就是通過 apk反編譯 生成的目錄文件轉換成一個apk。
十分簡單的一行命令:
apktool b app-debug
此時安裝apk到手機無法安裝成功,還需要對apk進行簽名才能安裝。
1.生成key.keystore
keytool -genkey -alias key.keystore -keyalg RSA -validity 30000 -keystore key.keystore
可以看到key.keystore已經生成。
2.對apk進行簽名
可用於沒有簽名和已經簽名的apk,再次簽名。
jarsigner -verbose -keystore [keystorePath] -signedjar [apkOut] [apkin] [alias]
命令格式及參數意義:
-verbose -> 輸出簽名過程的詳細信息
-keystore [keystorePath] -> 密鑰的庫的位置
-signedjar [apkOut] -> 簽名後的輸出文件名
[apkin] -> 待簽名的文件名
[alias] -> 證書別名
jarsigner -verbose -keystore key.keystore -signedjar app-debug_signed.apk app-debug.apk key.keystore
回編譯完成。
② Android反編譯後重新打包
輸入: apktool d apk的名字
成功會以當前apk的名字建立一個文件夾
這個就是我們反編譯之後的apk的目錄,接下來加入我們改動裡面的資源或者源碼如何打包
就會在反編譯之後的目錄的dist文件下生成一個新的apk
這個apk是沒有簽名的
keytool -genkey -keystore test.keystore -alias test -keyalg RSA -validity 10000
jarsigner -verbose -keystore test.keystore -signedjar signed.apk b.apk test
簽名成功之後就會生成一個signed.apk
然後就可以愉快的玩耍了
由於需要xxx送上網路雲地址: http://pan..com/s/1o8yq98Q
③ Android 如何對apk文件進行反編譯以及重新
第一:使用apktool直接反編譯apk

第六:把生成的hellodemo.apk安裝到手機,可以看到主界面上已經顯示的是hello,而不再是你好。說明反編譯重新打包成功!
④ 如何將手機apk 安裝包反編譯和重新打包簽名
android應用安裝到手機的是一個apk文件。apk是可以用工具進行反編譯並重新打包的。本文將介紹下如何用apktool對apk進行反編譯並重新打包。
工具/原料
apktool
auto sign
方法/步驟
首先我們新建一個android項目,裡面只有一個MainActivity,而且主界面只會顯示一個字元串:你好。
下面,我們切換到這個項目生成的apk文件所在的目錄,可以看到有一個hellodemo.apk。
在命令行輸入:apktool d -r hellodemo.apk。可以看到在當前目錄下生成了一個hellodemo文件夾。
進入到hellodemo\smali\com\example\hello,打開MainActivity.smali。找到:
const-string v1, "\u4f60\u597d",
修改為:
const-string v1, "hello",
然後在命令行輸入:apktool b hellodemo hellodemo1.apk。這回重新打包成hellodemo1.apk。
然後給新生成的apk進行簽名。把這個apk拷貝到autosign的目錄下面,然後切換過去,在命令行輸入:java -jar signapk.jar testkey.x509.pem testkey.pk8 hellodemo1.apk hellodemo.apk。
步驟閱讀
把生成的hellodemo.apk安裝到手機,可以看到主界面上已經顯示的是hello,而不再是你好。說明反編譯重新打包成功!
⑤ 為什麼很多APK文件反編譯了打包出錯
雖然不提倡逆向工程別人的勞動成果
但是萬一一個feature你想做,卻始終搞不懂,怎麼辦?參考一下別人怎麼實現的吧!
可是Android用的Dalvik壓根不是標準的Java
VM的Jar,而是DEX格式的,怎麼辦?
附件是dxe2jar和JD,兩個工具都是open
source的,我已經全部放在一個壓縮包了。
別著急,有辦法:
1. 假設你要反匯編的是app.apk,那麼先改名成app.zip
2.
解壓
3. 在解壓出來的裡面找到classes.dex,這個就是目標的程序的二進制文件
4. 用附件的dex2jar,在Windows命令行下運行
dex2jar classes.dex
5. 生成classes.dex.dex2jar.jar,這個就是轉換後的JAR文件了
6.
執行jd-gui,找到剛才生成的JAR文件,打開之。
7. 偷偷樂吧,90%以上的Java源代碼躍然眼前。
⑥ 為什麼很多APK文件反編譯了打包出錯
可能是由於以下幾種情況導致
1、在Android Project配置文件中你使用了當前工程目標版本所沒有的特性,針對這種情況只需更改下目標版本就行了
2、apktool.jar可能不是最新的,針對這種情況下載最新版的apktool.jar就行了
3、在windows平台上aapt.exe、apktool.bat可能不是最新的,針對這種情況也只需下載最新版
⑦ 如何反編譯android應用並重新打包
一.看android的源代碼
1)將Apkd.apk 用zip解壓後,出現了一個classes.dex文件
2014/02/19 19:42
.
2014/02/19 19:42
..
2014/02/19 15:35 1,656 AndroidManifest.xml
2014/02/19 15:35 687,024 classes.dex
2014/02/19 15:49
META-INF
2014/02/19 15:49
res
2014/02/19 15:35 2,200 resources.arsc
2)進入到dex2jar目錄中,運行情況如下:
D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d
ex"
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.15
dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar
Done.
在apk所在的目錄會出現 classes_dex2jar.jar 文件。
3) 用JD-GUI對jar包進行查看,可以查看源文件
二.反編譯apk
1.在下載APKTOOL中的三個文件(aapt.exe、apktool.bat、apktool.jar)解壓縮到你的Windows安裝目錄下,以方便使用Dos命令.
2012/12/06 11:44 854,016 aapt.exe
2014/02/19 17:15 277,372 Apkd.apk//示例用apk文件
2012/12/23 23:39 92 apktool.bat
2013/02/03 02:37 2,655,843 apktool.jar
2.進入到apktool.bat所在的目錄,運行:
apktool d Apkd.apk decode_dir
反編譯後,decode_dir目錄下的內容如下:
2014/02/19 17:16 716 AndroidManifest.xml
2014/02/19 17:16 237 apktool.yml
2014/02/19 17:18
build
2014/02/19 17:16
res
2014/02/19 17:16
smali
此時我可以查看原文件AndroidManifest.xml了,也是查看smali源文件(是用smali語言寫的,可以對照java看)。
三.APKTOOL的使用
1).decode
該命令用於進行反編譯apk文件,一般用法為
apktool d
代表了要反編譯的apk文件的路徑,最好寫絕對路徑,比如C:\MusicPlayer.apk
代表了反編譯後的文件的存儲位置,比如C:\MusicPlayer
如果你給定的已經存在,那麼輸入完該命令後會提示你,並且無法執行,需要你重新修改命令加入-f指令
apktool d –f
這樣就會強行覆蓋已經存在的文件
2).build
該命令用於編譯修改好的文件,一般用法為
apktool b
這里的
就是剛才你反編譯時輸入的
(如C:\MusicPlayer),輸入這行命令後,如果一切正常,你會發現C:\MusicPlayer內多了2個文件夾build和dist,其中分別存儲著編譯過程中逐個編譯的文件以及最終打包的apk文件。
3).install-framework
該命令用於為APKTool安裝特定的framework-res.apk文件,以方便進行反編譯一些與ROM相互依賴的APK文件。具體情況請看常見問題
四.smali與java源碼對照,並做出相應的修改
java源代碼:
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView a = (TextView)this.findViewById(R.id.test) ;
a.setText("raoliang");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
對應的smali源代碼:
.class public Lali/text/apkd/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
# direct methods
.method public constructor ()V
.locals 0
.prologue
.line 8
invoke-direct {p0}, Landroid/app/Activity;->()V
return-void
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.parameter "savedInstanceState"
.prologue
.line 12
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 13
const/high16 v1, 0x7f03
invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V
.line 14
const/high16 v1, 0x7f08
invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/TextView;
.line 15
.local v0, a:Landroid/widget/TextView;
const-string v1, "raoliang"
invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 16
return-void
.end method
.method public onCreateOptionsMenu(Landroid/view/Menu;)Z
.locals 2
.parameter "menu"
.prologue
.line 21
invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;
move-result-object v0
const/high16 v1, 0x7f07
invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V
.line 22
const/4 v0, 0x1
return v0
.end method
通過對比可以看到,常量是沒有必變的,可以根據的smali的語法,進行相應的修改
五.3、打包、簽名和安裝修改後的apk
修改完了,就可以打包回apk了。執行以下命令:
apktool b decode_dir
在mygame目錄下的dist在會看到打包好的apk。
當然,現在一般是無法安裝的,因為apk還沒有簽名。下面就來簽名。簽名需要keystore文件,我已經有專用的keystore了,如果還沒有,請參閱這里進行生成。
執行以下命令為重新編譯的my_game.apk簽名:
jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
最後,在安裝到手機前,需要把手機中的已有版本先卸載,因為如果簽名不同,是不能覆蓋安裝的,會提示「應用程序未安裝」錯誤。
完整的運行情況如下:
D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麼?
[Unknown]: rao
您的組織單位名稱是什麼?
[Unknown]: rao
您的組織名稱是什麼?
[Unknown]:
您所在的城市或區域名稱是什麼?
[Unknown]:
您所在的州或省份名稱是什麼?
[Unknown]:
該單位的兩字母國家代碼是什麼
[Unknown]:
CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正確嗎?
[否]: y
輸入的主密碼
(如果和 keystore 密碼相同,按回車):
D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
輸入密鑰庫的口令短語:
正在添加: META-INF/MANIFEST.MF
正在添加: META-INF/DEMO_KEY.SF
正在添加: META-INF/DEMO_KEY.RSA
正在簽名: res/drawable-hdpi/ic_launcher.png
正在簽名: res/drawable-mdpi/ic_launcher.png
正在簽名: res/drawable-xhdpi/ic_launcher.png
正在簽名: res/drawable-xxhdpi/ic_launcher.png
正在簽名: res/layout/activity_main.xml
正在簽名: res/menu/main.xml
正在簽名: AndroidManifest.xml
正在簽名: classes.dex
正在簽名: resources.arsc
D:\developer\tools\test_apk\new\decode\dist>
到此為止,修改後的apk可以正常的安裝了,不過,在安裝之前,必須要先卸載以前的apk,不能直接替換(因為簽名不一樣)
⑧ 如何應用安卓APK文件進行解包打包和修改
不需要解包跟打包,直接修改就可以,修改的的方法。
如下參考:
1.將需要修改的apk包復制到100apktool的路徑中。注意:您需要將文件名更改為123apk,如下圖。

⑨ apk反編譯和重新打包
操作系統:Mac OS X
軟體:apktool
進入官網 https://ibotpeaches.github.io/Apktool/ ,點擊官網首頁的install( https://ibotpeaches.github.io/Apktool/install/ )進入安裝指南,裡面有Windows,Linux和Mac的安裝方法,不同的操作系統按不同的步驟來就可以了。
在終端輸入: apktool d xxx.apk ,我在反編譯時出現了以下錯誤:
看提示是無法寫入到這個目錄 /Users/xxx/Library/apktool/framework (xxx為電腦用戶名),那就在 /Users/xxx/Library 下新建apktool文件夾,並在apktool文件夾下再新建個framework文件夾,然後為了保險起見設置新建文件夾到許可權,在終端輸入: chmod -R 777 /Users/xxx/Library/apktool
接著再重新執行反編譯命令就可以成功了,在xxx.apk相同目錄下會出現反編譯後的文件夾。
在終端輸入編譯命令: apktool b xxx (xxx為剛才反編譯的文件夾),成功後會在xxx文件夾下的dist文件夾下生成打包好後的apk文件
現在打包好後的apk是沒有簽名的,所以無法安裝,現在給apk簽名
20000為時間,這個設置長點就好了,-keystore後面是簽名文件保存路徑。輸入命令按回車鍵會讓輸入密碼等信息,按提示輸入,不要忘了密碼,簽名時要用。
2.接著在終端輸入:
-keystore後面的為簽名文件的路徑,-signedjar後面為簽名好後apk的存放路徑,在這個後面的一個為需要簽名的pak的路徑,最後的android.keystore為證書的別名,如果不知道別名,可以在終端輸入: keytool -list -v -keystore /Users/xxx/Desktop/android.keystore 查看具體信息,裡面有別名。
這一步還要注意,簽名文件和需要簽名的apk要在同一目錄下。
