這里
北大青鳥深圳嘉華老師將分享一些關于安卓開發教程中的加殼技術。希望能對想學安卓開發、或者是安卓開發工程師們有所幫助。
一、加殼技術原理
所謂apk的加殼技術和pc exe的加殼原理一樣,就是在程序的外面再包裹上另外一段代碼,保護里面的代碼不被非法修改或反編譯,在程序運行的時候優先取得程序的控制權做一些我們自己想做的工作。
PC exe的加殼過程如下:
二、android apk加殼實現
要想實現加殼需要解決的技術點如下:
(1)怎么第一時間執行我們的加殼程序?
首先根據上面的原理我們在apk中要想優先取得程序的控制權作為android apk的開發人員都知道Application會被系統第一時間調用而我們的程序也會放在這里執行。
(2)怎么將我們的加殼程序和原有的android apk文件合并到一起?
我們知道android apk最終會打包生成dex文件,我們可以將我們的程序生成dex文件后,將我們要進行加殼的apk和我們dex文件合并成一個文件,然后修改dex文件頭中的checksum、signature 和file_size的信息,并且要附加加殼的apk的長度信息在dex文件中,以便我們進行解殼保證原來apk的正常運行。加完殼后整個文件的結構如下:
(3)怎么將原來的apk正常的運行起來?
按照(2)中的合并方式在當我們的程序首先運行起來后,逆向讀取dex文件獲取原來的apk文件通過DexClassLoader動態加載。
具體實現如下:
(1)修改原來apk的AndroidMainfest.xml文件,假如原來apk的AndroidMainfest.xml文件內容如下:
1. <application
2. android:icon="@drawable/ic_launcher"
3. android:label="@string/app_name"
4. android:theme="@style/AppTheme" android:name="com.android.MyApplication" >
5. </application>
修改后的內容如下:
1. <application
2.android:icon="@drawable/ic_launcher"
3. android:label="@string/app_name"
4. android:theme="@style/AppTheme" android:name="com.android.shellApplication" >
5.<meta-data android:name="APPLICATION_CLASS_NAME" android:value="com.android.MyApplication"/>
6. </application>
com.android.shellApplication這個就是我們的程序的的application的名稱,而
7.<meta-data android:name="APPLICATION_CLASS_NAME" android:value="com.android.MyApplication"/>
是原來的apk的application名稱。
(2)合并文件代碼實現如下:
- 在我們的程序中加載運行原來的apk文件,代碼如下: