Windows에서 특정 함수가 내부적으로 호출하는 함수를 알아야할 때가 있습니다. 특히 상용 보안 엔진 등을 개발해야할 때는 이러한 분석이 필수적일 때가 많죠. 조금 더 깊숙히 후킹하여 외부 솔루션과의 충돌을 미연에 피하고 싶을 때(물론 미봉책적인 방법이기는 합니다만...), 혹은 다른 악성코드, 공격 가능 드라이버들이 사전에 후킹/변조/경유할 만한 경로를 찾는다는 것은 보안 솔루션 개발시에 충분히 고려되어야 할 사항이기 때문입니다.
이러한 분석(내부 함수 호출 개요 분석)을 해주는 명령어가 WinDbg에 있습니다. WinDbg의 uf 명령어를 이용하면 특정 함수를 디스어셈블리 할 수 있습니다. 그 중에서도 -c 스위치를 사용하면 함수의 호출만 간략하게 볼 수 있는 유용한 기능을 사용할 수 있습니다. 이 명령어를 사용해서 NtOpenProcess, NtTerminateProcess, NtTerminateThread 함수를 간단하게 분석해보았습니다.
모든 출력 결과는 Windows XP sp3 에서 출력된 것임을 미리 밝혀둡니다.:
* NtOpenProcess:
lkd> uf -c nt!NtOpenProcess
nt!NtOpenProcess (805cd408)
nt!NtOpenProcess+0xa (805cd412):
call to nt!_SEH_prolog (8053db90)
nt!NtOpenProcess+0x4e (805cd456):
call to nt!ExRaiseDatatypeMisalignment (80616072)
nt!NtOpenProcess+0x7c (805cd484):
call to nt!ExRaiseDatatypeMisalignment (80616072)
nt!NtOpenProcess+0x116 (805cd51e):
call to nt!SeCreateAccessState (805f2dc4)
nt!NtOpenProcess+0x132 (805cd53a):
call to nt!SeSinglePrivilegeCheck (805f9cc0)
nt!NtOpenProcess+0x17d (805cd585):
call to nt!ObOpenObjectByName (805bd8f2)
nt!NtOpenProcess+0x18b (805cd593):
call to nt!SeDeleteAccessState (805f2b86)
nt!NtOpenProcess+0x1e2 (805cd5ea):
call to nt!PsLookupProcessThreadByCid (805d502e)
nt!NtOpenProcess+0x1f4 (805cd5fc):
call to nt!SeDeleteAccessState (805f2b86)
nt!NtOpenProcess+0x202 (805cd60a):
call to nt!PsLookupProcessByProcessId (805d50ea)
nt!NtOpenProcess+0x224 (805cd62c):
call to nt!ObOpenObjectByPointer (805bdc78)
nt!NtOpenProcess+0x232 (805cd63a):
call to nt!SeDeleteAccessState (805f2b86)
nt!NtOpenProcess+0x23e (805cd646):
call to nt!ObfDereferenceObject (8052868e)
nt!NtOpenProcess+0x246 (805cd64e):
call to nt!ObfDereferenceObject (8052868e)
nt!NtOpenProcess+0x27e (805cd686):
call to nt!_SEH_epilog (8053dbcb)
* NtTerminateProcess:
lkd> uf -c nt!NtTerminateProcess
nt!NtTerminateProcess (805d49aa)
nt!NtTerminateProcess+0x4a (805d49f4):
call to nt!ObReferenceObjectByHandle (805bd49e)
nt!NtTerminateProcess+0x78 (805d4a22):
call to nt!PspCatchCriticalBreak (805d3a50)
nt!NtTerminateProcess+0x86 (805d4a30):
call to nt!ExAcquireRundownProtection (8060e3da)
nt!NtTerminateProcess+0x91 (805d4a3b):
call to nt!ObfDereferenceObject (8052868e)
nt!NtTerminateProcess+0xb9 (805d4a63):
call to nt!PsGetNextProcessThread (805d9ae4)
nt!NtTerminateProcess+0xd0 (805d4a7a):
call to nt!PspTerminateThreadByPointer (805d4882)
nt!NtTerminateProcess+0xd7 (805d4a81):
call to nt!PsGetNextProcessThread (805d9ae4)
nt!NtTerminateProcess+0xe5 (805d4a8f):
call to nt!ExReleaseRundownProtection (8060e434)
nt!NtTerminateProcess+0xf7 (805d4aa1):
call to nt!ObfDereferenceObject (8052868e)
nt!NtTerminateProcess+0x100 (805d4aaa):
call to nt!PspTerminateThreadByPointer (805d4882)
nt!NtTerminateProcess+0x113 (805d4abd):
call to nt!DbgkClearProcessDebugObject (80644c54)
nt!NtTerminateProcess+0x131 (805d4adb):
call to nt!ObClearProcessHandleTable (805c49f6)
nt!NtTerminateProcess+0x13c (805d4ae6):
call to nt!ObfDereferenceObject (8052868e)
* NtTerminateThread:
lkd> uf -c nt!NtTerminateThread
nt!NtTerminateThread (805d4ba4)
nt!NtTerminateThread+0x4e (805d4bf2):
call to nt!ObReferenceObjectByHandle (805bd49e)
nt!NtTerminateThread+0x62 (805d4c06):
call to nt!ObfDereferenceObject (8052868e)
nt!NtTerminateThread+0x6b (805d4c0f):
call to nt!PspTerminateThreadByPointer (805d4882)
nt!NtTerminateThread+0x76 (805d4c1a):
call to nt!PspTerminateThreadByPointer (805d4882)
nt!NtTerminateThread+0x7f (805d4c23):
call to nt!ObfDereferenceObject (8052868e)
'Kernel Programming' 카테고리의 다른 글
| [Kernel] 프로세스 관련 NTAPI의 내부 호출을 간단하게 살펴보자. (5) | 2009/05/04 |
|---|---|
| [Kernel] 강력한 Anti-anti debugger 플러그인인 PhantOm 을 우회하는 PoC (28) | 2009/02/09 |
| DRIVER_EXTENSION의 정체가 뭐지??? (2) | 2009/02/04 |
| [Kernel] Anti-Dumping(덤프 방지), 어떻게 구현할 수 있을까? (17) | 2009/01/23 |
| [Kernel] 다른 패커의 진입점 코드를 사용하여 PEiD Signature 속이기 (8) | 2008/12/27 |
| [Kernel] Anti Debug Detection - IsDebuggerPresent 조작 여부 검증 (1) | 2008/12/17 |









