1.一种Android平台应用程序的脱壳方法,应用于一位于应用层的预设的脱壳容器中,其特征在于,所述脱壳方法包括以下步骤:
获取外部输入的待脱壳应用程序的路径,并将该待脱壳应用,拷贝到脱壳容器的文件目录中;
解析待脱壳应用程序的Manifest文件,获取其主Activity及资源信息,所述资源信息至少包括资源路径;
根据待脱壳应用程序的路径,将该待脱壳应用程序的资源路径及代码加载到脱壳容器的进程空间中;所述代码加载包括以下步骤:启动所获取的主Activity,并将一替身Activity的启动参数发送给系统层,所述替身Activity为该脱壳容器中Manifest文件的Activity;系统层获取替身Activity的启动参数进行Activity管理;脱壳容器为该主Activity创建一新的ClassLoader对象,并将该ClassLoader对象绑定到系统层用于加载Activity类的加载器上;利用该ClassLoader对象调用加载类的函数完成代码加载;
获取该待脱壳应用程序的dex文件结构;
根据该dex文件结构对该待脱壳应用程序进行脱壳。
2.如权利要求1所述的脱壳方法,其特征在于,Activity的管理包括生命周期管理、栈管理或真实性的校验。
3.如权利要求1所述的脱壳方法,其特征在于,绑定ClassLoader对象的方法包括以下步骤:通过系统函数getPackageInfoNoCheck()构建待脱壳应用程序的LoadeAPK对象;将构造的ClassLoader对象替换待脱壳应用程序的mClassLoader成员变量;通过反射获得CurrentThread对象,并获得其中的成员变量mPackages,将已创建的LoadeAPK对象加入到mPackages的Map中。
4.如权利要求1所述的脱壳方法,其特征在于,加载资源路径的方法包括:创建一个AssetManager对象,通过反射的方式调用AssetManager中的addAssetPath函数,将待脱壳应用程序的资源路径加载到AssetManager中;根据该AssetManager创建待脱壳应用的Resources对象;将创建的Resources对象添加到脱壳容器的资源缓存表中。
5.如权利要求1所述的脱壳方法,其特征在于,根据该待脱壳应用程序的dex文件结构对该待脱壳应用程序进行脱壳包括以下步骤:根据dex文件在内存中对应的gDvm.userDexFiles结构体的大小开辟一个新的空间,用于存储修复后的dex文件;通过gDvm.userDexFiles结构体获取当前的DexFile结构体,解析DexFile结构体,确定需要修复的结构体;修复各结构体,并对所有DexClassData结构体进行重组,在内存中形成所述修复后的dex文件;将修复后的dex文件从内存中Dump至相应的输出目录。
6.一种Android平台应用程序的脱壳容器,用于在Android平台应用层中对应用程序进行脱壳,其特征在于,所述脱壳容器包括解析模块、动态加载模块、核心脱壳模块,其中:
所述解析模块用于获取外部输入的待脱壳应用程序的路径,将该待脱壳应用,拷贝到脱壳容器的文件目录中;并解析待脱壳应用程序的Manifest文件,获取其主Activity及资源信息,所述资源信息至少包括资源路径;
所述动态加载模块用于根据待脱壳应用程序的路径,将该待脱壳应用程序的资源路径及代码加载到脱壳容器的进程空间中;所述代码加载包括以下步骤:启动所获取的主Activity,并将一替身Activity的启动参数发送给系统层,所述替身Activity为该脱壳容器中Manifest文件的Activity;系统层获取替身Activity的启动参数进行Activity管理;动态加载模块为该主Activity创建一新的ClassLoader对象,并将该ClassLoader对象绑定到系统层用于加载Activity类的加载器上;利用该ClassLoader对象调用加载类的函数完成代码加载;
所述核心脱壳模块用于获取该待脱壳应用程序的dex文件结构;根据该dex文件结构对该待脱壳应用程序进行脱壳。
7.如权利要求6所述的脱壳容器,其特征在于,所述动态加载模块绑定ClassLoader对象的方法包括以下步骤:通过系统函数getPackageInfoNoCheck()构建待脱壳应用程序的LoadeAPK对象;将构造的ClassLoader对象替换待脱壳应用程序的mClassLoader成员变量;通过反射获得CurrentThread对象,并获得其中的成员变量mPackages,将已创建的LoadeAPK对象加入到mPackages的Map中。
8.如权利要求6所述的脱壳容器,其特征在于,所述动态加载模块加载资源路径的方法包括:创建一个AssetManager对象,通过反射的方式调用AssetManager中的addAssetPath函数,将待脱壳应用程序的资源加载到AssetManager中;根据该AssetManager创建待脱壳应用的Resources对象;将创建的Resources对象添加到脱壳容器的资源缓存表中。
9.如权利要求6所述的脱壳容器,其特征在于,所述核心脱壳模块根据该dex文件结构对该待脱壳应用程序进行脱壳包括以下步骤:根据dex文件在内存中对应的gDvm.userDexFiles结构体的大小开辟一个新的空间,用于存储修复后的dex文件;通过gDvm.userDexFiles结构体获取当前的DexFile结构体,解析DexFile结构体,确定需要修复的结构体;修复各结构体,并对所有DexClassData结构体进行重组,在内存中形成所述修复后的dex文件;将修复后的dex文件从内存中Dump至相应的输出目录。
10.如权利要求6所述的脱壳容器,其特征在于,所述动态加载模块完成资源路径及代码的加载后,脱壳容器调用该主Activity的OnCreate函数,在OnCreate函数中调用所述核心脱壳模块。