[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들이 모두 매핑이 완료된 상태이다.
댓글
댓글 쓰기