J'ai produit une liste d'assembleur de mon fichier source .C
. Et dans la source C j'ai mis en œuvre tls comme ceci:MASM ne reconnaît pas mon rappel 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";
J'ai produit liste de montage de ce fichier C, et tls maintenant ressembler à ceci:
PUBLIC [email protected]
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:[email protected]
CRT$XLF ENDS
_TEXT SEGMENT
_DllHandle$ = 8 ; size = 4
_dwReason$ = 12 ; size = 4
_lpVd$ = 16 ; size = 4
[email protected] PROC ; COMDAT
push ebp
mov ebp, esp
mov edx, DWORD PTR _msg
push 0
push edx
push edx
push 0
call DWORD PTR [email protected]
; Line 34
pop ebp
ret 12 ; 0000000cH
[email protected] ENDP
_TEXT ENDS
Je ne vois pas que la motif tls est produit cependant, j'ai regardé dans IDA PRO le modèle devrait être:
.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
faire, je dois définir un nouveau segment et tls placer les boniment là-dedans? Ou il devrait être dans la section de données?
Je compilez comme ceci:
ml.exe listing.asm /coff
J'ai regardé fichier produit intérieur ida pro, et je vois que tls n'a pas été produit du tout, comment puis-je dire masm ou son agent de liaison faire un répertoire?
Je n'arrive pas à trouver d'options pour l'éditeur de liens ou l'assembleur pour générer le répertoire TLS. La solution de contournement la plus rapide consiste probablement à placer la structure TLS dans un segment (section), à laisser l'éditeur de liens générer une carte de symboles et à coder un script qui lit le fichier map et corrige l'exécutable. –
N'essayez jamais d'assembler et d'utiliser la sortie d'assembly du compilateur Microsoft C/C++. Je ne sais pas si c'est le cas ici, mais généralement la sortie de l'assembly générée par le compilateur Microsoft C/C++ est incomplète et incorrecte. Votre objectif est-il d'avoir un assembly ou une fonction C++ appelée en tant que rappel TLS? –
@RossRidge pour utiliser les tls de l'assemblage en utilisant masm – YakibutaRamen