【发布时间】:2017-09-21 10:59:32
【问题描述】:
我已经生成了我的.C 源文件的汇编程序列表。在 C 源代码中,我实现了这样的 tls:
char *msg = "callback";
void NTAPI tls_callback(PVOID DllHandle, DWORD dwReason, PVOID lpVd)
{
MessageBoxA(0,msg,msg,0);
}
#ifdef _WIN64
#pragma comment (linker, "/INCLUDE:_tls_used")
#pragma comment (linker, "/INCLUDE:tls_callback_func")
#else
#pragma comment (linker, "/INCLUDE:__tls_used")
#pragma comment (linker, "/INCLUDE:_tls_callback_func")
#endif
#ifdef _WIN64
#pragma const_seg(".CRT$XLF")
EXTERN_C const
#else
#pragma data_seg(".CRT$XLF")
EXTERN_C
#endif
PIMAGE_TLS_CALLBACK tls_callback_func = tls_callback;
#ifdef _WIN64
#pragma const_seg()
#else
#pragma data_seg()
#endif
__declspec(thread) char *tlsData = "tls static data";
我已经生成了这个 C 文件的汇编列表,tls 现在看起来像这样:
PUBLIC _tls_callback@12
PUBLIC _tls_callback_func
PUBLIC _tlsData
_TLS SEGMENT
_tlsData
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 40H
DB 30H
DB 80H
_TLS ENDS
CRT$XLF SEGMENT
_tls_callback_func DD FLAT:_tls_callback@12
CRT$XLF ENDS
_TEXT SEGMENT
_DllHandle$ = 8 ; size = 4
_dwReason$ = 12 ; size = 4
_lpVd$ = 16 ; size = 4
_tls_callback@12 PROC ; COMDAT
push ebp
mov ebp, esp
mov edx, DWORD PTR _msg
push 0
push edx
push edx
push 0
call DWORD PTR __imp__MessageBoxA@16
; Line 34
pop ebp
ret 12 ; 0000000cH
_tls_callback@12 ENDP
_TEXT ENDS
我没有看到生成 tls 模式,但是我在 IDA PRO 中查找了模式应该是:
.rdata:004921A8 __tls_used dd offset __tls_start
.rdata:004921AC TlsEnd_ptr dd offset __tls_end
.rdata:004921B0 TlsIndex_ptr dd offset __tls_index
.rdata:004921B4 TlsCallbacks_ptr dd offset _tls_callback_func
.rdata:004921B8 TlsSizeOfZeroFill dd 0
.rdata:004921BC TlsCharacteristics dd 100000h
那么我需要定义一个新的 tls 段并将这些模式放在那里吗?还是应该在数据部分?
我是这样编译的:
ml.exe listing.asm /coff
我在 ida pro 中查找了生成的文件,我发现 tls 目录根本没有生成,我如何告诉 masm 或其链接器生成目录?
【问题讨论】:
-
我找不到链接器或汇编器生成 TLS 目录的任何选项。可能最快的解决方法是将 TLS 结构放在某个段(即部分)中,让链接器生成符号映射并编写读取映射文件并修补可执行文件的脚本。
-
切勿尝试汇编和使用 Microsoft C/C++ 编译器的汇编输出。不知道这里是不是这样,但是一般微软C/C++编译器生成的汇编输出是不完整的,不正确的。您的目标是将程序集或 C++ 函数称为 TLS 回调吗?
-
@RossRidge 使用 masm 组件中的 tls
-
@RossRidge 我找到了解决方案,稍后我会针对这个问题发布答案
标签: assembly callback linker masm ida