요즘 바빠서 공부를 잘못했는데 시간을 내서 진행해보았습니다. 내용이 약간 두서없더라도 이해해주세요.추후 수정하겠습니다.
루트킷진행하면서 SysEnter Hooking을 통한 프로세스 모니터링을 진행해보았습니다. 먼저 SysEnter를 통한 커널진입을 간단히 보겠습니다.
※ SYSENTER 커널진입 : 자세한 내용은 SSDT Hook을 참조
①User Level에서 eax에 Service Num과 edx에 Parameter 프레임포인터를 저장한 뒤 커널모드 진입합니다.
② msr : 0x176에 있는 KiFastCallEntry주소를 EIP로 가져와 실행합니다.
③ SSDT를 참조하여 함수를 호출합니다.
: 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를 꼭 수정해서 저와 같이 삽질하는 일이 없기를 바랍니다.
'Programming > Security Programming' 카테고리의 다른 글
[x64 Windows]프로세스 보호기능 구현 (0) | 2018.04.30 |
---|---|
SetUnhandledExceptionFilter를 이용한 AntiDebugging (0) | 2018.04.10 |
SSDT후킹(SSDT Hooking)!! 파일삭제 거부 프로그램! (0) | 2017.06.06 |
Parite.B 파일바이러스 치료로직 개발 (0) | 2017.06.04 |
[Win32 / C] ntdl.dlll의 InlinHook탐지 (0) | 2017.05.06 |
댓글