[WinDbg] StartAddress vs Win32StartAddress

StartAddress는 CreateThread 내부적으로 사용하는 주소 -> 이게 필요한 이유는 ExitThread를 일괄적으로 해주기 위해서

Win32StartAddress는 우리가 파라미터로 건넨(CreateThread 호출시) 바로 그 주소임.

pContext->EAX = Win32StartAddress(WinMainCRTStartUp) AOEP와 동일
pContext->EIP = StartAddress(ntdll!RtlUserThreadStart와 동일) 
ntdll!RtlUserThreadStart가 실행되고 WinMainCRTSartUp이 실행이 된다.

ntdll!RtlUserThreadStart
mov dword ptr[esp+4], eax ; eax = Win32StartAddress
mov dword ptr[esp+8], ebx ; ebx = PEB
jmp ntdll!_RtlUserThreadStart

00001010 00000000 EAX EBX

ntdll!_RtlUserThreadStart
mov edi, edi
push ebp
0000100C EBP 00000000 EAX EBX
mov ebp, esp ; ebp = 0000100C
push ecx ; 아마도 0
push ecx
00001004 ecx ecx EBP 00000000 EAX EBX
lea eax, [ebp-8] ; eax = 00010004
call ntdll!RtlInitializeExceptionChain
push dword ptr[ebp+C]
push dword ptr[ebp+8]
0000FFFC EAX EBX ecx ecx EBP 00000000 EAX EBX
call ntdll!__RtlUserThreadStart

노트패드를 예로 들면)
ETHREAD!Win32StartAddress는 notepad!WinMainCRTStartUp을 의미하며

notepad.exe의 OptionalHeader부분을 보면
Address of EntryPoint가 존재를 하는데 정확하게 Win32StartAddress와 동일하다.

또한 이 시점에는 이미 ImportDirectory에 명시되어 있는 DLL들이 모두 매핑이 완료된 상태이다.

댓글

이 블로그의 인기 게시물

[WinAPI] 모달리스 다이얼로그 설명

[WinDbg] Debugging a stack overflow

[WinDbg] first-chance, second-chance Exception