• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

恶意代码分析实战:第十六章 反调试技术

恶意代码分析实战 云涯 3年前 (2020-12-14) 1640次浏览

3 感染调试器功能

3.1 使用TLS回调

3.1.1 线程局部存储(TLS)

PE文件头可选映像头中数据目录表的第10成员IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS]指向线程局部存储,英文简写”TLS”。

这个段里面保存了变量和回调函数的数据,但是TLS表本身的结构体一般存在于”.rdata”段内。

TLS中的变量:单独存在于每个独立的线程当中,每个线程中对该变量的操作都不会影响到其他线程中的TLS变量。

TLS中的回调函数:在程序入口点(AddressOfEntry)之前执行,也就是说程序在被调试时,还没有在入口点处断下来之前,TLS中的变量和回调函数就已经执行完了,所以TLS可以用作反调试之类的操作。

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

数据结构如下:

typedef struct _IMAGE_TLS_DIRECTORY32 {
    DWORD StartAddressOfRawData;               tls模板在内存中的起始VA,模板是用于创建线程时初始化TLS数据的;
    DWORD EndAddressOfRawData;                 tls模板在内存中的结束VA;
    PDWORD AddressOfIndex;                     存储TLS索引的位置
    PIMAGE_TLS_CALLBACK *AddressOfCallBacks;   指向TLS注册的回调函数的函数指针数组
    DWORD SizeOfZeroFill;                      用于指定非零初始化数据后面的空白空间的大小
    DWORD Characteristics;                     保留

} IMAGE_TLS_DIRECTORY32;

 

 

 


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:恶意代码分析实战:第十六章 反调试技术
喜欢 (1)