​ TLS回调被用来在程序入口点执行之前运行代码,因此这些代码可以在调试器中秘密执行。TLS是windows的一个存储类,其中数据对象不是一个自动的堆栈变量,而是代码中运行的每个线程的一个本地变量。大致而言,TLS允许每个线程维护一个TLS声明的专有变量。在应用程序实现TLS的情况下,可执行程序的PE头部会包含一个.tls段。TLS提供了初始化和终止TLS数据对象的回调函数。windows系统在执行程序正常的入口点之前运行这些回调函数。

​ 可以使用PEview查看应用程序的.tls段,可以发现TLS回调函数。通常情况下,正常程序不适用.tls段,如果看到了程序的.tls段,就可以怀疑它使用了反调试技术。

​ 使用IDA Pro可以很容易的分析TLS回调函数。一旦IDA Pro完成对应用程序的分析,可以通过Ctrl+E看到二进制的入口点,该组合键的作用是显示应用程序的所有入口点,其中包含TLS回调。

​ PE文件头可选映像头中数据目录表的第10成员IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS]指向线程局部存储,英文简写”TLS”。这个段里面保存了变量和回调函数的数据,但是TLS表本身的结构体一般存在于”.rdata”段内。

​ **TLS中的变量:**单独存在于每个独立的线程当中,每个线程中对该变量的操作都不会影响到其他线程中的TLS变量。**TLS中的回调函数:**在程序入口点(AddressOfEntry)之前执行,也就是说程序在被调试时,还没有在入口点处断下来之前,TLS中的变量和回调函数就已经执行完了,所以TLS可以用作反调试之类的操作。

​ 在IDA中使用ctrl+E 组合键查看回调函数,是TlsCallback。