Ich habe eine Assembler-Liste meiner .C
-Quelldatei erstellt. Und in der C-Quelle habe ich tls wie folgt umgesetzt:MASM erkennt meinen TLS-Rückruf nicht
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";
I Assembler-Liste dieser C-Datei erstellt haben, und tls sehen nun wie folgt aus:
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
Ich sehe nicht, dass die tls Muster wird jedoch erzeugt, i in IDA nachgeschlagen PRO sollte das Muster sein:
.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
Also brauche ich ein neues tls Segment zu definieren und jene Rüttler in dort platzieren? Oder sollte es im Datenbereich sein?
ich kompilieren Sie es wie folgt aus:
ml.exe listing.asm /coff
Ich habe pro produzierte Datei in ida nachgeschlagen, und ich sehe, dass tls Verzeichnis nicht produziert wurde, wie kann ich feststellen, masm oder dessen Linker Verzeichnis erstellen?
Ich kann keine Optionen für den Linker oder den Assembler finden, um das TLS-Verzeichnis zu generieren. Die schnellste Problemumgehung besteht wahrscheinlich darin, die TLS-Struktur in einem Segment (d. H. Abschnitt) abzulegen, den Linker eine Symbolzuordnung generieren zu lassen und ein Skript zu schreiben, das die Zuordnungsdatei liest und die ausführbare Datei patcht. –
Versuchen Sie nie, die Assembly-Ausgabe des Microsoft C/C++ - Compilers zu assemblieren und zu verwenden. Ich weiß nicht, ob das hier der Fall ist, aber im Allgemeinen ist die vom Microsoft C/C++ - Compiler erzeugte Assembly-Ausgabe unvollständig und falsch. Ist Ihr Ziel eine Assembly oder C++ - Funktion, die als TLS-Callback aufgerufen wird? –
@RossRidge zu verwenden Tls aus Assembly mit Masm – YakibutaRamen