接下來看導出符號中有一個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節的解密;