成果63]软件保护壳专题 - 处理TLS表

 秒速赛车     |      2019-12-05 09:24

  一入手下手思这节的名字叫做加密TLS表,其后感触TLS表的加密实正在是有些不切合。要紧是出于TLS节加密的须要性思量。于是改成处罚TLS表了。我自己爱好把TLS行使成含混入口点来行使。此节计议是云云的,咱们先知道一下什么是TLS以及它的机闭。接下来汇编一个TLS节及联系正在MASM中的操纵。结果,咱们讲明若何修削现有的TLS以及修造TLS入口点。

  线程当地存储 (TLS) 是一个设施,通过该设施,给定的多线程历程中的每个线程都可能分派存储线程特定命据的名望。动态绑定(运转时)线程特定命据是通过 TLS API(TlsAlloc、TlsGetValue、TlsSetValue 和 TlsFree)的式样接济的。除了现有的 API 杀青,Win32 和 Visual C++ 编译器现正在还接济静态绑定(加载功夫)基于线程的数据。

  Visual C++ 编译器供应了一个环节字(而欠亨过 API 层)使 TLS 操作越发自愿化。将不才一节(TLS 的编译器杀青)描写此语法。

  为了接济 TLS,已将新属性 thread 增加到了 C 和 C++ 讲话,并由 Visual C++ 编译器接济。此属性是一个扩展存储类装束符,如上一节中所述。应用 __declspec 环节字声明 thread 变量。比如,以下代码声明晰一个整数线程限造变量,并用一个值对其举办初始化:

  这些编译方面上的控造,应当是为代码安闲与巩固性上设定的。究竟,TLS是行动多线程一局部应用的。秒速赛车正在内存拜访上没有清楚的控造(正在运转代码中自行定位TLS变量并援用是没有题目的)。

  TLS表的目次索引处正在数据目次的第9个索引上,可能应用微软供应的宏IMAGE_DIRECTORY_ENTRY_TLS来直接定位。

  (这里必要注意的是DLL拜访TLS变量除非这个DLL是静态链接到这个EXE中,不然应用LoadLibrary动态加载的DLL是不会加载TLS变量的)

  1.链接时。相连器设备TLS目次的AddressOfIndex字段。这个字段指向一个地方。正在这个地方留存了圭臬所用的TLS索引。

  2.当线程创修的岁月,普通正在TEB开得2ch处名望防卫一个指向TLS数组的指针。TEB的地方放入FS中留存于是可能应用FS[2ch]援用此TLS数组。

  必要注意的是TLS数组正在每条线程都有维持的一个区域。这个数组的每个地方指出了圭臬中给定模块的TLS数据区的名望。TLS索引指出了这个数组的哪个元素。

  接下来咱们先容一下闭于TLS回调函数这个东西,这个东西关于编写病毒来说直安宁的。大无数调试器是从PE加载器入手下手加载,简直都跳过读取此入口的。呵呵。话说壳本事也是从病毒本事繁荣而来的。是先有病毒后有壳的,他们两者有太多好似的地方。然而貌似安闲圈里许多的本事都是从Anti-安闲到安闲过渡的。思思rootkit的本事不也一律吗!

  这个回调函数的地方是由AddressOfCallBacks字段指出的。指向的地方是一个由IMAGE_TLS_CALLBACK函数构成的数组并以 NULL做解散符。回调函数的按次是顺次挪用。这个TLS回调函数是正在加载引入表之后,于是正在引入表中的函数都可能直策应用。要是加密了引入表,正在这里就必要做少少门径了。然而要注意的是切不成正在这里解密引入表。不然,加密引入表就没蓄谋义了。

  下面就让咱们应用MASM打造一个带有回调成效的TLS节的圭臬,最初应用见到应用MASM编写TLS联系是正在一个俄国人的论坛的代码里。随后的附件中也会附带此代码名为:TlsInAsm。这里咱们仍旧本人打造一个。正在TlsInAsm中我研习到了少少闭于MASM的编译选项。

  下面该轮到修削TLS了。这段也可能行动加解密TLS用,然而幼我感触不到TLS加解密的须要,纯属一个可选的选项。然而用作Anti-debug是个用处。yC壳中也是将TLS举办了一个粗略的挪动。而正在加密时掠过以.tls为名的节,这个就会酿成不巩固性。而完好的处罚TLS对照障碍,要是TLS回调函数不止一个,咱们一定要读取总共的TLS回调函数并剖断它的解散当然这必要一个反汇编引擎来做。而有些参预Anti-反汇编代码的也会形成读取过失,结果还要做少少重定位的使命。思量至此咱们如今的代码成效是云云的,开始复造TLS表,然后举办一个TLS入口点的交换。结果跳转回TLS真正的回调函数中。因为TLS圭臬并不常见,读者可能应用以上供应的圭臬举办测试。

  这节对TLS节自己的应用并没有过多的商量。TLS回调函数与加密解思绪是正在这里了。若何应用就看读者的设思力了。