TX手游so保护实现分析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/feibabeibei_beibei/article/details/102468032

一、腾讯so保护的分析:

字符串加密:

so中大量的调用了字符串解密函数:

接下来看JNI_Onload相关的函数:

接下来看导出符号中有一个g_tprt_ori_array,放在.bss节中,是一个未初始化的全局变量。

还有一个g_tprt_pfn_array,可以看到下面保存着一堆函数的地址:

 

在sub_57A8中可以看到的是对于il2cpp中节的解密:

二、从正向来看怎么实现这种方案?

2.1:对于libtprt.so的依赖的实现:

从[INIT]0x1ed中可以看出:

偏移地址为.init_proc为入口处:

通过plt表的延迟绑定的形式去加载这个g_tprt_pfn_array方法,而这个方法正是TX中的导出函数,去执行一堆解密函数的导出函数。

第一步:

在DT_STRTAB指向的字符串表中添加自定义的so模块名以及导出的函数名:g_tprt_pfn_arrayg_tprt_ori_array

增加mprotect在内存解密中要用到;

对于__cxa_begin_cleanup、__cxa_type_match、__cxa_call_unexpected暂时不清楚为什么这么做?

第二步:

由于字符串表会被映射到内存中,所以这时候后需要在段头表中添加PT_Load表项;

对应上面的so名字以及对应的导出函数名;

修改以及增加关于PT_Load的各个表项的值,必去p_offset、p_flags、以及虚拟地址等等

第三步:

修改dynamic array中加入DT_NEEDED表项,指向要依赖的so,如下:

修改ELF表头中关于phnum的数量:

这样上述就完成了整个的依赖。

2.2:自身的保护实现:

首先是libtprt.so自身自定义节的加密保护,在.init_array中进行解密完成;

其次对于要保护的so(比如libil2cpp.so)进行.text节加密,对libtprt.so进行依赖, 游戏运行的时候在.init_pro中完成对于要保护so的text节的解密;

猜你喜欢

转载自blog.csdn.net/feibabeibei_beibei/article/details/102468032
今日推荐