日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android反编译apktool,dex2jar和jd-gui的使用和一键反编译查看apk

發布時間:2023/12/10 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android反编译apktool,dex2jar和jd-gui的使用和一键反编译查看apk 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在實際應用中反編譯有下面這幾種用途:

1.測試應用的安全性。
這無疑是最重要的,不過難度很高需要專門做安全的人來做才有效果。
2.反編譯別的的apk
可以獲取別的資源文件。如果要破解代碼,那難度就更高了。
3.混淆查看效果
還有一個就是混淆看有沒有效果,或者混淆出問題了。

通常的用法是通過AS生成release版本的apk,然后通過apktool反編譯獲取到資源文件。通過dex2jar將classes.dex(可能存在多個)轉化為classes.jar。再通過jd-gui打開jar文件查看反編譯的源碼。

不過這個過程還是比較麻煩的,有些步驟都是可以自動完成的。通過寫自動腳本就可以將這些全部串聯起來。

0.目的

這篇博客的主要目的是實戰。在Android開發過程中有時候我們需要反編譯并查看反編譯后的源碼。這篇博客的目的就是要實現這個過程的自動化。
我們先來做一下分析。
第一步:定位需要處理的apk文件
一般我們生成帶簽名的release apk,默認目錄是app/release/app-release.apk。
一般路徑不太會更改,但apk的名字可能會更改,一般會加上日期。
例如:app/release/app-release-1970-01-01.apk

第二步:生成反編譯文件到build目錄
為了查看方便,我們不希望我們生成的反編譯文件到處亂放。
我們默認放到app/build/decompile/app-release-1970-01-01 這樣的目錄。
第三步:查看反編譯的jar源碼
調用jd-gui查看反編譯的jar源碼

下面我們將根據這個目的介紹這三個反編譯工具的使用。其實這三個工具使用都非常簡單。自動化執行節約時間才是關鍵。

1.下載

三個工具都是開源免費的。
apktool:主要的反編譯工具,可以將apk包反編譯,但不能反編譯dex文件。
dex2jar:就是用來反編譯dex
jd-gui:java源代碼查看工具,用于查看直接查看jar包的java源碼。

apktool:https://ibotpeaches.github.io/Apktool/
dex2jar:https://github.com/pxb1988/dex2jar
jd-gui:https://github.com/java-decompiler/jd-gui/releases

2.使用

2.1 apktool的使用

執行下面的命令就會反編譯

java -jar apktool.jar d pathTo/app-release.apk -o pathTo/outputPath


生成的目錄就是上面這個樣子。這里我們主要關心兩個目錄
res目錄:
一個是res目錄,這里面有我們的資源文件,通常是盜用別人的圖標。
smali目錄:
還有一個是smali文件,里面全是.smali結尾的文件。這個其實就是我們的源碼。但是是一種叫smali的字節碼。當然我們是看不懂的,這時候可以通過dex2jar工具轉化成jar。后面會介紹。

一鍵代碼實現

通過java調用shell命令或者cmd命令來執行apktool.jar,因為jar文件是跨平臺的,所以命令代碼是一樣的。
下面的代碼只是實現了apktool的最基本命令。

