Windows API가 프로세스를 만드는 방법을 이해하려고합니다. 그래서 잘못된 exes가 실패한 곳을 확인하는 프로그램을 만들 수 있습니다. kernel32.CreateProcessA
을 호출하는 프로그램이 있습니다. OllyDbg을 따라 가면 을 호출하며 kernel32.CreateProcessInternalW
을 호출하며 ntdll.ZwCreateUserProcess
을 호출합니다. 이 기능은 간다 :ntdll.dll의 내부 ZwCreateUserProcess에서 멀리 점프
jmp far 0x33:0x74BE271E
하지만이 명령 단계 때, 올리 그냥 add esp, 4
직후에 ntdll.ZwCreateUserProcess
로 회복 :
mov eax, 0xAA
xor ecx, ecx
lea edx, dword ptr [esp+4]
call dword ptr fs:[0xC0]
add esp, 4
retn 0x2C
그래서 내가 하나의 명령을 포함 fs:[0xC0]
에 대한 호출을 따라 통화 (0x74BE271E
에 없음). retn 0x2C
에 중단 점을 넣었고 add esp, 4
실행 중에 새 프로세스가 어떻게 든 생성되었음을 알았습니다.
그래서 저는 먼 저리와 관련된 마법이 있다고 가정하고 있습니다. 실제로 멀리 점프를 실행하는 대신 0x33
및 EIP 0x74BE271E
CS 레지스터를 변경하려고했지만 몇 가지 지침을 후 액세스 위반이 준. 무슨 일 이니? 이 ZwCreateUserProcess
의 추상화를 넘어서 더 깊이 파고 들어 Windows가 프로세스를 정확히 만드는 방법을 알아낼 수 있어야합니다.