TX手遊so保護實現分析

一、騰訊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節的解密;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章