如何使用gcc添加tls回调函数?

9fkzdhlc  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(212)

我正在尝试添加一个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编译时,默认情况下已经有回调了吗?我该怎么办?

oymdgrw7

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中自定义回调函数:

#include <windows.h>
#include <stdio.h>

// tls area
//////////////////////////////////////////////////////////////////////

#if defined(_MSC_VER)
#define _CRTALLOC(x) __declspec(allocate(x))
#elif defined(__GNUC__)
#define _CRTALLOC(x) __attribute__((section(x)))
#else
#error Your compiler is not supported.
#endif

static void WINAPI tls_callback(HANDLE hDllHandle, DWORD dwReason, LPVOID __UNUSED_PARAM(lpReserved))
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
        printf("attach\n");
        break;
    case DLL_PROCESS_DETACH:
        printf("detach\n");
        break;
    case DLL_THREAD_ATTACH:
        printf("thread attach\n");
        break;
    case DLL_THREAD_DETACH:
        printf("thread detach\n");
        break;
    }
}

// tlsinit function executes functions allocated in subsections in alphabetical order from xd_a to xd_z
// every function need to be allocated separately with it's own letter
//
// ps = (uintptr_t) &__xd_a;
// ps += sizeof (uintptr_t);
// for ( ; ps != (uintptr_t) &__xd_z; ps += sizeof (uintptr_t))
//
// from https://github.com/mirror/mingw-w64/blob/cb37f01f9cb54ccb85ed9c03086e6c4d84b5b431/mingw-w64-crt/crt/tlssup.c

_CRTALLOC(".CRT$XLF")
PIMAGE_TLS_CALLBACK __xl_f = tls_callback;

//////////////////////////////////////////////////////////////////////

int main()
{
    return 0;
}

相关问题