본문 바로가기
Programming/Security Programming

[SYSENTER Hooking] ZwOpenProcess/ ZwTerminateProcess 모니터링

by Winduck 2017. 7. 20.
반응형

요즘 바빠서 공부를 잘못했는데 시간을 내서 진행해보았습니다. 내용이 약간 두서없더라도 이해해주세요.추후 수정하겠습니다.

루트킷진행하면서 SysEnter Hooking을 통한 프로세스 모니터링을 진행해보았습니다. 먼저 SysEnter를 통한 커널진입을 간단히 보겠습니다. 


※ SYSENTER 커널진입 : 자세한 내용은 SSDT Hook을 참조

①User Level에서 eax에 Service Num과 edx에 Parameter 프레임포인터를 저장한 뒤 커널모드 진입합니다.

② msr : 0x176에 있는 KiFastCallEntry주소를 EIP로 가져와 실행합니다.

③ SSDT를 참조하여 함수를 호출합니다.



※SYSENTER Hook의 함수호출 전체적인 그림

 : Hook은 원래의 KiFastCallEntry가 저장되어있는 msr 0x176 제작된 NewKiFastCallEntry로 수정합니다.

 

 

① User Level에서 eax에 Service Num과 edx에 Parameter 프레임포인터를 저장한 뒤 커널모드 진입합니다.

② msr : 0x176에 있는 조작된 NewKiFastCallEntry주소를 EIP로 가져와 실행합니다.

③ NewKiFastCallEntry하위의 프로세스 모니터링 함수 HookFunc를 실행합니다.

본래의 KiFastCallEntry를 호출합니다.

 

다음은 코드를 알아보겠습니다.

 

※코드설명

:제작된 KiFastCallEntry가 호출되도록 msr 0x176을 수정합니다. 다음은 msr을 수정하는 코드입니다.

코드를 설명하자면

 

 

① rdmsr을 통하여 ecx에 저장된 msr의 offset 0x176를 eax로 가져옵니다.

② eax에 후킹함수주소를 저장합니다.

③ 미리 저장되어있던 ecx(0x176)을 offset으로 eax(후킹함수주소)를 msr:0x176에 저장하여 후킹을 진행합니다.

 

 

다음은 msr0x176에 저장되어 호출되는 NewKiFastCallEntry 내부입니다.

 

※모니터링 함수내부

 : PsGetCurrentProcess()PsGetProcessImageFileName()을 활용하여 ZwOpenProcess,ZwTerminateProcess접근하는 프로세스를 모니터링하였습니다.

   코드는 다음과 같습니다.

 

 

※여기서 잠깐!!! : 꼭 알고 갑시다.ㅠㅠ

 

 : 이부분은 제가 책에서 본내용임에도 불구하고 BSOD를 엄청봤습니다. 주목할 코드는 다음과 같습니다.

 __asm{

...

push 0x30

pop fs

...

 }

 

PsGetCurrentProcess는 내부적으로 fs를 사용합니다.  User Level에서 fs는 TEB로 사용되지만 KernelLevel에서는 KPCR을 가리킵니다.

위처럼 커널레벨로 진입했는데도 fs를 0x30으로 수정하지 않으면 TEB로 접근하기때문에 BSOD가 뜹니다. ( 유저레벨 세그먼트를 참조하게 됨 )

 

커널코딩을 하면서 고려해야할사항들이 많군요. 아무튼 마지막으로 실행화면입니다.

 

 

 

출력결과가 잘나오는 것을 볼 수 있습니다. 바쁜와중에 틈틈히 진행하다보니 시간이 조금걸렸네요...ㅠㅠ

다른분들은 fs를 꼭 수정해서 저와 같이 삽질하는 일이 없기를 바랍니다.

 

 

 

반응형

댓글