본문 바로가기

My Study/Reversing

NateOnHook40u.dll 에 대한 작은 고찰

아마 네이트온을 쓰고 조금이나마 프로세스에 붙어있는 DLL에 관심을 가지신 분이라면
한번쯤 궁금증을 가지셨을 만한 내용같습니다.


위 그림을 보시면 일반 프로그램을 하나 켰는데 NateOnHook40u.dll이 인젝션되어 붙어있습니다.

각 프로세스를 잘 관찰해 보면 알수있듯이 생성되는 대부분의 프로세스에 해당 dll이 인젝션되는것을 알 수 있습니다.
여기서 보여드리진 않았지만 프로세스에 dll이 로드될때 호출하는 LoadLibrary함수가 최종적으로 호출하는 ntdll.dll의 함수인
LdrLoadDll에 브포를 걸어두고 인자를 잘 살펴보면 NateOnHook40u.dll가 로드되는 것을 알 수 있습니다.

그러면 저 dll이 뭐하는 dll이길래 생성되는 프로세스마다 붙게 되는 걸까요??
해당 dll의 내용을 보도록 하겠습니다. 파일 명에서도 알 수 있듯이 뭔가 훅을 하고 있는거 같습니다.
특정 메시지 혹은 API함수를 후킹하고 있겠죠.


dll내부에서 후킹관련 함수나 동작을 찾던 중 위와 같은 부분을 찾았습니다. 
SetWindowsHookExA라는 함수가 사용되고 있군요.
해당 함수는 HookType에 맞는 메시지가 발생하면 Hookproc함수가 실행되는 함수입니다.
HookType의 종류는 매우 많습니다.
위 링크로 들어가시면 어떠한 메시지들이 있는지 볼 수 있습니다.

여기서는 3개의 메시지에 대해 훅을 하고있습니다. 
WH_KEYBOARD  = 키보드를 누르거나 땠을 때 
WH_MOUSE       = 마우스가 동작했을 때
WH_SHELL        = 쉘 프로그램으로부터 메시지를 받는 것을 알아차릴 때..

뭐 대충 위 3가지 경우입니다. 그러면 WH_KEYBOARD메시지가 발생했을 때 훅을 하는 경우 호출되는 함수에 브포를 걸고
해당 프로세스에서 키를 눌러보겠습니다.

CallNextHookEx는 훅 체인에 있는 다른 훅에게 해당 메시지를 넘겨주는 역할을 합니다. 
메시지를 자기혼자만 훅하고 끝내버리면 안되겠죠.

점프문이 하나 있는데 [ESP+4] 면 해당 함수의 첫번째 인자가 되겠군요. 첫번째 인자가 0이어야 점프를 하겠군요.
아래쪽을 보니 GetForegroundWindow와 GetDesktopWindow함수가 있는데 두 함수는 ForeGroundWindow와 DesktopWindow의 핸들을 얻어오는 함수입니다. 하지만 두 핸들을 어디서 사용하고 있는지는 모르겠군요.

그 아래 PostMessageA함수가 있습니다. 어디론가 메시지를 보내는데 핸들이 0x3037E입니다. 
핸들 0x3037E인 프로세스는 어떤 프로세스인지 구해보겠습니다. 
간단히 GetForegroundWindow함수를 사용해 만들어놓은 프로세스 핸들 구하는 프로그램입니다.


네이트온의 핸들을 보니 0x3037E이군요. 역시 해당 메시지가 발생하면 네이트온으로 눌렀던 키를 보내게됩니다.
해당 아스키 값은 PostMessage의 wParam인자에 들어있겠지요.

이러한 훅을 총 3개를 설치했는데요. 각각의 함수는 같은 내용이었습니다.
간단히 생각해 볼 수 있는게 특정 프로세스에서 메시지가 발생했을 때 네이트온으로 메시지를 보낸다.
보통 디폴트로 네이트온에서 설정되어 있는 옵션이 있습니다.

일정시간이 지나면 자리비움으로 상태가 변경된다는 것입니다. 
하지만 각 프로세스에서 메시지가 넘어오게 되면 자리비움이 풀리는 것입니다.

해당 dll은 자리비움이 될건지 말건지를 설정하는 dll이 되게됩니다.
아마도 특정 프로세스에서 해당 dll 인젝션을 막고 프로그램을 수행하게 된다면 일정시간 후에 네이트온은 자리비움으로
될것입니다. 네이트온으로 아무런 메시지를 보내지 않기 때문이죠.

별다른 악의적인 dll은 아니니 걱정하실 필요는 없습니다.

참고로 콘솔 프로그램에는 injection이 안됩니다 ^^