우리 팀에서 만들 툴중에 타 프로세스에 dll 인젝션을 해서 뭔가 작업을 하는 툴이 있는데,
이 툴을 사용하는 타 부서에서 갑자기 동작이 안된다고 한다.
확인을 해보니 CreateRemoteThread에서 0x8 (ERROR_NOT_ENOUGH_MEMORY) 에러를 뱉는다.
메모리가 충분하지 않다고하니 그냥 재부팅 한번 해보세요 했는데 역시나 똑같다.
검색을 좀 해보니 비스타 이상부터 프로세스가 세션과 연계되어 처리되기 때문에 이런 증상이 나온다고 한다.
해당 툴을 사용한 PC가 빌드머신으로 사용되고 있어 여러명이 로그인을 하기 때문에 여러개의 세션이 생겨서 발생한 것으로 보인다.
해결 방법으로는 몇가지가 있지만 가장 깔끔한 방법으로는 NtCreateThreadEx 함수로 대체하는 것이다.
NtCreateThreadEx라면 CreateThread의 Nt 함수인데 왜 저걸 사용하는지 궁금해서
IDA로 kernelbase.dll, ntdll.dll 파일을 까봤다.
|
- CreateThread - |
|
- CreateRemoteThread - |
|
- CreateRemoteThreadEx - |
CreateThread가 내부적으로 CreateRemoteThreadEx를 호출하고,
CreateRemoteThread도 내부적으로 CreateRemoteThreadEx를 호출하고,
CreateRemoteThreadEx는 내부적으로 NtCreateThreadEx를 호출하고 있었다.
그래서 NtCreateThreadEx 함수로 대체가 가능한 것이었다..는 것을 알았네요.
아래는 코드입니다.
NtCreateThreadEx 함수는 VISTA 부터 지원이 되므로 OS 버전을 체크하여
XP이하일 경우 CreateRemoteThread를 사용하고 그 위의 OS에서는 NtCreateThreadEx를 사용하도록 하였습니다.
'User mode' 카테고리의 다른 글
StartService 1053 (0x41D) (3) | 2014.03.07 |
---|---|
IsUserAdmin (0) | 2014.02.05 |
InterlockedCompareExchange (0) | 2014.01.29 |
서비스에서 프로세스 접근 권한 변경 (0) | 2014.01.28 |
UAC 사용여부와 관리자 권한 획득 유무 (0) | 2014.01.14 |