/*** 調用apktool*/public static void doApkTool() {try {File file=new File("app/build/decompile");if (file.exists()){FileUtils.deleteDirectory(file);}String[] cmd = {"sh", "-c", "java -jar " + apktool + " d " + sourceApk + " -o "+outPath};Process p = Runtime.getRuntime().exec(cmd);//創建實例進程執行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}

用到的變量:

/*** 反編譯工具目錄*/private static String toolsHome = "/home/xzh/Android/tools/";/*** apktool.jar 主要用于反編譯生成smill文件*/private static String apktool = toolsHome + "apktool.jar";/*** 用于查看反編譯的jar包的源碼*/private static String jdGui = toolsHome + "jd-gui.jar";/*** dex2jar工具,用于將.dex轉化為.jar文件,不過官網推薦是直接從apk生成成.jar*/private static String dex2jar=toolsHome+"dex2jar/d2j-dex2jar.sh";/*** ----------------------------------下面的三個變量需要配置-----------------------------------------------------*//*** 一般這個名字是加上日期的,可以當作解壓包名*/private static String apkName = "app-release.apk";/*** 需要反編譯的Apk包*/private static String sourceApk = "app/release/" + apkName;/*** 反編譯文件生成位置*/private static String outPath = "app/build/decompile/"+ apkName.replace(".apk","");


不出意外就會生成這些文件。當然apktool還有打包文件的作用,不過這不主要,我們以實現開頭的目的為主。其它功能–help查看一下就知道了,非常的簡單。我們的目的是要生成jar文件。可以通過dex2jar工具將smali轉成jar。或者將classes.dex轉化為jar。不過這里我們沒有發現classes.dex文件。因為只有通過直接解壓apk才會得到classes.dex文件。

通過直接解壓居然可以得到一個和通過apktool反編譯差不多的目錄。而且有一個classes.dex文件。網上很多的教程都是講這種直接解壓的。 不過,如果我們只是想查看反編譯的jar文件。根本就用不著這個apktool工具,也不需要解壓。 dex2jar是有辦法直接生成反編譯的jar的。

2.dex2jar

這個工具才是反編譯的工具,因為他提供了非常多的工具。

我們可以看到他提供了非常多的.sh文件,在windows版本下就是.bat文件。可以實現各種轉化。不過最有用的還是官網提供的命令:

sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk

通過這個代碼就可以直接從apk提取反編譯的jar文件。

java代碼實現:

/*** 調用dex2jar*/public static void doDex2Jar() {// unzipApk();long start = System.currentTimeMillis();System.out.println("開始裝換");try {File file=new File(outPath+"/classes.jar");if (file.exists()){FileUtils.deleteQuietly(file);}String[] cmd = {"sh", "-c", " sh " + dex2jar + " -f "+ sourceApk +" -o "+outPath+"/classes.jar >> /dev/null 2>&1 "};Process p = Runtime.getRuntime().exec(cmd);//創建實例進程執行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}long end = System.currentTimeMillis();System.out.println("耗時:"+(end-start)/1000+"秒");}

我們可以通過-o知道輸出的文件路徑,這里我們設置成app/build/decompile/app-release。

不出意外就會生成classes.jar這個文件。名字是我們自己設定的。
得到了jar文件,就可以通過我們的jd-gui來查看了。

3.jd-gui

使用也非常簡單。

java -jar jd-gui.jar pathTo/classes.jar

Java代碼實現

/*** 調用jd-gui解析jar包內容*/public static void doJdGui() {try {String[] cmd = {"sh", "-c", "java -jar " + jdGui +" "+outPath+"/classes.jar >> /dev/null 2>&1"};Process p = Runtime.getRuntime().exec(cmd);//創建實例進程執行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}


不出意外的話,就會自動彈出jd-gui的窗口。可以查看反編譯的源碼,這里我開啟了混淆,如果不開啟混淆的話,源碼差不多都是可以直接看到的,所以說不混淆是非常危險的。
最后貼出完整的代碼:

package com.xzh.utils;import org.apache.commons.io.FileUtils;import java.io.File;/*** 反編譯工具類*/ public class ReverseUtil {/*** 反編譯工具目錄*/private static String toolsHome = "/home/xzh/Android/tools/";/*** apktool.jar 主要用于反編譯生成smill文件*/private static String apktool = toolsHome + "apktool.jar";/*** 用于查看反編譯的jar包的源碼*/private static String jdGui = toolsHome + "jd-gui.jar";/*** dex2jar工具,用于將.dex轉化為.jar文件,不過官網推薦是直接從apk生成成.jar*/private static String dex2jar=toolsHome+"dex2jar/d2j-dex2jar.sh";/*** ----------------------------------下面的三個變量需要配置-----------------------------------------------------*//*** 一般這個名字是加上日期的,可以當作解壓包名*/private static String apkName = "app-release.apk";/*** 需要反編譯的Apk包*/private static String sourceApk = "app/release/" + apkName;/*** 反編譯文件生成位置*/private static String outPath = "app/build/decompile/"+ apkName.replace(".apk","");/*** 解壓Apk*/public static void unzipApk() {try {//必須添加>> /dev/null 2>&1不然卡死//覆蓋也會卡死 需要刪除File file = new File(outPath);if (file.exists()) {FileUtils.deleteDirectory(file);}String[] cmd = {"sh", "-c", "unzip -d " + outPath + " " + sourceApk + " >> /dev/null 2>&1"};Process p = Runtime.getRuntime().exec(cmd);//創建實例進程執行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}System.out.println("解壓完成");}/*** 調用apktool*/public static void doApkTool() {try {File file=new File("app/build/decompile");if (file.exists()){FileUtils.deleteDirectory(file);}String[] cmd = {"sh", "-c", "java -jar " + apktool + " d " + sourceApk + " -o "+outPath};Process p = Runtime.getRuntime().exec(cmd);//創建實例進程執行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}/*** 調用dex2jar*/public static void doDex2Jar() {// unzipApk();long start = System.currentTimeMillis();System.out.println("開始裝換");try {File file=new File(outPath+"/classes.jar");if (file.exists()){FileUtils.deleteQuietly(file);}String[] cmd = {"sh", "-c", " sh " + dex2jar + " -f "+ sourceApk +" -o "+outPath+"/classes.jar >> /dev/null 2>&1 "};Process p = Runtime.getRuntime().exec(cmd);//創建實例進程執行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}long end = System.currentTimeMillis();System.out.println("耗時:"+(end-start)/1000+"秒");}/*** 調用jd-gui解析jar包內容*/public static void doJdGui() {try {String[] cmd = {"sh", "-c", "java -jar " + jdGui +" "+outPath+"/classes.jar >> /dev/null 2>&1"};Process p = Runtime.getRuntime().exec(cmd);//創建實例進程執行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {//通過dex2jar直接獲取apk的classes.jar文件//ReverseUtil.doApkTool();// ReverseUtil.doDex2Jar();//查看源碼ReverseUtil.doJdGui();} }

總結

以上是生活随笔為你收集整理的Android反编译apktool,dex2jar和jd-gui的使用和一键反编译查看apk的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。