Shield from DLL-Injection

http://www.rootkit.com/blog.php?newsid=640

프로세스에 DLL Injection할 때 주로 사용하는 방법은 CreateRemoteThread()를 사용하여
LoadLibrary()를 호출하여 원하는 DLL을 Load한다. 이런 방법을 사용하는 트로이 프로그램이나
Hook을 시도하는 녀석들을 감지해낼 수 있다.

CreateRemoteThread()가 Target Process를 향해 호출되면 Target Process내에서는 CreateThread()가
호출되며 CreateThread()를 리버싱해보면 다음과 같다.

KERNEL32!BaseThreadStartThunk:
77e964cb xor     ebp,ebp
77e964cd push    ebx
77e964ce push    eax
77e964cf push    0x0
KERNEL32!BaseThreadStart:
77e964d1 55               push    ebp
77e964d2 8bec             mov     ebp,esp
77e964d4 6aff             push    0xff
...snip...
77e9651d ff750c           push    dword ptr [ebp+0xc] <-- push the argument
                                                                                          to ThreadFunc
77e96520 ff5508           call    dword ptr [ebp+0x8] <-- DWORD WINAPI
                                                                                         ThreadFunc(LPVOID);
77e96523 50               push    eax
77e96524 e805000000       call    KERNEL32!ExitThread (77e9652e)
77e96529 e923f10000       jmp     KERNEL32!BaseThreadStart+0x81 (77ea5651)

여기서 제일 처음 호출되는 BaseThreadStartThunk() 함수를 Hooking 하여 Hook Procedure
에서 lpStartAddress(Thread의 시작주소-Stack에 존재)를 LoadLibrary나 GetProcAddress,
FreeLibrary와 같은 함수의 Address와 비교하여 같을 경우, Injection이라고 간주한다.

이러한 탐지 방법은 단지 CreateRemoteThread()를 사용하여 DLL Injection하는 경우만
탐지가능하고, SetWindowsHookEx(), SetThreadContext()로 DLL Injection하는 경우는 탐지
불가능하다.

by nerd | 2007/01/16 14:43 | Garage | 트랙백 | 덧글(0)


트랙백 주소 : http://nerd.egloos.com/tb/2940078
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