본문 바로가기

자료

특정 프로세스의 보호를 위해 Ring3에서 Hooking해야할 API 목록

728x90

특정 프로세스의 보호를 위해 Ring3에서 Hooking해야할 API 목록


특정 프로세스의 보호를 위해 Ring3에서 Hooking해야할 API 정리
- 아래는 특정 프로세스를 보호하기 위해서 System의 Global(Wide)한 Hook을 해야 할
API에 대해서 정리한 내용이다.

1. 타겟 프로세스로의 접근
   NtOpenProcess() API

2. 메모리 변조
   NtReadVirtualMemory(), NtWriteVirtualMemory(), NtProtectVirtualMemory()

3. 디버그 Attach 방지
   NtDebugActiveProcess()

4. Hooking 이후에 생성되는 프로세스에 대한 추가적인 Hooking
   CreateProcessInternalW()
   ADVAPI32.dll - CreateProcessWithLogonW

5. Stealth 기능
   NtQuerySystemInformation()

6. Kernel Driver 보호 기능
   NtLoadDriver()의 경우 StartService()를 호출하는 프로세스가 직접 호출하는 방식이 아님.
   StartService()를 호출하는 프로세스에서는 RPC를 통해서 services 프로세스에게 드라이버
   로딩을 명령하는 것 같다. 실제 services.exe에서 ntdll!ZwLoadDriver를 호출한다.
   DeviceIoControl()

7. Code Injection 보호 기능
   CreateRemoteThread()

8. AutoMouse 방지 기능
   user32.dll - SendInput(), keybd_event(), mouse_event(),
                    SetWindowsHookExW() -> NtUserSetWIndowsHookEx()
   user32.dll - NtUserSendInput() 이걸 후킹 해봐야 겠다.  이상하게도 SendInput() 함수가 export
                    되어 있는데 windbg 심볼 정보에는 NtUserSendInput만 나온다.
                    어쨌든 keybd_event(), mouse_event() 함수들은 모두 SendInput()을 거쳐 가기 때문에
                    SendInput()만 훅한다.
   user32.dll - SetCursorPos() 마우스 커서 set을 막아야 한다.
   gdi32.dll - GetPixel() 오토 마우스에서 화면 인식해서 HP나 화면 정보 인식을 막기 위함.
                   GetPixel() 후킹하는 경우 어떻게 위반행위를 필터링하느냐가 문제
   GetWIndowThreadProcessId()와 SendMessage, PostMessage() 연결
   HWND로 프로세스 아이디를 알아낼 수 있다. GetWIndowThreadProcessId()를 이용하여 알아냄.
   저녀석 자체에 대한 변조에 신경써야 한다.

필터링 방법 - 정상적인 동작과 침입하려는 행위에 대한 구분을 위해서 필터링 방법이 필요함.

1. Process ID 비교 (Before Call)
   NtReadVirtualMemory(), NtWriteVirtualMemory(), NtProtectVirtualMemory(),
   CreateRemoteThread(), NtOpenProcess(), NtDebugActiveProcess()
   이러한 API들은 함수 Parameter로 Process Handle이 넘어온다.
   GetProcessId(HANDLE hProcess)함수를 이용하여 보호하려는 타켓 Process ID와 비교하여
   구분할 수 있다. PID 비교에 신경써야 한다. 우회가 가능할 수 있다.
   NtWriteVirtualMemory(), NtReadVirtualMemory(), NtProtectVirtualMemory()의 경우
   가끔 Explorer가 호출하는 경우가 있다. ??

2. After Call
   CreateProcessInternalW(), CreateProcessWithLogonW() 호출 한 뒤 lpProcessInformation으로
   Code Injection이 가능하다.

3. 완전 차단
   SendInput(), keybd_event(), mouse_event() 등은 완전 차단한다.

훅서버 & 훅DLL 이 필요한 정보

훅서버 - 현재 DLL이 Injection되어 있는 프로세스에 대한 정보, 현존하는 프로세스 가운데 DLL이
정상적으로  Attach되어 있지 않다면 해킹 시도라고 생각하고 차단해야 한다. 훅DLL과 통신할 파이프
또는 이벤트 핸들의 정보

훅DLL - 훅서버 또는 보호해야 할 프로그램에 대한 정보 (Pid, ProcessName, ProcessHandle)
보호해야 할 드라이버에 대한 정보 (드라이버 이름 또는 서비스 이름)
보호해야 할 프로그램의 윈도우 핸들 또는 클래스 이름

한가지 생각해야 할 것
동적으로 로드되는 DLL의 경우 후킹을 어떻게 할지도 생각해봐야 함. LoadLibrary를 후킹한다??

728x90