TX手游so保护实现分析

一、腾讯so保护的分析:

字符串加密:

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

TX手游so保护实现分析_第1张图片

TX手游so保护实现分析_第2张图片

TX手游so保护实现分析_第3张图片

TX手游so保护实现分析_第4张图片

接下来看JNI_Onload相关的函数:

TX手游so保护实现分析_第5张图片

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

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

 

TX手游so保护实现分析_第6张图片

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

TX手游so保护实现分析_第7张图片

TX手游so保护实现分析_第8张图片

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

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

TX手游so保护实现分析_第9张图片

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

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

TX手游so保护实现分析_第10张图片

TX手游so保护实现分析_第11张图片

TX手游so保护实现分析_第12张图片

通过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暂时不清楚为什么这么做?

TX手游so保护实现分析_第13张图片

第二步:

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

TX手游so保护实现分析_第14张图片

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

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

第三步:

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

TX手游so保护实现分析_第15张图片

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

TX手游so保护实现分析_第16张图片

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

2.2:自身的保护实现:

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

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

你可能感兴趣的:(U3D手游安全)