----------------------------我是前言分割線---------------------------------
何為APK?大家應(yīng)該都知道Android項(xiàng)目打包好后的產(chǎn)物,然后能裝到手機(jī)上運(yùn)行,但是具體apk里面具體有哪些東西,可能很多人都答不出來(lái)。
----------------------------我是反編譯君-----------------------------------
apk
APK是AndroidPackage的縮寫(xiě),即Android安裝包。把a(bǔ)ndroid sdk編譯的工程打包成一個(gè)安裝程序文件,格式為apk。 APK文件其實(shí)是zip格式,但后綴名被修改為apk。我們可以把后綴名.apk改為.zip。然后將其解壓。
解壓后的文件結(jié)構(gòu)
- META-INF\ (注:Jar文件中常可以看到);
- res\ (注:存放資源文件的目錄) ;
- AndroidManifest.xml (注:程序全局配置文件) ;
- classes.dex (注:Dalvik字節(jié)碼);
- resources.arsc (注:編譯后的二進(jìn)制資源文件)。
在res目錄下我們可以看到各種資源,
其中圖片資源比如drawable-hdpi等這些目錄下是可以直接看到圖片文件,可以直接拿出來(lái)自己用。但是一些xml文件,比如在layout目錄下的testitem.xml文件,打開(kāi)后會(huì)是字節(jié)碼,不能直接使用。(其中abc和notification開(kāi)頭的文件不是開(kāi)發(fā)者寫(xiě)的那些文件,可以忽略)
那我看到網(wǎng)絡(luò)上優(yōu)秀的APK,就只能解壓拿個(gè)圖片,一些布局啊,代碼啊,都不能做參考?不能去膜拜下別人是怎么寫(xiě)的嗎?答案當(dāng)然是NO。(強(qiáng)行怒裝一波B)
--------------------------------開(kāi)始正式起航----------------------------------
介紹我們的主角
1.apktool
解析apk的第三方工具, 安裝方式參考.
Mac OS X:
- Download Mac wrapper script (Right click, Save Link As apktool)
- Download apktool-2 (find newest here)
- Rename downloaded jar to apktool.jar
- Move both files (apktool.jar & apktool) to /usr/local/bin (root needed)
- Make sure both files are executable (chmod +x)
- Try running apktool via cli
根據(jù)英文我大概解釋下:
1,2根據(jù)提示下載相應(yīng)的東西,3改名字,4將下載的二個(gè)文件放到指定目錄下(可以在file里面通過(guò)command+shift+g,然后輸入/usr/local/bin,跳到指定文件夾中,5更改這二個(gè)文件的權(quán)限,在終端中執(zhí)行chomd +x(后面跟上文件)來(lái)修改,6.然后執(zhí)行apktool
ok之后我們就快來(lái)用apktool來(lái)體驗(yàn)下。
apktool d xxxx.apk
這時(shí)候會(huì)將apk解析為一個(gè)與apk同名的文件夾,改文件夾會(huì)處于你的終端的當(dāng)前目錄下,比如我圖片中的當(dāng)前目錄是在willy的用戶目錄下,所以解析的文件夾也就在該目錄下。
這時(shí)候再到layout文件夾下找到上面我們打開(kāi)過(guò)的testitem.xml。
其他的比如AndroidManifest.xml等也都能查看。
假如一個(gè)先生想用知識(shí)去啟導(dǎo)一個(gè)葬身在無(wú)知之中的學(xué)生,他便先得激起他的注意,使它能用一種貪婪的心理去吸取知識(shí)----夸美紐斯
人往往都是貪婪的。看到了布局,有了圖片資源這些。又會(huì)想要看源碼,那些Java代碼是怎么寫(xiě)的。
這時(shí)候要用到另外的工具,第二主角上場(chǎng)
2.dex2jar + jd-gui
下載dex2jar 和 jd-gui。這個(gè)百度下。就可以各種下載。
1.dex2jar下載后,解壓到某個(gè)目錄下。jd-gui是個(gè)dmg安裝包
2.打開(kāi)終端,輸入命令cd xxx/xxx/dex2jar,進(jìn)入下載的dex2jar文件夾中
3.輸入命令sh d2j-dex2jar.sh -f -o classes.jar /XXX/XXX/XXX.apk,操作完成后,會(huì)在dex2jar文件夾中生成一個(gè)classes.jar文件
4.打開(kāi)jd-gui文件,將classes-dex2jar.jar拖入jd-gui界面上,就能夠看到Java文件了
反編譯的作用不僅是拿到資源,看到代碼,你也可以對(duì)里面的資源進(jìn)行替換,甚至修改代碼,來(lái)進(jìn)行業(yè)務(wù)邏輯的變動(dòng),比如一款軟件收費(fèi)后可以去除軟件里面的廣告,如果它的是否已經(jīng)付費(fèi)的業(yè)務(wù)判斷放在前端,則用戶直接反編譯再修改這個(gè)判斷條件,再打包好后就可以使用了。又或者是植入病毒,加入自己的廣告,使用apktool工具進(jìn)行二次打包傳播。
(apktool不僅能反編譯apk,還能再將解壓后的資源再打包成apk,具體的再打包成apk的就進(jìn)行網(wǎng)上搜下。很方便就能搜到。在此就不多說(shuō)了。)
---------------------------我是apk保護(hù)君------------------------------------
好了,大概講了上面的反編譯的一些方式。接下來(lái)講下如何讓我們的Android 源碼不容易給別人看到呢。
Proguard:
本來(lái)是準(zhǔn)備長(zhǎng)篇介紹的。后來(lái)我在別的博客上看關(guān)于Proguard介紹。發(fā)現(xiàn)其他大神寫(xiě)的不錯(cuò)的。我也就直接拿來(lái)推薦了.
點(diǎn)擊進(jìn)入傳送門(mén):
ProGuard使用詳解
ProGuard的官方文檔整理后解說(shuō)
DexGuard
但是如果你需要頂尖的安全性,ProGuard就力不從心了,你需要DexGuard
點(diǎn)擊進(jìn)入傳送門(mén):DexGuard。
額外的處理
你需要知道如何安全的存儲(chǔ)app中的API keys。如果你要處理用戶的敏感數(shù)據(jù),你必須知道如何加密,選擇何種加密算法(安全且快速)。
你還應(yīng)該安全的把密鑰存儲(chǔ)在本地或者服務(wù)器上。應(yīng)該防止app數(shù)據(jù)被人用ADB備份。如果你在數(shù)據(jù)庫(kù)中存儲(chǔ)敏感數(shù)據(jù),要考慮做適當(dāng)?shù)膫窝b。
附上二篇文章傳送門(mén):
Android Security: Adding Tampering Detection to Your App
Hiding Secrets in Android Apps
當(dāng)然。這都只是增加那些想反編譯你apk的人的難度。他們還是能通過(guò)各種方式來(lái)get到你的apk的各種信息。這時(shí)候我們只能盡量多做一些措施。
-----------------------------------題外話-------------------------------------
ps:題外話,那大公司比如支付寶,QQ這些是怎么處理的呢
引用另外大神們的文章來(lái)進(jìn)行說(shuō)明。
點(diǎn)擊進(jìn)入傳送門(mén):這是你眼中的混淆嗎?ProGuard
摘取部分內(nèi)容如下:
真正需要考慮安全的代碼,真的會(huì)用java編譯嗎?
答案可想而知,如果嘗試的反編譯微信,支付寶的代碼的可以看到里面大量的.so文件,他們真正有價(jià)值的代碼是用c寫(xiě)的,通過(guò)jni調(diào)用,這樣不僅安全而且一套代碼Android,iOS都可用。這個(gè)才是最安全的做法!