我正在尝试添加一个tls回调函数来改变变量的值。我尝试了一些我在google中看到的东西,比如:
static int a = 0;
void NTAPI tls_callback(void* DllHandle, DWORD Reason, void* Reserved)
{
a = 1;
}
#pragma comment (linker, "/INCLUDE:__tls_used")
#pragma comment (linker, "/INCLUDE:__xl_b")
#pragma data_seg(".CRT$XLB")
EXTERN_C PIMAGE_TLS_CALLBACK _xl_b = tls_callback;
#pragma data_seg()
int main() {
printf("%d\n", a);
return 0;
}
但是什么都不起作用。当我运行程序时,我得到0作为输出,而不是1。我使用的是MinGW窗口。我看了IDA,我可以看到那里的函数:the function in IDA,但当我运行程序时,我得到了错误的输出。我试图在x96dbg中调试程序,但我没有看到函数执行。这是因为当我用MinGW编译时,默认情况下已经有回调了吗?我该怎么办?
1条答案
按热度按时间oymdgrw71#
CRT允许程序注册TLS回调。
在以NULL结尾的Array中找到要执行的回调。
必须在CRT中声明指向回调的PIMAGE_TLS_CALLBACK类型的cariable,才能在此数组中注册它。
编译器可以使用$符号连接成一个区段。
CRT部分使用特定的命名约定;.CRT$XLx,其中x可以是A-Z之间得任意值. A是起始点,Z是空终止符.
所有XLx都连接到.CRT部分。
连接是按字母顺序进行的,因此.CRT$XLB中的回调将在.CRT$XLC之前调用。
https://github.com/Reijaff/offensive_c/blob/main/tls_callback.c中自定义回调函数: