.C
소스 파일의 어셈블러 목록을 작성했습니다.MASM이 내 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는 지금과 같이 : 그리고 C 소스에서이 같은 TLS를 구현 한
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
나는 것을 볼 수 없어 TLS 패턴은 내가 패턴이해야 PRO IDA에서 보았다, 그러나 생성됩니다
.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 세그먼트를 정의하고 거기에 그 재잘을 배치해야합니까? 아니면 데이터 섹션에 있어야합니까? 나는 프로 IDA 내부에서 생성 된 파일을 보았다
ml.exe listing.asm /coff
, 나는 TLS 디렉토리가 모두, 내가 MASM 또는 링커에게 어떻게 생산되지 않았 음을 참조하십시오
나는 이런 식으로 컴파일 디렉토리를 만드시겠습니까?
TLS 디렉토리를 생성하는 링커 또는 어셈블러 옵션을 찾을 수 없습니다. 아마도 가장 빠른 해결 방법은 TLS 구조를 일부 세그먼트 (즉, 섹션)에 배치하고 링커가 심볼 맵을 생성하고 맵 파일을 읽고 스크립트를 실행 파일에 패치하도록 코드하는 것입니다. –
Microsoft C/C++ 컴파일러의 어셈블리 출력을 어셈블 및 사용하지 마십시오. 여기에 해당되는지는 모르겠지만 일반적으로 Microsoft C/C++ 컴파일러에서 생성 된 어셈블리 출력은 불완전하고 올바르지 않습니다. TLS 콜백이라고하는 어셈블리 또는 C++ 함수를 사용 하시겠습니까? –
@RossRidge가 masm을 사용하여 어셈블리에서 tls를 사용하는 방법 – YakibutaRamen