본문 바로가기

리버싱/윈도우

특정 프로세스를 보호하기 위해서 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() 등은 완전 차단함.