TX手游so保护实现分析
接下来看导出符号中有一个g_tprt_ori_array,放在.bss节中,是一个未初始化的全局变量。
还有一个g_tprt_pfn_array,可以看到下面保存着一堆函数的地址:
在sub_57A8中可以看到的是对于il2cpp中节的解密:
通过plt表的延迟绑定的形式去加载这个g_tprt_pfn_array方法,而这个方法正是TX中的导出函数,去执行一堆解密函数的导出函数。
在DT_STRTAB指向的字符串表中添加自定义的so模块名以及导出的函数名:g_tprt_pfn_array、g_tprt_ori_array;
对于__cxa_begin_cleanup、__cxa_type_match、__cxa_call_unexpected暂时不清楚为什么这么做?
由于字符串表会被映射到内存中,所以这时候后需要在段头表中添加PT_Load表项;
修改以及增加关于PT_Load的各个表项的值,必去p_offset、p_flags、以及虚拟地址等等
修改dynamic array中加入DT_NEEDED表项,指向要依赖的so,如下:
首先是libtprt.so自身自定义节的加密保护,在.init_array中进行解密完成;
其次对于要保护的so(比如libil2cpp.so)进行.text节加密,对libtprt.so进行依赖, 游戏运行的时候在.init_pro中完成对于要保护so的text节的解密;