2018. 3. 3. 16:57 악성코드 분석
CreateProcess / CreateThread 내부
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 함수라고 보면 될 듯 싶다.
'악성코드 분석' 카테고리의 다른 글
바이너리로 변환된 VBScript 디컴파일 (0) | 2018.04.28 |
---|---|
Autoit 스크립트 (0) | 2018.04.01 |
Process Hollowing 및 응용 (0) | 2018.03.02 |
델파이 바이너리 분석 방법론 (1) | 2018.02.25 |
IDA Pro 시그니처 사용 및 제작 [ Flirt ] (1) | 2018.02.25 |