基于dex与so文件动态执行的Android应用加固方法与流程

文档序号:11951455阅读:来源:国知局

技术特征:

1.一种Android应用加固方法,所述加固方法基于dex与so文件的动态执行,通过加密方法对Android应用程序中的关键代码进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,具体包括如下步骤:

A)通过加密过程对Android应用程序中的关键代码进行加固,执行如下步骤:

A1.解压Android应用程序主体部分apk文件,提取其中的classes.dex文件;

A2.将Android应用程序核心功能部分代码编译成独立的apk文件并对该apk文件进行加密;

A3.把加密后的apk文件写入到A1中Android应用程序主体部分的classes.dex文件的末尾,并在所述classes.dex文件尾部添加加密数据的大小,用于解密时找到核心功能部分代码的起始位置;

A4.重新计算classes.dex文件的checksum、signature和file_size字段的值,替换原位置的相应字段的值,得到修改后的classes.dex文件;

A5.将修改后的classes.dex文件放回所述应用程序软件主体部分apk包中,再对所述应用程序进行签名;

A6.读取待加固的so库文件,通过解析文件信息得到待加密函数的偏移地址与大小,并向待加密函数末尾处写入decryDEX()解密函数,用于解密加密后的dex文件;重新计算得到改变之后的待加密函数的大小的值,并将原来待加密函数中的大小修改为所述改变之后的待加密函数的大小的值;

A7.对所述待加密函数进行异或加密;

A8.解析so库文件的文件头,修改文件头部部分字段值,包括so文件大小、so文件中函数的偏移地址;

A9.计算so库文件的MD5值,将所述MD5值写入所述so库文件的末尾;

A10.在所述so库文件中的.init_array节的代码段中添加运行环境检测、对抗动态调试、MD5完整性校验和对so库文件进行解密的代码;

B.当动态执行Android应用程序进行解密时,执行如下操作:

B1.所述Android应用程序主体部分从自身的apk文件中读取classes.dex文件,从classes.dex文件尾部得到加密数据的长度,计算得到加密数据的起始位置,从而读取得到加密数据;

B2.加载所述so库文件;

B3.调用decryDEX()解密函数进行解密,得到核心功能部分的apk;

B4.通过Android API提供的DexClassLoader类,对B3所述核心功能部分的apk进行反射调用,从而实现核心功能部分代码的动态加载;

B5.调用完成后,删除核心功能部分apk文件,从而避免核心功能部分代码暴露在系统内部存储之中而被攻击者得到。

2.如权利要求1所述Android应用加固方法,其特征是,步骤A所述加密过程采用二进制流加密方法。

3.如权利要求1所述Android应用加固方法,其特征是,步骤A8)所述部分字段包括e_ident字段、e_type字段、e_machine字段、e_version字段、e_flag字段、e_shoff字段、e_shentsize字段、e_shnum字段和e_shstrndx字段。

4.如权利要求1所述Android应用加固方法,其特征是,步骤B2通过调用loadLibrary系统函数加载所述so库文件,具体包括如下步骤:

loadLibrary加载共享库so库文件,控制权传递给动态连接器Linker;

动态连接器Linker检查so库文件头部合法性,根据头部数据分别读入对应的数据结构,并将所有PT_LOAD属性的段加载至合适的地址空间;

为该so库文件在共享库链表中分配一个soinfo节点并填充其数据结构,执行标记为.init;

.init_array的节的代码进行代码初始化工作;

当存在JNI_OnLoad函数时,执行该代码,解密加密函数。

当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1