특정 프로세스의 보호를 위해 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를 후킹한다??
'자료' 카테고리의 다른 글
[C#] 카카오톡 PC 오픈채팅 자동 입력 (0) | 2020.11.23 |
---|---|
[C#/vb.net] 네이버 맞춤법 검사 WinHttp 사용 (0) | 2020.11.23 |
[C#/VBNET] [API] 화면 캡쳐 방지 (Screen Capture Prevention) (0) | 2020.11.11 |
[C#/VBNET] [WMI] 그래픽 카드 정보(Graphic Card) 불러오기 (0) | 2020.11.11 |
OS | 윈도우 설치 USB 만들기 ( Rufus 이용) (0) | 2020.10.25 |