注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

谜之安卓加壳  

来自成艳艳   2016-06-12 19:59:04|  分类: 移动APP |举报 |字号 订阅

  下载LOFTER 我的照片书  |

相信很多刚开始接触移动测试的同学都有对于安卓加壳的一些迷思,自己也是一样,对于谜之加壳,自己当初也查了一些资料,总结一下,安卓加壳的主要实现方法和相关知识,供自己以后查阅,也分享给大家,可以对加壳有一个整体的认识。


什么是加壳

 加壳是在二进制的程序中植入一段代码,保护里面的代码不被非法修改或反编译,在运行的时候优先取得程序的控制权做一些我们自己想做的工作


android加壳的实现

整个加壳的过程涉及到三个程序:要加壳的apk,加壳程序,解壳程序。

加壳程序就是把要加壳的apk放入解壳程序的dex文件中。 

解壳程序是最后替代我们apk安装到手机中运行的程序。它在执行中从自己的dex中释放出我们apk程序。 

谜之安卓加壳 - 网易杭州QA - 网易杭州 QA Team

 

根据解壳数据在解壳程序DEX文件中的不同分布,有两种Android Dex加壳的实现方案:解壳数据位于解壳程序文件尾部时和当解壳数据位于解壳程序文件头部时的方案。


所以让我们先了解下DEX文件。

DEX文件

Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,优化后的android版.exe,每个apk安装包里都有。相对于PC上的java虚拟机能运行.class;android上的Davlik虚拟机能运行.dex。 

优化发生的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有一个相应的Android DEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。


DEX文件格式

我们主要关注DEX文件的头部信息,主要包括校验和以及其他结构的偏移地址和长度信息为了对它又一个直观的了解,我在网络上找到这样一张图:

谜之安卓加壳 - 网易杭州QA - 网易杭州 QA Team

 

主要的字段列表如下:

谜之安卓加壳 - 网易杭州QA - 网易杭州 QA Team

 

其中我们主要关注的字段有三个:checksum、signature和file_size。

为什么说我们只需要关注这三个字段呢?

因为我们需要将一个文件(加密之后的源Apk)写入到Dex中,那么我们肯定需要修改文件校验码(checksum).因为他是检查文件是否有错误。那么signature也是一样,也是唯一识别文件的算法。还有就是需要修改dex文件的大小,因为我们在脱壳的时候,需要知道Apk的大小,才能正确的得到Apk。那么这个值放到哪呢?这个值直接放到文件的末尾就可以了。下面具体说一下这三个字段:

1) checksum

文件校验码 ,用来校验文件除去 maigc ,checksum 外余下的所有文件区域 ,这段数据是否完整,有没有人修改过,或者传送过程中是否有出错等等。通常用来检查数据是否完整的算法,有 CRC32、有SHA128等,但这里采用并不是这两类,而采用一个比较特别的算法,叫做adler32,这是在开源zlib里常用的算法,用来检查文件 是否完整性。该算法由MarkAdler发明,其可靠程度跟CRC32差不多,不过还是弱一点点,但它有一个很好的优点,就是使用软件来计算检验码时比较 CRC32要快很多。可见Android系统,就算法上就已经为移动设备进行优化了。

Java中可使用java.util.zip.Adler32类做校验操作

2) signature

使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件区域 ,用于唯一识别本文件 。顺便说明下SHA-1算法。

SHA(Secure Hash Algorithm, 安全散列算法)是美国国家安全局设计,美国国家标准与技术研究院发布的一系列密码散列函数。SHA-1看起来和MD5算法很像,也许是Ron Rivest在SHA-1的设计中起了一定的作用。SHA-1的内部比MD5更强,其摘要比MD5的16字节长4个字节,这个算法成功经受了密码分析专家 的攻击,也因而受到密码学界的广泛推崇。这个算法在目前网络上的签名,BT软件里就有大量使用,比如在BT里要计算是否同一个种子时,就是利用文件的签名 来判断的。同一份8G的电影从几千BT用户那里下载,也不会出现错误的数据,导致电影不播放。

3) file_size

Dex 文件的大小 。


背景知识了解清楚了,来看下具体的实现方案和过程。

解壳数据位于解壳程序文件尾部时的加壳方案:

总结一下我们需要做:修改Dex的三个文件头,将源Apk的大小追加到壳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文件样式如下: 

谜之安卓加壳 - 网易杭州QA - 网易杭州 QA Team

 




解壳数据位于解壳程序文件头时的加壳方案

修改之后得到新的Dex文件样式如下:

谜之安卓加壳 - 网易杭州QA - 网易杭州 QA Team

加壳程序工作流程:

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。


完毕。







参考资料:

1.Android中的Apk的加固(加壳)原理解析和实现 http://www.cnblogs.com/cute/p/4809386.html

2.Android Apk加壳技术方案 http://blog.csdn.net/androidsecurity/article/details/8678399

3.Dex文件结构 http://blog.csdn.net/androidsecurity/article/details/8664778


  评论这张
 
阅读(243)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016