APK反編譯圖文教程
更新時間:2016-04-15 11:21:57 作者:vipra
學會反編譯比較關鍵,也是我們美化必須掌握的技術。學習反編譯也是制作ROM的開始。ROM 主機必須是反編譯器。全能,給你基礎和靈感,最重要的是我們可以獨立創(chuàng)新和思考
在學習開發(fā)的過程中,你會經常學習別人的應用是如何開發(fā)的。那些精美的動畫和精致的布局可能會讓你愛上它們。作為一個開發(fā)者,你可能很想知道這些效果接口是怎樣的。要實現,此時可以反編譯查看修改后應用的APK。以下是我參考一些文章后的簡單教程詳細解釋。
(注:反編譯并不是為開發(fā)者破解和重裝應用程序,主要目的是促進開發(fā)者學習,向好的代碼學習,提高自身開發(fā)水平。)
測試環(huán)境:
贏 7
使用工具:
腳本之家下載地址:
(資源文件獲?。┫螺d
(源碼文件獲取)下載
jd-gui(源代碼視圖)下載
最新正式版下載地址:
(代碼)
(代碼)
最新版本的jd-gui(代碼)請看官方
工具介紹:
功能:資源文件獲取,可以提取圖像文件和布局文件供使用和查看
功能:將apk反編譯成java源碼(.dex成jar文件)
jd-gui
功能:查看APK中.dex轉換后的jar文件,即源文件
反編譯過程:
一、apk反編譯得到程序的源代碼、圖片、XML配置、語言資源等文件
下載在上面的工具中,解壓得到3個文件:aapt.exe、.bat、.jar,把需要反編譯的APK文件放到這個目錄下,
打開命令行界面(運行 -CMD),導航到文件夾,然后輸入以下命令:.bat d -f test.apk test
(命令中的test.apk是指要反編譯的APK文件全名,test是存放反編譯資源文件的目錄名,即:.bat d -f [apk file] [輸出文件夾])
表示采集成功。后來發(fā)現文件夾里有一個測試文件。點擊查看應用的所有資源文件。
如果要將反編譯后的文件重新打包成apk,那么可以:輸入.bat b test(你編譯的文件夾),效果如下:
之后,可以在之前的測試文件下再找到兩個文件夾:
建造
dist(存儲打包的 APK 文件)
二、Apk反編譯得到Java源碼
上述工具中的下載和jd-gui,解壓
將要反編譯的APK后綴名改為.rar或.zip,解壓得到.dex文件(就是編譯好的java文件,然后用dx工具打包),把得到的.dex放到之前解壓的工具——0.0.9.15文件夾,
在命令行導航到.bat所在目錄,輸入..dex,效果如下:
改目錄下會生成一個.jar文件,然后打開工具jd-gui文件夾下的jd-gui.exe,然后用工具打開之前生成的.jar文件,就可以看到源碼了編譯軟件下載,效果如下:
混淆效果圖(類文件名和其中的方法名會以a、b、c....等命名):
三、 圖形反編譯apk(我沒用過)
以上步驟一、2描述了apk的命令行反編譯,現提供圖形化反編譯工具:
一、下載上面的反編譯工具包,打開目錄,雙擊反編譯工具.exe,可以瀏覽打開要反編譯的apk
通過反編譯,您可以了解應用程序使用了哪些第三方庫文件、其代碼是如何編寫的等等。
但是如果apk被混淆了,你看到的class文件名和里面的方法名會以a,b,c....風格命名,所以你可以找到你想知道的接口代碼可能會很費力,而且查找代碼可能看起來很費力,但會獲得一個大致的概念。有了這個想法,你可以自己嘗試一下。
曾經想寫一個類似的名人界面布局編譯軟件下載,但是剛接觸的時候不知道怎么寫,所以反編譯了。即使他的代碼被混淆了,我可以看到他通過 TYPE 設置不同的 ITEM 布局是實現的。很多參考資料可能會用重寫VIEW來達到效果,你可以大致了解他的開發(fā)對你的開發(fā)是無害的。
還有一個開發(fā)者辛辛苦苦開發(fā)自己的應用,被別人反編譯,變成了自己的東西,所以需要混淆。
作為一個應用開發(fā)者,你不得不面對一個尷尬的局面,那就是你辛辛苦苦開發(fā)的應用,很容易被別人反編譯。
好像也發(fā)現了這個問題。從SDK2.3開始??,我們可以看到-sdk-\tools\下多了一個文件夾
它是一個java代碼混淆工具。即使別人反編譯你的apk包,也只會看到一些難以理解的代碼,從而保護代碼。
下面說說如何讓SDK2.3下的.cfg文件生效。我們先看一下-sdk-\tools\lib\.cfg的內容:
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native; } -keepclasseswithmembernames class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
從腳本中可以看出,繼承自 , , , , 和 com.... 的基本組件都保留在混淆中。
并且保留了所有的變量名和類名,所有的類都是具有固定參數格式、枚舉等的構造函數的一部分。(詳情請參考
/ 中的示例和注釋。)
使.cfg 工作的方法很簡單,只需在自動生成的.file 中添加一句“.=.cfg”。
完整的 .file 應如下所示:
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system use, # "build.properties", and override values to adapt the script to your # project structure. # Project target. target=android-9 proguard.config=proguard.cfg
大功告成,正常的編譯簽名可以防止代碼被反編譯。