----------------------------我是前言分割線---------------------------------
何為APK届慈?大家應(yīng)該都知道Android項(xiàng)目打包好后的產(chǎn)物,然后能裝到手機(jī)上運(yùn)行忿偷,但是具體apk里面具體有哪些東西金顿,可能很多人都答不出來。
----------------------------我是反編譯君-----------------------------------
apk
APK是AndroidPackage的縮寫鲤桥,即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等這些目錄下是可以直接看到圖片文件套耕,可以直接拿出來自己用谁帕。但是一些xml文件,比如在layout目錄下的testitem.xml文件冯袍,打開后會(huì)是字節(jié)碼匈挖,不能直接使用。(其中abc和notification開頭的文件不是開發(fā)者寫的那些文件康愤,可以忽略)
那我看到網(wǎng)絡(luò)上優(yōu)秀的APK儡循,就只能解壓拿個(gè)圖片,一些布局啊征冷,代碼啊择膝,都不能做參考?不能去膜拜下別人是怎么寫的嗎检激?答案當(dāng)然是NO肴捉。(強(qiáng)行怒裝一波B)
--------------------------------開始正式起航----------------------------------
介紹我們的主角
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里面通過command+shift+g傲隶,然后輸入/usr/local/bin,跳到指定文件夾中,5更改這二個(gè)文件的權(quán)限窃页,在終端中執(zhí)行chomd +x(后面跟上文件)來修改跺株,6.然后執(zhí)行apktool
ok之后我們就快來用apktool來體驗(yàn)下。
apktool d xxxx.apk
這時(shí)候會(huì)將apk解析為一個(gè)與apk同名的文件夾脖卖,改文件夾會(huì)處于你的終端的當(dāng)前目錄下帖鸦,比如我圖片中的當(dāng)前目錄是在willy的用戶目錄下,所以解析的文件夾也就在該目錄下胚嘲。
這時(shí)候再到layout文件夾下找到上面我們打開過的testitem.xml。
其他的比如AndroidManifest.xml等也都能查看洛二。
假如一個(gè)先生想用知識(shí)去啟導(dǎo)一個(gè)葬身在無知之中的學(xué)生馋劈,他便先得激起他的注意,使它能用一種貪婪的心理去吸取知識(shí)----夸美紐斯
人往往都是貪婪的晾嘶〖宋恚看到了布局,有了圖片資源這些垒迂。又會(huì)想要看源碼械姻,那些Java代碼是怎么寫的。
這時(shí)候要用到另外的工具机断,第二主角上場(chǎng)
2.dex2jar + jd-gui
下載dex2jar 和 jd-gui楷拳。這個(gè)百度下。就可以各種下載吏奸。
1.dex2jar下載后欢揖,解壓到某個(gè)目錄下。jd-gui是個(gè)dmg安裝包
2.打開終端奋蔚,輸入命令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.打開jd-gui文件坤按,將classes-dex2jar.jar拖入jd-gui界面上,就能夠看到Java文件了
反編譯的作用不僅是拿到資源馒过,看到代碼臭脓,你也可以對(duì)里面的資源進(jìn)行替換,甚至修改代碼沉桌,來進(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)上搜下。很方便就能搜到瘤运。在此就不多說了窍霞。)
---------------------------我是apk保護(hù)君------------------------------------
好了,大概講了上面的反編譯的一些方式拯坟。接下來講下如何讓我們的Android 源碼不容易給別人看到呢但金。
Proguard:
本來是準(zhǔn)備長篇介紹的。后來我在別的博客上看關(guān)于Proguard介紹郁季。發(fā)現(xiàn)其他大神寫的不錯(cuò)的冷溃。我也就直接拿來推薦了.
點(diǎn)擊進(jìn)入傳送門:
ProGuard使用詳解
ProGuard的官方文檔整理后解說
DexGuard
但是如果你需要頂尖的安全性,ProGuard就力不從心了梦裂,你需要DexGuard
點(diǎn)擊進(jìn)入傳送門:DexGuard似枕。
額外的處理
你需要知道如何安全的存儲(chǔ)app中的API keys。如果你要處理用戶的敏感數(shù)據(jù)年柠,你必須知道如何加密凿歼,選擇何種加密算法(安全且快速)。
你還應(yīng)該安全的把密鑰存儲(chǔ)在本地或者服務(wù)器上冗恨。應(yīng)該防止app數(shù)據(jù)被人用ADB備份答憔。如果你在數(shù)據(jù)庫中存儲(chǔ)敏感數(shù)據(jù),要考慮做適當(dāng)?shù)膫窝b派近。
附上二篇文章傳送門:
Android Security: Adding Tampering Detection to Your App
Hiding Secrets in Android Apps
當(dāng)然攀唯。這都只是增加那些想反編譯你apk的人的難度。他們還是能通過各種方式來get到你的apk的各種信息渴丸。這時(shí)候我們只能盡量多做一些措施侯嘀。
-----------------------------------題外話-------------------------------------
ps:題外話,那大公司比如支付寶谱轨,QQ這些是怎么處理的呢
引用另外大神們的文章來進(jìn)行說明戒幔。
點(diǎn)擊進(jìn)入傳送門:這是你眼中的混淆嗎?ProGuard
摘取部分內(nèi)容如下:
真正需要考慮安全的代碼,真的會(huì)用java編譯嗎土童?
答案可想而知诗茎,如果嘗試的反編譯微信,支付寶的代碼的可以看到里面大量的.so文件,他們真正有價(jià)值的代碼是用c寫的敢订,通過jni調(diào)用王污,這樣不僅安全而且一套代碼Android,iOS都可用楚午。這個(gè)才是最安全的做法昭齐!