본문 바로가기

My Study/Reversing

Anti DLL Injection에 어떠한 방법이 있을까?

대부분의 악성코드들은 바탕화면 프로세스라든지 특정 프로세스에 Injection을 하는 경우가 많습니다.
예전 한 바이러스에서는 explorer.exe에 특정 코드를 인젝션 시켜서 자기가 죽을 때마다 계속 살리는 방식이었습니다.
죽으면 살리는 코드는 당연히 Injection된 코드에 구현되어있었지요.

이러한 Injection기술중 DLL Injection기술을 막는 방법에 대해서는 여러가지가 있겠지만 아직까진 확실히 막을 수 있다!!
라고는 말을 못합니다. 그래서 저도 간단하게 나마 DLL Injection을 막는 코드를 구현해 보았습니다.
물론 제가 만든 것도 뚫립니다. 점점 보안을 강화하는 쪽으로 생각을 해봐야겠죠.

일단 이번 코드는 단순히 틀에 불과합니다. 코드도 간단하구요.
네이트온 같은 경우 특정 프로세스가 생성되면 모든 프로세스에 NateOnHook40u.dll 라는 dll을 인젝션을 시킵니다.
저번 문서에서도 말했듯이 해당 dll은 네이트온 자리비움 효과를 구현하기 위해 존재한다고 했습니다.
그리고 dll이 인젝션 되는 방법은 SetWindowsHookEx함수를 사용해서 OS에서 자동으로 해당 메시지가 발생한 어플리케이션에 dll을 인젝션 시켜줍니다.

한번 자동으로 dll 인젝션 되는 저 dll을 막아보도록 하겠습니다.

구현방법은 너무나 간단합니다. 임시방편..

1. LoadLibraryExW 함수를 후킹한다.
2. 첫번째 인자가 NateOnHook40u.dll 일 경우 NULL로 바꾼다.
3. 다시 LoadLibraryExW 함수를 호출한다.
4. 후킹하는 코드는 TLSCallBack으로 구현한다.

위 4개가 전부입니다.
코드는 간단하게 TLS 부분과 제가 만든 함수 부분만 보도록 하겠습니다.

TLS CallBack

TLS CallBack함수에서는 LoadLibraryExW함수를 후킹하고 있습니다.

MyLoadLibraryExW 함수

위에서 설명했던대로 첫번째 인자가 NateOnHook40u.dll 일 경우 0 으로 바꿔버립니다.
당연히 없는 파일이므로 라이브러리 로드가 안되겠지요.

이게 전부입니다.
작동하는 영상을 보시면 알수 있습니다.
(Ctrl 누르고 마우스 휠로 브라우져 크기 조절 하셔서 보시면 됩니다.)
영상 다운


보통 메시지 후킹같은 경우는 SetWindowsHookEx함수를 사용해서 하기 때문에 OS에서 메시지가 발생한 어플리케이션에 dll인젝션을할 때 단순히 LoadLibrary함수를 사용하게 됩니다. 그렇기 때문에 위 방법을 사용하면 메시지 후킹 같은 경우는 막을 수 있습니다. 하지만....!! 메시지 후킹을 위해서가 아닌 어플리케이션 내부에서 사용한 함수를 후킹할 때는 다양한 방법으로 
인젝션을 시키기 때문에 이럴 경우는
위 방법을 사용해도 막을 수 있다라는 것은.. 장담 못하겠군요. 그리고 LoadLibrary함수를 사용하지 않은 Code Injection같은 경우는 못막겠군요. 조금만 위 방법을 응용하면 Code Injection 또한 막을 수 있지만.. 그것도 임시방편이 될 듯 싶군요.

인젝션과 후킹은 누가 먼저하느냐의 싸움인것 같습니다 ^^;