Dakuo’s Lecture
EPROCESS Struct 를 이용한 Process Hide 김종민(dakuo) / 회장 hkdakuo@gmail.com
Contents Ⅰ. Idea Ⅱ. EPROCESS Struct Ⅲ. Source Ⅳ. Execute
Ⅰ. Idea 프로세스 목록확인 : taskmgr (작업관리자) 프로세스 목록에서 타겟 프로세스를 지운다. Windows는 프로세스 구조체로 프로세스를 관리 (EPROCESS Struct) 프로세스들은 Double Linked List 로 이루어짐 타겟 프로세스의 리스트를 연결에서 끊는다. Hide Success
Ⅰ. Idea
Ⅰ. Idea
Ⅰ. Idea
Ⅱ. EPROCESS Struct EPROCESS Struct Windows 에서는 EPROCESS 구조체를 사용하여 프로세스를 표현 프로세스 관리에 유용한 멤버 변수를 포함 Kernel 영역에 존재 WinDbg 에서 dt _eprocess 명령으로 확인 가능
Ⅱ. EPROCESS Struct
Ⅱ. EPROCESS Struct typedef struct _EPROCESS { KPROCESS Pcb; EX_PUSH_LOCK ProcessLock; LARGE_INTEGER CreateTime; LARGE_INTEGER ExitTime; EX_RUNDOWN_REF RundownProtect; PVOID UniqueProcessId; LIST_ENTRY ActiveProcessLinks; // 프로세스 앞, 뒤에 연결된 프로세스 리스트 주소 // Flink : 다음 프로세스 리스트 주소 // Blink : 이전 프로세스 리스트 주소 ULONG QuotaUsage[3]; ……………….. ALPC_PROCESS_CONTEXT AlpcContext; } EPROCESS, *PEPROCESS;
Ⅱ. EPROCESS Struct
Ⅱ. EPROCESS Struct Procexp.exe ps_hide.exe notepad.exe
Ⅲ. Source 소스의 흐름 현재 프로세스 목록을 출력 숨기고 싶은 프로세스의 PID 를 입력 OpenProcess() 로 해당 프로세스 오픈 ZwQuerySystemInformation() 으로 EPROCESS 구조체 주소 값 획득 AdjustTokenPrivileges() 으로 가상 메모리 R/W 권한 획득 ZwSystemDebugControl() 으로 Flink, Blink 값 변경
Ⅲ. Source
Ⅲ. Source Struct OpenProcess() ZwQuerySystemInformation() 소스의 구성 Struct OpenProcess() ZwQuerySystemInformation() AdjustTokenPrivileges() ZwSystemDebugControl()
1. Struct
2. OpenProcess() 프로세스를 열어야만 프로세스 핸들이 시스템에 로드된다. OpenProcess( DWORD dwDesiredAccess, // access flag BOOL bInheritHandle, // handle inheritance flag DWORD dwProcessId // Process identifier ); OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwProcessId);
3. ZwQuerySystemInformation() 시스템에 로드된 모든 핸들의 정보를 조사하여 EPROCESS 구조체의 주소를 얻는다.
3. ZwQuerySystemInformation()
4. AdjustTokenPrivileges() 가상 메모리에 R/W 할 수 있는 권한을 얻는다.
5. ZwSystemDebugControl() 가상 메모리에 접근하여 값을 변경한다.
5. ZwSystemDebugControl()
6. Final Flink, Blink 값 변경.
Ⅳ. Execute
Ⅳ. Execute
Ⅳ. Execute
Ⅳ. Execute
+ Bonus 마찬가지 방법으로 숨겼던 프로세스를 보이게 할 수 있다.
+ Bonus
+ Bonus
+ Bonus
Environment 본 문서는 XP 환경에서 작성하였습니다. 문서작성일 : 2011. 1. 02