一、什麼是加殼?
加殼是在二進制的程序中植入一段代碼,在運行的時候優先取得程序的控制權,做一些額外的工作。大多數病毒就是基於此原理。PC EXE文件加殼的過程如下:
二、加殼作用
加殼的程序可以有效阻止對程序的反彙編分析,以達到它不可告人的目的。這種技術也常用來保護軟件版權,防止被軟件破解。
三、Android Dex文件加殼原理
PC平臺現在已存在大量的標準的加殼和解殼工具,但是Android作爲新興平臺還未出現APK加殼工具。Android Dex文件大量使用引用給加殼帶來了一定的難度,但是從理論上講,Android APK加殼也是可行的。
在這個過程中,牽扯到三個角色:
1、加殼程序:加密源程序爲解殼數據、組裝解殼程序和解殼數據
2、解殼程序:解密解殼數據,並運行時通過DexClassLoader動態加載
3、源程序:需要加殼處理的被保護代碼
閱讀該文章,需要您對DEX文件結構有所瞭解,您可以通過以下網址瞭解相關信息:
http://blog.csdn.net/by317966834/article/details/8880073
根據解殼數據在解殼程序DEX文件中的不同分佈,本文將提出兩種Android Dex加殼的實現方案。
(一)解殼數據位於解殼程序文件尾部
該種方式簡單實用,合併後的DEX文件結構如下。
加殼程序工作流程:
1、加密源程序APK文件爲解殼數據
2、把解殼數據寫入解殼程序Dex文件末尾,並在文件尾部添加解殼數據的大小。
3、修改解殼程序DEX頭中checksum、signature 和file_size頭信息。
4、修改源程序AndroidMainfest.xml文件並覆蓋解殼程序AndroidMainfest.xml文件。
解殼DEX程序工作流程:
1、讀取DEX文件末尾數據獲取借殼數據長度。
2、從DEX文件讀取解殼數據,解密解殼數據。以文件形式保存解密數據到a.APK文件
3、通過DexClassLoader動態加載a.apk。
(二)解殼數據位於解殼程序文件頭
該種方式相對比較複雜, 合併後DEX文件結構如下:
加殼程序工作流程:
1、加密源程序APK文件爲解殼數據
2、計算解殼數據長度,並添加該長度到解殼DEX文件頭末尾,並繼續解殼數據到文件頭末尾。
(插入數據的位置爲0x70處)
3、修改解殼程序DEX頭中checksum、signature、file_size、header_size、string_ids_off、type_ids_off、proto_ids_off、field_ids_off、
method_ids_off、class_defs_off和data_off相關項。 分析map_off 數據,修改相關的數據偏移量。
4、修改源程序AndroidMainfest.xml文件並覆蓋解殼程序AndroidMainfest.xml文件。
解殼DEX程序工作流程:
1、從0x70處讀取解殼數據長度。
2、從DEX文件讀取解殼數據,解密解殼數據。以文件形式保存解密數據到a.APK
3、通過DexClassLoader動態加載a.APK。
四、加殼及脫殼代碼實現