PE线程本地存储

Posted 心有猛虎,细嗅蔷薇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PE线程本地存储相关的知识,希望对你有一定的参考价值。

1.静态tls将变量定义在PE文件内部. 使用.tls节存储

.tls节中包含:

初始化数据

用于每个线程初始化和终止的回调函数

TLS索引

2.代码访问tls数据时经过的步骤:

(1) 链接时, 链接器设置tls目录中的AddressOfIndex字段. 该字段指向一个位置,该位置保存了程序用到的tls索引

(2) 创建线程时, 将TEB的地址放入fs寄存器来传递tls数组地址. teb+0x2c处字段指向tls数组

(3) 将tls索引值保存到AddressOfIndex字段指向的位置

(4)获取tls索引和tls数组位置

(5)访问

 

3.PE中tls节及其数据结构

typedef struct _IMAGE_TLS_DIRECTORY32 {
    DWORD   StartAddressOfRawData;    //tls模板起始地址
    DWORD   EndAddressOfRawData;      //tls模板结束地址
    DWORD   AddressOfIndex;             // PDWORD 索引位置
    DWORD   AddressOfCallBacks;         // PIMAGE_TLS_CALLBACK * 回调函数数组指针
    DWORD   SizeOfZeroFill;        //
    union {          //保留
        DWORD Characteristics;
        struct {
            DWORD Reserved0 : 20;
            DWORD Alignment : 4;
            DWORD Reserved1 : 8;
        } DUMMYSTRUCTNAME;
    } DUMMYUNIONNAME;

} IMAGE_TLS_DIRECTORY32;

 

tls回调函数:

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );

 

4. 所以通过数据目录项中定位到tls表基址后, 就可以获取tls回调函数地址,然后查看是否通过tls实现了反调试

 

以上是关于PE线程本地存储的主要内容,如果未能解决你的问题,请参考以下文章

进程和线程和协程之间的关系

python [片段]由LIEF转储PE表面信息

远程线程的注入 PE的修正

如何将本地存储中的 JSON 对象添加到 Android Studio 上的片段列表

线程本地存储及实现原理

ReflectiveLoader分析(远程线程注入 PE修正)