(Taskmgr.exe는 작업관리자를 의미한다.)
DKOM의 원리
EPROCESS의 구조체의 주소를 알아내기 위해서는 PsGetCurrentProcess 함수를 이용하면 주소를 알아낼 수 있다. 이 함수는 실제로 IoGetCurrentProcess와 같다. 이 함수를 디스어셈블리해 보면 아래와 같이 두개의 mov 명령을 수행하고 리턴하는 것을 볼 수 있다.
위 어셈블리를 설명하면, 우선 윈도우에는 커널 프로세스 컨트롤 블록(KPRCB, Kernel's Processor Control Block)이라는 것이 존재하며, 커널 메모리 공간의 0xffdff120 번지에 존재하고 있다. IoGetCurrentProcess의 어셈블리 코드를 보면 fs 레지스터의 0x124 오프셋의 값을 가져오는데 그것이 바로 현재의 ETHREAD 구조체의 주소를 타나낸다.
ETHREAD 블록을 통해 KTHREAD 구조체의 주소를 구하고 또 KTHREAD 구조체를 통해서 현재 프로세스의 EPROCESS 구조체 주소를 구한다. 그 다음에는 EPROCESS의 이중링크드 리스트로 연결된 프로세스들을 모두 조사해서 숨기고자 하는 프로세스를 찾아내면 된다.
아래 코드는 운영체제에 따라서 PID값을 위치가 다르기 때문에 EPROCESS 구조체 안에서의 PID 오프셋을 구하기 위한 코드이다.
********************************************************************************************
메모
각 OS 별 EPROCESS의 PID 오프셋과 FLink 오프셋을 찾아보는 중 DKOM이 가능한 소스를 만들어 공유하는 곳을 볼 수 있었다. : http://www.rohitab.com/discuss/topic/40694-hide-process-with-dkom-without-hardcoded-offsets/
시만텍의 악성코드에서 보게된 rootkit에 대한 문서 : https://www.symantec.com/avcenter/reference/when.malware.meets.rootkits.pdf
********************************************************************************************
WINDOWS NT | WINDOWS 2000 | WINDOWS XP | WINDOWS XP SP 2 | WINDOWS 2003 | |
PID Offset | 0x94 | 0x9C | 0x84 | 0x84 | 0x94 |
FLINK Offset
(프로세스 리스트를 위한 이중 링크드 리스트)
| 0x98 | 0xA0 | 0x88 | 0x88 | 0x98 |
PID를 이용해서 프로세스를 은닉시키는 것은 항상 유효하지 않다. 이유는 PID가 항상 일정하지 않기 때문이다. 그러므로 프로세스의 이름을 이용하는 것이 좀 더 신뢰할 수 있다. 프로세스 이름을 이용하는 방법은 아래와 같은 code를 이용할 수 있다.
위 함수는 EPROCESS 구조체 안에 존재하는 프로세스 이름의 오프셋 값을 반환한다.
다음의 코드는 숨기고자 하는 프로세스(PID_TO_HIDE)의 EPROCESS 구조체를 찾기 위해 FindProcessEPROC 함수를 호출한다. 그 다음에는 이중 링크드 리스트에서 해당 프로세스의 EPROCESS 구조체를 제거한다.
맨 아래 유요한 메모리 주소를 가리키게 하지 않으면, 블루 스크린이 발생할 수 있다. 이는 PspExitProcess라고 하는 커널 함수 때문이다.
댓글 없음:
댓글 쓰기