본문 바로가기
Programming/Security Programming

[x64 Windows]프로세스 보호기능 구현

by Winduck 2018. 4. 30.
반응형

집에서 쉬면서 주말동안 했던 코딩했던 것들을 정리해봅니다.

포스팅 프로세스 보호기능 구현에 관련해 작성되었으며 드라이버 테스트환경은 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;

 

출처: <https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/ns-wdm-_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;

 

출처: <https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/ns-wdm-_ob_operation_registration>

 

- ObjectType : 트레거되는 오브젝트 타입(  PsProcessType, PsThreadType, ExDesktopObjectTpe 있다. )

- Operations : 변수명 그대로 언제 동작되는지를 나타낸다.(OB_OPERATION_HANDLE_CREATE, OB_OPERATION_HANDLE_DUPLICATE)

- PreOperation : Operation이 발생할 동작되는 콜백루틴

- PostOperation : Operation이 모두 이루어지고 동작하는 콜백루틴

 


 


새로운 여러 구조체가 나오다 보니…. 복잡스럽다….


일단 우리가 등록해야 하는 루틴은 PreOperation를 통해 종료 권한으로 접근할 해당 플래그를 지워서 프로세스를 보호할 예정이다.


다음은 먼저, 콜백루틴 등록하기 위한 초기화 루틴 코드이다.



그렇다면 코드의 ObPreOperationCallback루틴 ,프로세스 종료거부가 어떻게 이루어지는지 코드를 보겠다.




이렇게 구현이 완료되었다. 실행할 다음과 같이 실행이 되는 것을 있다.




이번 블로깅 글은 처음으로 시도해보는 x64 드라이버 코딩이다.ㅎㅎ x64는 처음이다보니 여러가지 시행착오도 겪었는데 최종 결과물보니 별것아니지만 신기방기했습니다. ㅎㅎㅎ 이런저런정보를 찾다보니 오래전에 작성된 글이 많은 것으로 보아 위 방법은 꽤나 고전적인 방법인듯합니다. 아무튼 이렇게 첫 x64 드라이버 코딩글을 마무리하며 x64 코딩에 많이 도와주신 아는 형님(?)께 감사드립니다.
[참고글 : https://m.blog.naver.com/PostView.nhn?blogId=wwwkasa&logNo=80168451985&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F (아는 형님과는 관련없는 블로그) ]


반응형

댓글