2012-12-02 1 views
4

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가 프로세스를 정확히 만드는 방법을 알아낼 수 있어야합니다.

답변

5
jmp far 0x33:0x74BE271E` 

그 점프가 커널에 들어갑니다. 0x33은 일종의 x86 게이트를 가리키는 특별한 세그먼트 선택기입니다. 이것은 컨텍스트 스위치를 커널로 트리거합니다.

4

누락 된 부분은 커널 부분입니다. 커널 모드 디버거를 부착하고 ZwCreateUserProcess의 커널 측 코드에 들어가서 프로세스가 어떻게 생성되는지 살펴보아야합니다. 또한 Windows Internals 5 또는 6 판의 5 장 "프로세스, 스레드 및 작업"을 살펴보십시오. 이 장에서는 프로세스 작성에 대해 자세히 다룹니다.

3

실제로 점프는 커널에 들어 가지 않지만 WoW64의 x64 usermode 하위 시스템 (Win32에서는 Win32)으로 전환됩니다.

선택기 33h는 4GB 메모리 공간을 차지하지만 x64 모드로 설정된 특수 선택기입니다. 점프는 32 비트 API 매개 변수를 64 비트 값으로 변환하고 64 비트 ntdll.dll에서 API를 호출하는 wow64cpu.dll의 64 비트 (그러나 여전히 usermode) 부분으로 이동합니다 (예, 두 개가 있습니다. WoW64 프로세스에서). 그 ntdll은 차례대로 커널로가는 실제 시스템 호출을 호출합니다.

메커니즘을 자세히 설명하는 몇 가지 링크가 있습니다. "천국의 문"이라는 용어를 찾아서 더 많은 것을 찾을 수도 있습니다.

http://rce.co/knockin-on-heavens-gate-dynamic-processor-mode-switching/

http://wasntnate.com/2012/04/heavens-gate-64-bit-code-in-32-bit-file/