首頁 > 軟體

Android Apk反編譯及加密教學

2022-03-31 16:00:33

這幾天在上海出差,忙裡偷閒學習了一下Apk的反編譯工具的基本使用。下面就簡單介紹一下如何將我們從網上下載的Apk檔案進行反編譯得到我們想要獲得的資原始檔和原始碼。

一、Apk檔案組成

Android的應用程式APK檔案說到底也是一個壓縮檔案,那麼可以通過解壓縮得打裡面的檔案內容,不過很顯然,當你去解壓完去檢視的時候,發現裡面的很多東西和你想象中的不太一樣。資原始檔等xml檔案基本打不開,即使開啟了也都是亂碼(而這正是Android進行加密過),有些應用會將圖片資源等的也加密(如qq音樂)。

而既然直接解壓無法看到正常的應用程式,那麼就需要藉助反編譯軟體來實現APK的反編譯。

二、反編譯必備工具及使用

Android工程檔案主要有資原始檔和原始碼組成。而為了檢視資原始檔需要藉助一個工具,本文使用的是apktool工具進行反編譯,經過編譯後能夠正確檢視XML檔案和其他的非XML的資原始檔,這對於漢化而言有著巨大的意義。而為了檢視原始碼,則需要藉助於dex2jar和jd-gui這兩個工具,其中dex2jar工具負責將dex檔案轉化為jar檔案,而jd-gui則用於檢視jar檔案。

1)apktool

一次失敗的經歷-----使用apktool時報錯

原因:apktool的版本過低,無法解析當前版本的apk。

修正:

更新最新的apktool版本後正常,本文使用的最新apktool版本為2.2.2.

然後就可以發現資原始檔等xml檔案可以正常開啟。

2)Dex2jar 

接下來就需要對source code進行反編譯。

需要藉助工具Dex2jar和jd-gui。其中Dex2jar,顧名思義就是將dex檔案反編譯為jar檔案。而jd-gui則用於直接檢視jar包中的原始碼。

具體步驟就是將apk檔案解壓,得到其中的classes.dex,它就是java檔案經過編譯而後通過dx工具打包而成的,而後解壓下載的dex2jar,將classes.dex複製到dex2jar根目錄下,在命令列下定位到該目錄下,執行d2j-dex2jar.bat classes.dex classes.dex

可以發現得到一個classes-dex2jar.jar檔案。這個檔案就是我們需要得到的source code。

3)jd-gui

接下來需要在jd-gui中瀏覽該檔案,這個就是最終的結果

當然,你也發現了這些原始碼都是被混淆了的,即用無意義的字母來重新命名類、成員變數、方法和屬性以及刪除沒用的註釋。

三、Apk的加密過程

既然都提到了這裡了,我們也順便了解一下Android Apk的加密過程。

由於Java位元組碼的特殊性,使得它非常容易被反編譯,(正如剛才我們進行的那些操作,藉助一下工具就反編譯了一個QQ音樂的Apk),因此,顯然我們會有一些保護措施,對編譯好的Class檔案進行一些保護。通常我們都會使用ProGuard來對Apk進行混淆處理,用無意義的字母倆重新命名類、成員變數、方法和屬性。(當然它能刪除一些無用的類、成員變數、方法和屬性以及刪除沒用的註釋,最大程度優化位元組碼檔案)

而現在我們一般都採用Android Studio作為開發平臺,在該平臺下可以很方便的使用ProGuard,在Gradle Script資料夾下,開啟build.gradle(Module:app)檔案,顯示如下:

這裡的minifyEnable即為控制是否啟動ProGuard的開關,設定為true則開啟ProGuard進行混淆和優化。

而proguardFiles分為兩部分,前半部分是一個系統預設的混淆檔案,位於SDK目錄下的tools/proguard/proguard-android.txt,一般情況下使用這個預設的檔案即可,另一部分是專案中自定義的混淆檔案,可以在專案中的App資料夾中找到這個檔案,在這個資料夾中可以定義引入的第三方依賴包的混淆規則。設定好ProGuard後,只要使用AS匯出Apk,即可生成混淆後的位元組碼檔案。

以上就是Android Apk反編譯及加密教學的詳細內容,更多關於Android Apk反編譯及加密的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com