집에서 쉬면서 주말동안 했던 코딩했던 것들을 정리해봅니다.
본 포스팅 은 프로세스 보호기능 구현에 관련해 작성되었으며 드라이버 테스트환경은 Windows 7 x64에서 이루어졌음을 알립니다.
최근에 알게 된 프로세스 보호기능에 대해 간단히 알아보고자 한다. 소개할 방법은 통해 프로세스뿐만아니라 파일보호 레지스터보호 또한 가능하다.
이번에 소개할 프로세스 보호 방법은 ObRegisterCallbacks를 통한 방법이다.
ObRegisterCallbacks는 Thread나 Process에 대한 핸들 작업이 이루어질 때 호출되는 콜백루틴를 등록하는 함수이다.
해당 방법은 x86에서 x64로 넘어오면서 Patch Guard의 존재로 SSDT나 KiSystemCall등의 후킹이 어려워졌는데 해당 방법은 MS에서 허용한 후킹방법 중 하나인듯 하다.
아무튼 이번 게시물을 간략히 소개하자면 ObRegisterCallbacks를 통해 콜백루틴을 등록하여 notepad.exe 프로세스에 종료를 위한 접근이 이루어질 때 이를 종료되지 않게 하려고 한다.
먼저 앞으로 다뤄질 내용들에 대한 이해를 돕기 위해 프로세스를 종료할때 사용되는 함수인 NtTerminateProcess내부를 보겠다.
위와 같이 프로세스를 종료시키기위해 핸들을 통해 PROCESS_TERMINATE(0x1)권한으로 접근하는 것을 볼 수 있다.
이에 따라 앞서 설명한것 처럼 콜백함수를 이용하여 PROCESS_TERMINATE(0x1)권한 접근 시 , 0x0으로 권한을 변경하여 세팅하여 종료되지 않도록 할 예정이다.
우선 기능들에 대해 소개하기 전에 ObRegisterCallbacks에 대해 알아보자.
(부가적으로 해당 함수는 Windows Vista SP1, Windows Server 2008에서 생겼다.)
NTKERNELAPI NTSTATUS ObRegisterCallbacks( POB_CALLBACK_REGISTRATION CallbackRegistration, PVOID *RegistrationHandle );
출처: <https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/nf-wdm-obregistercallbacks> - 설명 : thread, process 핸들과 관련된 작업에 대한 콜백루틴을 등록한다. |
- CallbackRegistration : 콜백되는 루틴과 Object버전등의 정보를 담는다.
- RegistrationHandle : 등록하는 CallbackRegistration에 대한 핸들이 담긴다. 이 변수는 이후 ObUnRegisterCallbacks에서 콜백 등록을 해제할 때 사용된다.
결론적으로 CallbackRegistration 에 콜백루틴을 담는데 해당 OB_CALLBACK_REGISTRATION구조체 내용을 보겠다.
typedef struct _OB_CALLBACK_REGISTRATION { USHORT Version; USHORT OperationRegistrationCount; UNICODE_STRING Altitude; PVOID RegistrationContext; OB_OPERATION_REGISTRATION *OperationRegistration; } *POB_CALLBACK_REGISTRATION, OB_CALLBACK_REGISTRATION;
- Version : object callback registration버전(OB_FLT_REGISTRATION_VERSION로 고정됨) - OperationRegistrationCount : OB_OPERATIONREGISTRATION등록된 배열 포인터 갯수 - Altitude : 드라이버 고도 ( 추후 필터드라이버 편에서 다루겠다. ) - RegistrationContext : callback루틴에 등록될때 저장되는 값 - OperationRegistration : 콜백루틴을 등록 |
조금 글이 지루해질 수 있겠지만 중요한 부분이기에 콜백루틴이 등록되는 OperationRegistration 값을 들여다보겠다.
typedef struct _OB_OPERATION_REGISTRATION { POBJECT_TYPE *ObjectType; OB_OPERATION Operations; POB_PRE_OPERATION_CALLBACK PreOperation; POB_POST_OPERATION_CALLBACK PostOperation; } *POB_OPERATION_REGISTRATION, OB_OPERATION_REGISTRATION;
- ObjectType : 트레거되는 오브젝트 타입( PsProcessType, PsThreadType, ExDesktopObjectTpe이 있다. ) - Operations : 변수명 그대로 언제 동작되는지를 나타낸다.(OB_OPERATION_HANDLE_CREATE, OB_OPERATION_HANDLE_DUPLICATE) - PreOperation : Operation이 발생할 때 동작되는 콜백루틴 - PostOperation : Operation이 모두 이루어지고 동작하는 콜백루틴
|
새로운 여러 구조체가 나오다 보니…. 복잡스럽다….
일단 우리가 등록해야 하는 루틴은 PreOperation를 통해 종료 권한으로 접근할 때 해당 플래그를 지워서 프로세스를 보호할 예정이다.
다음은 먼저, 콜백루틴 등록하기 위한 초기화 루틴 코드이다.
그렇다면 위 코드의 ObPreOperationCallback루틴 즉,프로세스 종료거부가 어떻게 이루어지는지 코드를 보겠다.
이렇게 구현이 완료되었다. 실행할 시 다음과 같이 실행이 잘 되는 것을 볼 수 있다.
'Programming > Security Programming' 카테고리의 다른 글
SetUnhandledExceptionFilter를 이용한 AntiDebugging (0) | 2018.04.10 |
---|---|
[SYSENTER Hooking] ZwOpenProcess/ ZwTerminateProcess 모니터링 (0) | 2017.07.20 |
SSDT후킹(SSDT Hooking)!! 파일삭제 거부 프로그램! (0) | 2017.06.06 |
Parite.B 파일바이러스 치료로직 개발 (0) | 2017.06.04 |
[Win32 / C] ntdl.dlll의 InlinHook탐지 (0) | 2017.05.06 |
댓글