0. 개요

  공부를 하다보면 CreateProcess() 함수를 후킹하거나 탐지를 피하기 위해 내부 함수를 사용하는 경우가 많은데 보면 볼수록 혼란스러워서 정리려고 한다. 그 대상이 되는 함수들은 다음과 같다.



CreateProcessA()  /  CreateProcessW()

CreateProcessInternalA()  /  CreateProcessInternalW()

NtCreateUserProcess()

NtCreateProcess()  /  NtCreateProcessEx()

RtlCreateUserProcess()  /  RtlCreateUserProcessEx()





1. 큰 그림  (XP와 Vista의 차이)

  아래의 함수 이름들처럼 이후 설명하면서 뒤의 A, W 또는 Ex를 붙이지 않는다면 간략하게 나타내기 위함이라고 생각하자. 다음 설명에서 상세하게 붙여가면서 정리할 것이다.


  크게 정리하자면 먼저 윈도우 XP에서는 아래와 같은 흐름을 가진다.

CreateProcess() -> CreateProcessInternal() -> NtCreateProcess()


  윈도우 비스타 이후부터는 아래와 같은 흐름을 가진다.

CreateProcess() -> CreateProcessInternal() -> NtCreateUserProcess()


  마지막 부분이 달라졌다는 것을 확인할 수 있을 것이다. 이렇게 큰 그림을 파악했으니 차례대로 유니코드 여부, 확장 여부 등에 대해서 살펴보겠다.





2. 세세한 차이

2.1 CreateProcessInternal()까지

  먼저 CreateProcess()는 두 종류가 있는데 결국 CreateProcessInternal() 함수를 호출한다. 유니코드인 CreateProcessW()를 호출하면 간단하게 CreateProcessInternalW()까지 호출되서 깔끔하지만, 아스키 형태인 CreateProcessA()를 호출하면 CreateProcessInternalA()를 거쳐서 CreateProcessInternalW()로 가게 된다.


CreateProcessA() -> CreateProcessInternalA() -> CreateProcessInternalW()

CreateProcessW() -> CreateProcessInternalW()



2.2 XP와 비스타의 차이점

  CreateProcess() -> CreateProcessInternal() 까지 살펴보았다. 이제 XP와 비스타 이후부터 달라지는 부분을 보겠다. 비스타 이후의 경우 NtCreateUserProcess() 부분은 깔끔해서 더 살펴볼 내용이 없다. 


CreateProcessInternalW() -> NtCreateUserProcess()


  하지만 XP의 경우 즉 NtCreateProcess()는 확장 부분이 존재한다. 물론 대부분의 API 함수들과 같이 마지막에 호출되는 부분이 확장 함수이다.


CreateProcessInternalW() -> NtCreateProcess() -> NtCreateProcessEx()



2.3 RtlCreateUserprocess()

  마지막으로 RtlCreateUserProcess() 부분이 남았다. 사실 이 부분은 CreateProcess()의 호출에 포함되는 부분은 아닌것 같고 단순히 NtCreateuserProcess()에 대한 Small Wrapper 함수라고 한다. 문제는 이것도 확장이 존재한다. 간단하므로 아래의 순서도를 보겠다.


RtlCreateUserProcess() -> RtlCreateUserProcessEx() -> NtCreateUserProcess()


  XP의 경우에도 존재하지만 마지막이 NtCreateProcess()인지는 확인해보지 않았다.





3. 기타

  Process Doppelganging을 공부하는데 NtCreateProcessEx() 함수를 사용하는 부분이 나왔다. 이 기술은 윈도우 비스타 이후부터 사용 가능한데 비스타에서 사용되지 않는 즉 XP 까지 사용되던 내부 함수를 사용하는 것이다.





4. CreateThread()

  쓰레드 관련한 내용도 신기해서 덧붙이기로 한다.


CreateThread() -> CreateRemoteThreadEx() -> NtCreateThreadEx()

CreateRemoteThread() -> CreateRemoteThreadEx() -> NtCreateThreadEx()

RtlCreateUserThread() -> NtCreateThreadEx()


  참고로 NtCreateThread()와 NtCreateThreadEx() 모두 마지막 단의 함수인데 NtCreateThread()는 호출되는 부분은 찾지 못했다. XP에서 사용되었던 함수였나 보다.


  또한 RtlCreateUserThread()도 NtCreateThreadEx()에 대한 Small Wrapper 함수라고 보면 될 듯 싶다.



Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함