经产观察
IT资讯
IT产业动态
业界
网站运营
站长资讯
互联网
国际互联网新闻
国内互联网新闻
通信行业
通信设备
通信运营商
消费电子
数码
家电
IT资讯

Android APK加壳技术方案----代码实现

作者:habao 来源: 日期:2017-10-20 14:11:00 人气:

  在上篇“Android APK加壳技术方案”()博文中,根据加壳数据在解壳程序Dex文件所处的,我提出了两种Android Dex加壳技术实现方案,本片博文将对方案1代码实现进行。博友可以根据方案1的代码实现原理对方案2自行实现。

  在方案1的代码实现过程中,各种不同的问题接踵出现,最初的方案也在不同问题的出现、解决过程中不断的得到调整、优化。

  本程序基于Android2.3代码实现,因为牵扯到系统代码的反射修改,本程序不在其它android版本正常工作,博友可以根据实现原理,自行实现对其它Android版本的兼容性开发。

  Android程序由不同的组件构成,系统在有需要的时候启动程序组件。因此解壳程序必须在Android系统启动组件之前运行,完成对解壳数 据的解壳及APK文件的动态加载,否则会使程序出现加载类失败的异常。

  Android开发者都知道Applicaiton做为整个应用的上下文,会被系统第一时间调用,这也是应用开发者程序代码的第一执行点。因此通过对 AndroidMainfest.xml的application的配置可以实现解壳代码第一时间运行。

  当在AndroidMainfest.xml文件配置为解壳代码的Application时。源程序原有的Applicaiton将被替换,为了不影响源程序代码逻辑,我们需要 在解壳代码运行完成后,替换回源程序原有的Application对象。我们通过在AndroidMainfest.xml文件中配置原有Applicaiton类信息来达到我们 的目的。解壳程序要在运行完毕后通过创建配置的Application对象,并通过反射修改回原Application。

  我们知道DexClassLoader加载的类是没有组件生命周期的,也就是说即使DexClassLoader通过对APK的动态加载完成了对组件类的加载, 当系统启动该组件时,还会出现加载类失败的异常。为什么组件类被动态加载入虚拟机,但系统却出现加载类失败呢?

  代码默认引用的资源文件在最外层的解壳程序中,因此我们要增加系统的资源加载径来实现对借壳后APK文件资源的加载。

  本文代码基本实现了APK文件的加壳及脱壳原理,该代码作为实验代码还有诸多地方需要改进。比如:

  2、脱壳代码由java语言实现,可通过C代码的实现对脱壳逻辑进行,以达到更好的反逆向分析效果。

  推荐: