Android apk 的反編譯及保護(hù)雜談

別說話,吻我

----------------------------我是前言分割線---------------------------------

何為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。然后將其解壓。

apk后綴名改為zip
解壓改了后綴名的壓縮包

解壓后的文件結(jié)構(gòu)

  1. META-INF\ (注:Jar文件中常可以看到);
  2. res\ (注:存放資源文件的目錄) ;
  3. AndroidManifest.xml (注:程序全局配置文件) ;
  4. classes.dex (注:Dalvik字節(jié)碼);
  5. resources.arsc (注:編譯后的二進(jìn)制資源文件)。

在res目錄下我們可以看到各種資源,


res目錄

其中圖片資源比如drawable-hdpi等這些目錄下是可以直接看到圖片文件,可以直接拿出來自己用。但是一些xml文件,比如在layout目錄下的testitem.xml文件,打開后會(huì)是字節(jié)碼,不能直接使用。(其中abc和notification開頭的文件不是開發(fā)者寫的那些文件,可以忽略)

layout下的xml文件

那我看到網(wǎng)絡(luò)上優(yōu)秀的APK,就只能解壓拿個(gè)圖片,一些布局啊,代碼啊,都不能做參考?不能去膜拜下別人是怎么寫的嗎?答案當(dāng)然是NO。(強(qiáng)行怒裝一波B)

--------------------------------開始正式起航----------------------------------

介紹我們的主角

1.apktool

解析apk的第三方工具, 安裝方式參考.

Mac OS X:

  1. Download Mac wrapper script (Right click, Save Link As apktool)
  2. Download apktool-2 (find newest here)
  3. Rename downloaded jar to apktool.jar
  4. Move both files (apktool.jar & apktool) to /usr/local/bin (root needed)
  5. Make sure both files are executable (chmod +x)
  6. 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

下載的二個(gè)文件放在/usr/local/bin目錄下
修改文件權(quán)限

ok之后我們就快來用apktool來體驗(yàn)下。
apktool d xxxx.apk

apktool解析apk

這時(shí)候會(huì)將apk解析為一個(gè)與apk同名的文件夾,改文件夾會(huì)處于你的終端的當(dāng)前目錄下,比如我圖片中的當(dāng)前目錄是在willy的用戶目錄下,所以解析的文件夾也就在該目錄下。

這時(shí)候再到layout文件夾下找到上面我們打開過的testitem.xml。


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文件了

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)備長(zhǎng)篇介紹的。后來我在別的博客上看關(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è)才是最安全的做法!


Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容