1. 程式人生 > >APK加殼詳解和demo

APK加殼詳解和demo

首先加殼的方法和程式碼都是從Jack_Jia的部落格學習的。

由於本人從c++開發直接跳到android開發,沒有對android進行系統的學習,看上面部落格時還是有很多不理解的地方。本文把不理解的地方梳理一下,最後提供個測試原始碼(加了比較詳細的註釋)。希望對於跟我一樣安卓基礎不是太好的人有一定幫助。

正文:

apk加殼的目的(我的用途):增加apk靜態分析的難度。(如果反編譯的人知道是加殼的,可以在data/包名目錄下 找到真正的apk。所以在殼上增加正常的程式碼的話可以增加迷惑性)

基礎知識:ClassLoader:http://www.iteye.com/topic/83978 這個寫的不錯想了解的可以去看看。

整個加殼的過程涉及到三個程式:要加殼的apk,加殼程式(demo中的apkjm),解殼程式(demo中的myunshell)。

其中加殼程式就是把要加殼的apk放入解殼程式的dex檔案中。

解殼程式是最後替代我們apk安裝到手機中執行的程式。它在執行中從自己的dex中釋放出我們apk程式。

步驟:

1.實現加殼程式。

2.實現解殼程式:按部落格建立個解殼的Application。如果我們的apk中用到了  Application,需要在解殼程式的xml檔案中新增:

          <meta-dataandroid:name="APPLICATION_CLASS_NAME"android:value

="com.***.Application"/>

          com.***.Application  是我們apk的Application類名 加上我們apk的包名

注:1.我們apk用到的許可權和元件都需要新增到解殼程式的xml中,元件都需要加上完整的包名路徑。

       2.我們apk內用到的資源也就是res檔案內的東西,需要拷貝到解殼程式的res中。

       3.如果我們apk靜態註冊了廣播接收器,那廣播接收器類需要在解殼程式中實現。

3.解殼程式完成後,把bin資料夾內的dex檔案拷出來,用加密程式把我們的apk新增到該dex檔案中。

4.把新生成的dex檔案覆蓋bin資料夾中原來的dex檔案,並把apk檔案也刪掉,重新執行解殼程式生成新的解殼apk。  這個apk就是我們需要的最後的apk檔案了。加殼就完成了。

另外:1.在解殼程式中對我們apk檔案進行解密函式呼叫的地方不對。 在demo中做了修改和說明。

           2.我在釋放apk的時候加了個判斷,如果檔案存在就不再釋放了,如果是在測試的時候,可以先遮蔽掉,免的每次執行除錯前要先刪掉原來的程式。

if (!dexFile.exists())
			{
				dexFile.createNewFile();  //在payload_odex資料夾內,建立payload.apk
				// 讀取程式classes.dex檔案
				byte[] dexdata = this.readDexFileFromApk();
				// 分離出解殼後的apk檔案已用於動態載入
				this.splitPayLoadFromDex(dexdata);
			}