怎么逆向工程對Android Apk 進行反編譯
google Android開發(fā)是開源的察绷,開發(fā)過程中有些時候會遇到一些功能洪囤,自己不知道該怎么做,然而別的軟件里面已經(jīng)有了素跺,這個時候可以采用反編譯的方式最欠,解開其他的程序,來了解一些它 的做法督赤,同時啊懈万,還可以借鑒別人的軟件結(jié)構(gòu)拴清,資源文件;作為一個開發(fā)者钞速,你可能會很想知道這些效果界面是怎么去實現(xiàn)的贷掖,這時,你便可以對改應(yīng)用的APK進行反編譯查看渴语。
此方式主要目的是為了促進開發(fā)者學(xué)習(xí)苹威,借鑒好的代碼,提升自我開發(fā)水平驾凶。請勿去破解人家的軟件或其他操作
反編譯工具包
- apktools-目前最強大的反編譯工具
輕松反編譯apk牙甫,解析出資源文件掷酗,xml文件,生成smali文件窟哺,還可以把修改后的文件你想生成apk泻轰。
作用:資源文件獲取,可以提取出圖片文件和布局文件進行使用查看
- dex2jar
將apk中的dex文件轉(zhuǎn)換成為jar文件且轨,很多人不會看smali文件浮声,還是看java類文件比較舒服,這個時候可以借助這個工具來轉(zhuǎn)成java,也是支持windows,linux,mac旋奢。
作用:將apk反編譯成java源碼(classes.dex轉(zhuǎn)化成jar文件)
- jd-gui
查看jar文件,基本可以看到j(luò)ava class文件了泳挥,也是支持mac,windows,linux。
作用:查看APK中classes.dex轉(zhuǎn)化成出的jar文件至朗,即源碼文件
反編譯流程
一屉符、準(zhǔn)備好要反編譯的軟件
二、apk反編譯得到程序的源代碼锹引、圖片矗钟、XML配置、語言資源等文件
- 使用apktools進行apk反編譯得到程序的源代碼嫌变、圖片吨艇、XML配置、語言資源等文件
將需要反編譯的APK文件放到該目錄下初澎,打開命令行界面(運行-CMD) 秸应,定位到apktool文件夾,輸入以下命令:
apktool.bat d -f emanager.apk emanager
(命令中emanager.apk指的是要反編譯的APK文件全名碑宴,emanager為反編譯后資源文件存放的目錄名稱,即為:
apktool.bat d -f [apk文件 ] [輸出文件夾])
-
獲取成功后便有可以查看該應(yīng)用的所有資源文件了
圖片
- 如果你想將反編譯完的文件重新打包成apk桑谍,那你可以:輸入
apktool.bat b emanager(你編譯出來文件夾) 便可延柠,這就不述說了。
三锣披、Apk反編譯得到Java源代碼
- Apk反編譯得到Java源代碼
下載上述工具中的dex2jar和jd-gui 贞间,解壓將要反編譯的APK后綴名改為.rar或則 .zip,并解壓雹仿,得到其中的額
classes.dex文件
(它就是java文件編譯再通過dx工具打包而成的)增热,將獲取到的classes.dex放到之前解壓出來的工具dex2jar-0.0.9.15 文件夾內(nèi)
,在命令行下定位到dex2jar.bat所在目錄胧辽,輸入
dex2jar.bat classes.dex
-
目錄下會生成一個
classes_dex2jar.jar
的文件峻仇,然后打開工具jd-gui文件夾里的jd-gui.exe
,之后用該工具打開之前生成的classes_dex2jar.jar文件
邑商,便可以看到源碼了摄咆,效果如下:
圖片 -
被混淆過的效果圖(類文件名稱以及里面的方法名稱都會以a,b,c....之類的樣式命名):
圖片
可以看到反編譯的代碼和原本的代碼差別不大凡蚜,主要差別是原來的資源引用全都變成了數(shù)字。
即使那些代碼是混淆過的吭从,你可以得到他的大體思路對你的開發(fā)有益無害
防止APK程序被反編譯
作為Android應(yīng)用開發(fā)者朝蜘,不得不面對一個尷尬的局面,就是自己辛辛苦苦開發(fā)的應(yīng)用可以被別人很輕易的就反編譯出來涩金。
Google似乎也發(fā)現(xiàn)了這個問題谱醇,從SDK2.3開始我們可以看到在android-sdk-windows\tools\下面多了一個
proguard文件夾
proguard是一個java代碼混淆的工具,通過proguard步做,別人即使反編譯你的apk包副渴,也只會看到一些讓人很難看懂的代碼,從而達到保護代碼的作用辆床。
- 先介紹一下什么是代碼混淆:
代碼混淆(Obfuscated code)亦稱花指令佳晶,是將計算機程序的代碼,轉(zhuǎn)換成一種功能上等價讼载,但是難于閱讀和理解的形式的行為轿秧。代碼混淆可以用于程序源代碼,也可以用于程序編譯而成的中間代碼咨堤。執(zhí)行代碼混淆的程序被稱作代碼混淆器菇篡。目前已經(jīng)存在許多種功能各異的代碼混淆器。
將代碼中的各種元素一喘,如變量驱还,函數(shù),類的名字改寫成無意義的名字凸克。比如改寫成單個字母议蟆,或是簡短的無意義字母組合,甚至改寫成“__”這樣的符號萎战,使得閱讀的人無法根據(jù)名字猜測其用途咐容。重寫代碼中的部分邏輯,將其變成功能上等價蚂维,但是更難理解的形式戳粒。比如將for循環(huán)改寫成while循環(huán),將循環(huán)改寫成遞歸虫啥,精簡中間變量蔚约,等等。打亂代碼的格式涂籽。比如刪除空格苹祟,將多行代碼擠到一行中,或者將一行代碼斷成多行等等。
proguard.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 <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
proguard.cfg起作用的做法很簡單苔咪,就是在eclipse自動生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了
default.properties文件應(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