Android反编译apktool,dex2jar和jd-gui的使用和一键反编译查看apk
在實際應(yīng)用中反編譯有下面這幾種用途:
1.測試應(yīng)用的安全性。
這無疑是最重要的,不過難度很高需要專門做安全的人來做才有效果。
2.反編譯別的的apk
可以獲取別的資源文件。如果要破解代碼,那難度就更高了。
3.混淆查看效果
還有一個就是混淆看有沒有效果,或者混淆出問題了。
通常的用法是通過AS生成release版本的apk,然后通過apktool反編譯獲取到資源文件。通過dex2jar將classes.dex(可能存在多個)轉(zhuǎn)化為classes.jar。再通過jd-gui打開jar文件查看反編譯的源碼。
不過這個過程還是比較麻煩的,有些步驟都是可以自動完成的。通過寫自動腳本就可以將這些全部串聯(lián)起來。
0.目的
這篇博客的主要目的是實戰(zhàn)。在Android開發(fā)過程中有時候我們需要反編譯并查看反編譯后的源碼。這篇博客的目的就是要實現(xiàn)這個過程的自動化。
我們先來做一下分析。
第一步:定位需要處理的apk文件
一般我們生成帶簽名的release apk,默認(rèn)目錄是app/release/app-release.apk。
一般路徑不太會更改,但apk的名字可能會更改,一般會加上日期。
例如:app/release/app-release-1970-01-01.apk
第二步:生成反編譯文件到build目錄
為了查看方便,我們不希望我們生成的反編譯文件到處亂放。
我們默認(rèn)放到app/build/decompile/app-release-1970-01-01 這樣的目錄。
第三步:查看反編譯的jar源碼
調(diào)用jd-gui查看反編譯的jar源碼
下面我們將根據(jù)這個目的介紹這三個反編譯工具的使用。其實這三個工具使用都非常簡單。自動化執(zhí)行節(jié)約時間才是關(guān)鍵。
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的使用
執(zhí)行下面的命令就會反編譯
java -jar apktool.jar d pathTo/app-release.apk -o pathTo/outputPath
生成的目錄就是上面這個樣子。這里我們主要關(guān)心兩個目錄
res目錄:
一個是res目錄,這里面有我們的資源文件,通常是盜用別人的圖標(biāo)。
smali目錄:
還有一個是smali文件,里面全是.smali結(jié)尾的文件。這個其實就是我們的源碼。但是是一種叫smali的字節(jié)碼。當(dāng)然我們是看不懂的,這時候可以通過dex2jar工具轉(zhuǎn)化成jar。后面會介紹。
一鍵代碼實現(xiàn)
通過java調(diào)用shell命令或者cmd命令來執(zhí)行apktool.jar,因為jar文件是跨平臺的,所以命令代碼是一樣的。
下面的代碼只是實現(xiàn)了apktool的最基本命令。
用到的變量:
/*** 反編譯工具目錄*/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轉(zhuǎn)化為.jar文件,不過官網(wǎng)推薦是直接從apk生成成.jar*/private static String dex2jar=toolsHome+"dex2jar/d2j-dex2jar.sh";/*** ----------------------------------下面的三個變量需要配置-----------------------------------------------------*//*** 一般這個名字是加上日期的,可以當(dāng)作解壓包名*/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","");
不出意外就會生成這些文件。當(dāng)然apktool還有打包文件的作用,不過這不主要,我們以實現(xiàn)開頭的目的為主。其它功能–help查看一下就知道了,非常的簡單。我們的目的是要生成jar文件。可以通過dex2jar工具將smali轉(zhuǎn)成jar。或者將classes.dex轉(zhuǎn)化為jar。不過這里我們沒有發(fā)現(xiàn)classes.dex文件。因為只有通過直接解壓apk才會得到classes.dex文件。
通過直接解壓居然可以得到一個和通過apktool反編譯差不多的目錄。而且有一個classes.dex文件。網(wǎng)上很多的教程都是講這種直接解壓的。 不過,如果我們只是想查看反編譯的jar文件。根本就用不著這個apktool工具,也不需要解壓。 dex2jar是有辦法直接生成反編譯的jar的。
2.dex2jar
這個工具才是反編譯的工具,因為他提供了非常多的工具。
我們可以看到他提供了非常多的.sh文件,在windows版本下就是.bat文件。可以實現(xiàn)各種轉(zhuǎn)化。不過最有用的還是官網(wǎng)提供的命令:
通過這個代碼就可以直接從apk提取反編譯的jar文件。
java代碼實現(xiàn):
/*** 調(diào)用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);//創(chuàng)建實例進(jìn)程執(zhí)行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}long end = System.currentTimeMillis();System.out.println("耗時:"+(end-start)/1000+"秒");}我們可以通過-o知道輸出的文件路徑,這里我們設(shè)置成app/build/decompile/app-release。
不出意外就會生成classes.jar這個文件。名字是我們自己設(shè)定的。
得到了jar文件,就可以通過我們的jd-gui來查看了。
3.jd-gui
使用也非常簡單。
java -jar jd-gui.jar pathTo/classes.jarJava代碼實現(xiàn)
/*** 調(diào)用jd-gui解析jar包內(nèi)容*/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);//創(chuàng)建實例進(jìn)程執(zhí)行命令行代碼p.waitFor();p.destroy();} catch (Exception e) {e.printStackTrace();}}
不出意外的話,就會自動彈出jd-gui的窗口。可以查看反編譯的源碼,這里我開啟了混淆,如果不開啟混淆的話,源碼差不多都是可以直接看到的,所以說不混淆是非常危險的。
最后貼出完整的代碼:
總結(jié)
以上是生活随笔為你收集整理的Android反编译apktool,dex2jar和jd-gui的使用和一键反编译查看apk的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机当电脑麦克风 linux,WO Mi
- 下一篇: SQL的主键和外键约束 小记