1.一种Android应用加固方法,基于动态恢复Android系统应用程序动态链接库so文件,通过二进制流加密方法对so文件中的关键代码进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,具体包括如下步骤:
A.加密过程:对需要保护的Android应用程序进行加密,具体设定需要加密的特定节的关键代码,对关键代码所在的节进行加密并重新生成新的Android应用程序;所述重新生成的新的Android应用程序中包含原有的dex文件、解密后关键代码的so文件和加密后关键代码的so文件;所述加密包括如下步骤:
A1.对需要保护的Android应用程序解压,获得Android应用程序中的so文件,对所述so文件进行解析;
A2.读取elf文件头,定位到节区头部表;
A3.根据elf文件头,读取得到节区数量;
A4.读取得到节区头部表中的所有项;
A5.读取得到节表字符串表在节表中的索引,再找到节表字符串表的偏移;
A6.读取节表字符串表中的字符串,将每一个节的名字保存起来;
A7.比较每一个节的名字和自定义节的名字,如果匹配,则得到目标节的内容并保存;
A8.设定密钥key1,使用密钥key1对步骤A7所述目标节的内容进行第一次加密,得到第一次加密后的中间数据;
A9.设定密钥key2,使用密钥key2对步骤A8所述中间数据进行第二次加密;
A10.将二次加密后得到数据更新到so文件中,得到新的so文件;
A11.压缩重新生成apk,即完成加密过程;所述重新生成的apk中包含原有的dex文件以及包含解密和加密后关键代码的so文件;
B.解密过程:在开始执行Android应用程序时,对加密后关键代码的so文件进行动态恢复,得到关键代码,再调用所述关键代码的方法;所述动态恢复具体执行如下操作:
B1.在Android应用程序被载入内存后,执行Android应用程序中so文件中的程序;
B2.在内存中找到so文件在进程中的地址;
B3.在so文件中查找待解密的节的地址;
B4.得到待解密的节占用的页的大小,修改占用页的读写权限;
B5.执行关键代码时,从so文件中取得密钥key2,对待解密的节进行解密,得到中间代码;
B6.针对步骤B5得到的中间代码,从so文件中取得密钥key1,进行第二次解密,得到最终的关键代码;
B7.进行关键代码的方法调用。
2.如权利要求1所述Android应用加固方法,其特征是,所述设定需要加密的特定节的关键代码,具体通过重要算法方法、验证登陆方法、系统关键流程方法中的一个或多个来设定得到。
3.如权利要求1所述Android应用加固方法,其特征是,所述A2具体根据e_shoff定位到节区头部表;所述A3具体根据elf文件头中的e_shnum得到节区数量;所述A4具体根据e_shoff和e_shnum读取得到节区头部表中的所有项;所述A5具体通过elf文件头中的e_shstrndx项得到节表字符串表在节表中的索引。
4.如权利要求1所述Android应用加固方法,其特征是,步骤A7具体通过shdr->sh_offest和shdr->sh_zie得到所述目标节的内容。
5.如权利要求1所述Android应用加固方法,其特征是,步骤A8所述第一次加密或步骤A9所述第二次加密均采用AES加密方法。
6.如权利要求1所述Android应用加固方法,其特征是,步骤B1具体通过JNI调用机制调用来执行Android应用程序so文件中的.init_array段中的方法程序。