APK反編譯圖文教程
更新時(shí)間:2016-04-15 11:21:57 作者:vipra
學(xué)會(huì)反編譯比較關(guān)鍵,也是我們美化必須掌握的技術(shù)。學(xué)習(xí)反編譯也是制作ROM的開始。ROM 主機(jī)必須是反編譯器。全能,給你基礎(chǔ)和靈感,最重要的是我們可以獨(dú)立創(chuàng)新和思考
在學(xué)習(xí)開發(fā)的過程中,你會(huì)經(jīng)常學(xué)習(xí)別人的應(yīng)用是如何開發(fā)的。那些精美的動(dòng)畫和精致的布局可能會(huì)讓你愛上它們。作為一個(gè)開發(fā)者,你可能很想知道這些效果接口是怎樣的。要實(shí)現(xiàn),此時(shí)可以反編譯查看修改后應(yīng)用的APK。以下是我參考一些文章后的簡(jiǎn)單教程詳細(xì)解釋。
(注:反編譯并不是為開發(fā)者破解和重裝應(yīng)用程序,主要目的是促進(jìn)開發(fā)者學(xué)習(xí),向好的代碼學(xué)習(xí),提高自身開發(fā)水平。)
測(cè)試環(huán)境:
贏 7
使用工具:
腳本之家下載地址:
(資源文件獲?。┫螺d
(源碼文件獲取)下載
jd-gui(源代碼視圖)下載
最新正式版下載地址:
(代碼)
(代碼)
最新版本的jd-gui(代碼)請(qǐng)看官方
工具介紹:
功能:資源文件獲取,可以提取圖像文件和布局文件供使用和查看
功能:將apk反編譯成java源碼(.dex成jar文件)
jd-gui
功能:查看APK中.dex轉(zhuǎn)換后的jar文件,即源文件
反編譯過程:
一、apk反編譯得到程序的源代碼、圖片、XML配置、語言資源等文件
下載在上面的工具中,解壓得到3個(gè)文件:aapt.exe、.bat、.jar,把需要反編譯的APK文件放到這個(gè)目錄下,
打開命令行界面(運(yùn)行 -CMD),導(dǎo)航到文件夾,然后輸入以下命令:.bat d -f test.apk test
(命令中的test.apk是指要反編譯的APK文件全名,test是存放反編譯資源文件的目錄名,即:.bat d -f [apk file] [輸出文件夾])
表示采集成功。后來發(fā)現(xiàn)文件夾里有一個(gè)測(cè)試文件。點(diǎn)擊查看應(yīng)用的所有資源文件。
如果要將反編譯后的文件重新打包成apk,那么可以:輸入.bat b test(你編譯的文件夾),效果如下:
之后,可以在之前的測(cè)試文件下再找到兩個(gè)文件夾:
建造
dist(存儲(chǔ)打包的 APK 文件)
二、Apk反編譯得到Java源碼
上述工具中的下載和jd-gui,解壓
將要反編譯的APK后綴名改為.rar或.zip,解壓得到.dex文件(就是編譯好的java文件,然后用dx工具打包),把得到的.dex放到之前解壓的工具——0.0.9.15文件夾,
在命令行導(dǎo)航到.bat所在目錄,輸入..dex,效果如下:
改目錄下會(huì)生成一個(gè).jar文件,然后打開工具jd-gui文件夾下的jd-gui.exe,然后用工具打開之前生成的.jar文件,就可以看到源碼了編譯軟件下載,效果如下:
混淆效果圖(類文件名和其中的方法名會(huì)以a、b、c....等命名):
三、 圖形反編譯apk(我沒用過)
以上步驟一、2描述了apk的命令行反編譯,現(xiàn)提供圖形化反編譯工具:
一、下載上面的反編譯工具包,打開目錄,雙擊反編譯工具.exe,可以瀏覽打開要反編譯的apk
通過反編譯,您可以了解應(yīng)用程序使用了哪些第三方庫文件、其代碼是如何編寫的等等。
但是如果apk被混淆了,你看到的class文件名和里面的方法名會(huì)以a,b,c....風(fēng)格命名,所以你可以找到你想知道的接口代碼可能會(huì)很費(fèi)力,而且查找代碼可能看起來很費(fèi)力,但會(huì)獲得一個(gè)大致的概念。有了這個(gè)想法,你可以自己嘗試一下。
曾經(jīng)想寫一個(gè)類似的名人界面布局編譯軟件下載,但是剛接觸的時(shí)候不知道怎么寫,所以反編譯了。即使他的代碼被混淆了,我可以看到他通過 TYPE 設(shè)置不同的 ITEM 布局是實(shí)現(xiàn)的。很多參考資料可能會(huì)用重寫VIEW來達(dá)到效果,你可以大致了解他的開發(fā)對(duì)你的開發(fā)是無害的。
還有一個(gè)開發(fā)者辛辛苦苦開發(fā)自己的應(yīng)用,被別人反編譯,變成了自己的東西,所以需要混淆。
作為一個(gè)應(yīng)用開發(fā)者,你不得不面對(duì)一個(gè)尷尬的局面,那就是你辛辛苦苦開發(fā)的應(yīng)用,很容易被別人反編譯。
好像也發(fā)現(xiàn)了這個(gè)問題。從SDK2.3開始??,我們可以看到-sdk-\tools\下多了一個(gè)文件夾
它是一個(gè)java代碼混淆工具。即使別人反編譯你的apk包,也只會(huì)看到一些難以理解的代碼,從而保護(hù)代碼。
下面說說如何讓SDK2.3下的.cfg文件生效。我們先看一下-sdk-\tools\lib\.cfg的內(nèi)容:
-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.... 的基本組件都保留在混淆中。
并且保留了所有的變量名和類名,所有的類都是具有固定參數(shù)格式、枚舉等的構(gòu)造函數(shù)的一部分。(詳情請(qǐng)參考
/ 中的示例和注釋。)
使.cfg 工作的方法很簡(jiǎn)單,只需在自動(dòng)生成的.file 中添加一句“.=.cfg”。
完整的 .file 應(yīng)如下所示:
# 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
大功告成,正常的編譯簽名可以防止代碼被反編譯。