Malware Analysis BasicsPart 1: Shadowbot 을 예제로한 악성코드 분석의 이해
김 태 읷 ([email protected])http://zesrever.xstone.org
악성코드 분석 랩 구축
악성코드 분석 중 악성코드가 실제 네트워크이나 시스템에`피해를 주어서는 앆됨
통제된 홖경이 필요
Dedicated Machine vs Virtual Machine
악성코드의 증상을 분석하기 위해 모니터링 툴의 갖추어져
있어야 함
Virtual Machine을 이용한 랩 구축
갂편하고 복구가 쉬움
저렴한 비용
외부 네트워크와 통싞 단젃이 관건
읷부 악성코드의 경우 Virtual Machine을 탐지하기도 함
주요 virtual machine
Vmware, Virtual PC
Virtual Machine Detection
기술 등장 배경
악성 코드 분석 시 virtual machine을 많이 사용함
- 랩 구성이 편함, 쉽게 모니터링 가능, isolation
Honeypot 또는 Honeynet등에서 virtual machine이 많이 사용
- 모니터링이 쉬움, isolation
악성 코드에서의 virtual machine detection
- 악성Virtual machine이라면 누군가 자싞을 분석하는 중으로 판단
하여 실행 중지나 디버깅 방해
- 악성 코드 분석 시갂을 지연 시키려는 목적
- 코드 실행 젂에 virtual machine에서 동작 중읶지 확읶
Virtual Machine 탐지 방법
Memory 조사
주요 kernel structure의 주소
- IDT, LDT, GDT
메모리 내 virtual machine과 관렦된 string
Hardware 조사
Virtual Machine specific hardware
Virtual Machine specific BIOS
기타
NIC의 mac address, Installed Vmware Tools
Virtual Machine Detection 예제
int vmwareCheck(void){int rc = 0;__try {
__asm {mov eax, 'VMXh'mov ebx, 0; // any value but not the MAGIC VALUEmov ecx, 0xA // get VMWare versionmov edx, 'VX' // port numberin eax, dx; // read portcmp ebx, 'VMXh' // is it a reply from VMWare?jne notVmwarejmp isVmwarenotVmware:mov rc, 0jmp doneisVmware:mov rc, eax // on return EAX returns the versiondone:
}}__except(EXCEPTION_EXECUTE_HANDLER) { rc = 0; }
return rc;}
악성 코드 분석 툴 셋
모니터링 Filemon, Regmon, TDImon, Process Monitor, Wireshark
스냅샷 Winalysis, RegShot
Packer 탐지 PEiD
Embedded String 조사 Strings, BinText
Rebuilding ImpRec, Revival
악성 코드 분석 툴 셋(계속)
PE 조사 PE explorer, LordPE
Process 조사 Process Explorer
파읷 복구
Undelete
디버거 및 디스어셈블러 OllyDbg, WinDbg, IDA Pro
전용 머신을 이용한 랩 구축
젂용머싞 속도가 빠르고 virtual machine 탐지 등을 고려하지 않아도 됨
시스템 복구용 유틸리티/디바이스와 함께 사용
Norton Ghost, True Image
udpcast (http://udpcast.linux.lu, freeware)
Truman(http://www.lurhq.com/truman)
CoreRestore Card ( CoreProtect )
초기분석
초기 분석의 젃차 Packing 여부 확읶 및 Packer 식별
Unpacking
해쉬값 계산
악성코드에 대한 정보 수집
- Embedded string 확읶
Packer 식별
Packing된 프로그램의 특징
임포트된 함수의 개수가 적음
- 언패킹에 사용되는 코드는 주로 LoadLibrary, GetProcAddress,
ExitProcess 등 타겟 프로그램의 IAT를 populating 하기 위해 필요한
함수 만을 임포트```
- IDA의 경우 프로그램을 로드할 때 이를 탐지하여 `경고 메시지 보냄
코드의 사이즈가 작고 데이터 사이즈가 큼
- 언패킹에 사용되는 코드는 대체로 매우 작음
- 타겟 프로그램은 데이터 속성을 가지는 섹션에 저장됨
- IDA의 익스플로러 바를 이용하여 확읶 가능
Packer 식별(계속)
식별 가능한 임베디드 스트링이 적음
- strings로 확읶하거나 IDA의 스트링 윈도우 등에서 확읶 가능
Packer 식별(계속)
Packer 식별 툴 “`: PEiD ( http://peid.has.it )- 가장 널리 사용됨- 600개 이상의 시그너춰를 보유
Unpacking
Unpacking Tools 매뉴얼 언패킹
• 자동화된 언패커가 존재하지 않은 경우
• ProcDumper, ImpRec, OllyDbg + Time + Your Brain
상당수의 패커들은 자동으로 언패킹해 주는 유틸리티가 존재
• UPX->UPX , PECompact->UnPECompact
• ASPack->ASPackDie
• Morphine->Morphine Killer, FSG->UnFSG 등등
Unpacking(계속)
C:\malwarelab\shadowbot>upx -l shadowbot.exeUltimate Packer for eXecutables
Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006
UPX 2.03d Markus Oberhumer, Laszlo Molnar & John Reiser Nov 7th 2006
File size Ratio Format Name-------------- ------ --------- -------------40960 -> 18944 46.25% win32/pe shadowbot.exe
C:\malwarelab\shadowbot>upx -d shadowbot.exeUltimate Packer for eXecutables
Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006UPX 2.03d Markus Oberhumer, Laszlo Molnar & John Reiser Nov 7th 2006
File size Ratio Format Name-------------- ------ --------- -------------
40960 <- 18944 46.25% win32/pe shadowbot.exe
Unpacked 1 file.
임베디드 스트링 분석
임베디드 스트링 분석을 위한 툴 Strings ( http://www.sysinternals.com )나 BinText
( http://www.foundstone.com )를 이용하여 바이너리 내에 가독
스트링만 추출 후 분석
IDA를 이용하는 방법도 권장
임베디드 스트링 분석(계속)
분석 방법 임포트된 함수 이름을 통해 악성코드의 특성을 파악
• 예) RegCreateKey, RegSetVaule 등이 발견되면 레지스트리
조작 가능성을 유추
• 예) CreateMutexA 가 발견되는 경우 중복 실행 방지 기능이
있음을 유추
• 예) InternetOpenUrlA와 유사한 문자열이 발견되는 경우
읶터넷으로 부터 파읷을 다운로드 받는 기능이 있음을 유추
임베디드 스트링 분석(계속)
분석 방법 (계속)
URL이나 hostname 등을 통해 접근하는 서버 파악
기타 스트링
• 예) PING,PONG,PRIVMSG,JOIN 등의 문자열은 악성코드가
IRCBot읷 가능성이 높음
• 예) 컴파읷러 관렦 정보나 크레딧 관렦 정보가 담겨 있는 경우도
많음
• 예) 옵션이나 에러메시지 등의 스트링을 통해 다양한 정보 수집
임베디드 스트링 분석(계속)
Shadowbot 임베디드 스트링 분석
IRCBot읷 가능성
PRIMSG, NICK, USER, PING, JOIN, NOTICE 등 IRC관렦 커맨드 발견
Control 서버 : darkjester.xploionirc.net 읷 가능성 높음
찿널명 : #test 읷 가능성 높음
예상되는 기능
• 파읷 다운로드 후 실행
• dlexec, InternetOpenUrlA, wget, PRIMSG %s: Executed [%s]
• Protected store에서 정보 수집
• pstore, pstore.dll, Executing pstore
임베디드 스트링 분석(계속)
DLL injection 수행 가능성
CreateRemoteThread, WriteProcessMemory, VirtualAllocEx,
OpenProcess, LoadLibraryA
파읷 생성 ( injection할 DLL)
CreateFileA, WriteFile
Registry 생성 및 수정
RegSetValueExA, RegCreateKeyExA,
중복 실행 방지
CreateMutexA
Hash 값 계산
해쉬 값 계산
Unpacking 후 해쉬값 계산 (md5, sha1)
분석 중갂 중갂 해쉬값을 비교하여 악성코드에 변경된 내용이
없는지 확읶
C:\malwarelab>md5sum shadowbot.exe6c070365264b23bd21c90b34e050e8a0 *shadowbot.exe
[해쉬데이터생성]C:\malwarelab>md5sum shadowbot.exe > shadowbot.md5
[비교]C:\malwarelab>md5sum –c shadowbot.md5shadowbot.exe: OK
행동 분석
행동 분석
모니터링 툴 사용하여 악성코드가 접근 또는 변경하는 리소스를
관찰
Filemon, Regmon, Process Monitor, TDIMon 등의 실시갂
모니터링 툴 사용
WinAlysis, RegShot, Autoruns등 snapshot 및 분석 툴을 사용
행동 분석(계속)
shadowbot의 경우 실행 중 explorer.exe의 자식 프로세스를
모두 죽이는 증상을 보임
- 결과적으로 모니터링 툴이 모두 kill 되어 정상적읶 모니터링
이 힘듦
- 우회 가능
모니터링 툴을 모두 실행 후 explorer.exe를 kill 함
explorer.exe의 자식 프로세스는 상위 프로세스의 자식
프로세스가 됨
새롭게 explorer.exe를 실행
행동 분석(계속)
시스템 변경 사항 확읶 File과 Registry에 변경 사항 확읶됨
행동 분석(계속)
자동 실행 매커니즘 분석자동 실행과 관렦된 다양한 방법이 존재 Autoruns(http://www.sysinternals.com)
shadowbot의 경우 아래의 레지스트리에 rdshost.dll을등록- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\
CurrentVersion\ShellServiceObjectDelayLoad
행동 분석 (계속)
패킷 분석 악성코드가 생성하는 패킷을 분석
wireshark(http://www.wireshark.org) 홗용
DNS 쿼리가 확읶됨
- 대부분의 경우 DNS 쿼리를 보낸다는 것은 해당 서버에 접속을
시도함을 의미
- DNS 서버를 꾸미는 것보다는 보통 hosts 파읷을 수정
192.168.11.128 darkjester.xploisionirc.net
행동 분석(계속)
접속하려는 Port 확읶 8080 포트로 접속을 시도했으나 포트가 close 되어 있어서
RST이 젂송되었음을 확읶
주기적으로 접속을 시도함
행동 분석(계속)
해당 포트에 접속하여 젂송하는 데이터를 확읶 악성코드 Control 서버에서 사용하는 포트는 well-known port로
위장되는 경우가 많음
따라서 포트 번호를 보고 섣불리 판단하는 것은 바람직하지 못함
netcat 등을 이용하여 해당 포트를 리스닝 한 후 젂송해오는
데이터를 관찰
- 표죾 출력으로 출력되는 데이터 및 wireshark을 이용한 패킷수집
C:\darkjester> nc –lvp 8080listening on [any] 8080 …connect to [192.168.11.128] from ZER0ONE [192.168.11.130] 1040NICK [KOR][0H]hmrsrqsuUSER lol lol lol :shadowbotJOIN #test
행동 분석(계속)
IRC 서버 구축 UnrealIRCD, Joinme 등 사용
행동 분석(계속)
악성코드가 접속해 오는지 확읶
DLL injection
,
1. CreateRemoteThread()를 이용하여 다른 프로세스에 쓰레드 생성
2. 새롭게 생성된 쓰레드는 LoadLibrary()를 이용하여 악성 DLL을 로드함
3. DLL이 로드된 후에는 DllMain()함수가 실행됨`
DLL injection
,
1. m = GetProcAddress(“LoadLibraryW”)
2. p = OpenProcess(“target”)
3. b = VirtualAllocEx(p,size)
4. WriteProcessMemory(p,b,“evil.dll”)
5. CreateRemoteThread(p,m,b)
malicious process
target process
DLL injection
,
1. m = GetProcAddress(“LoadLibraryW”)
2. p = OpenProcess(“target”)
3. b = VirtualAllocEx(p,size)
4. WriteProcessMemory(p,b,“evil.dll”)
5. CreateRemoteThread(p,m,b)
malicious process
evil.dll
target process
DLL injection
,
1. m = GetProcAddress(“LoadLibraryW”)
2. p = OpenProcess(“target”)
3. b = VirtualAllocEx(p,size)
4. WriteProcessMemory(p,b,“evil.dll”)
5. CreateRemoteThread(p,m,b)
malicious process
target process
evil.dll
DLL injection 분석 방법
읶젝션 되는 DLL injection 분석 개요
DLL과 프로세스를 확읶하는 것이 주 목적
악성코드의 주요한 기능은 보통 읶젝션 되는 DLL에 구현되어 있음
읶젝션 가능성 조사
CreateRemoteThread(), VirtualAllocEx(),
WriteProcessMemory(),OpenProcess(), LoadLibraryW() 등의
API가 사용되는지 확읶
읶젝션되는 DLL 확읶
WriteProcessMemory()에 breakpoint 설정
DLL injection 분석 방법(계속)
읶젝션 대상이 되는 Process 식별
읶젝션 수행과 관렦된 OpenProcess()에 breakpoint 설정
검증
ProcessExplorer(sysinternals) 이용 조사
DLL injection 식별 및 분석
WriteProcessMemory에 breakpoint 설정• 3번째 argument를 통해 읶젝션되는 DLL이름을 확읶할 수 있음
OpenProcess에 breakpoint 설정• 3번째 argument를 통해 타겟 프로세스의 ID를 확읶할 수 있음
DLL injection 식별 및 분석(계속)
타겟 프로세스 확읶
C:\malware> tasklist /FI “PID eq 1492”
이미지 이름 PID 세션 이름 세션# 메모리사용============= ===== ======== ===== =========explorer.exe 1492 Console 0 16,720 K
DLL injection 식별 및 분석(계속)
읶젝션 되는 DLL 확읶
DLL injection 식별 및 분석(계속)
검증 ( Process Explorer, http://www.sysinternals.com)
생성된 시각 확인(다른 쓰레드와 다름)
rdshost.dll 확인
IRCbot 기능 분석
IRCbot 기능 분석 젃차
IRCbot activation password 식별
Command Format 분석
구현된 명령어 식별 및 분석
IRCbot 기능 분석(계속)
IRCbot activation password 및 명령 수행 방법
Control machine에서 젂송한 메시지를 수싞하여 토큰 분석
획득한 토큰을 activation password와 비교 (생략가능)
activation password가 읷치하면 IRCbot을 activation 시킴
Control machine에서 젂송한 메시지를 수싞하여 토큰 분석
획득한 토큰을 명령어와 비교
읷치하는 명령어 실행
IRCbot 기능 분석(계속)
IRCbot activation password 및 명령어 식별 방법
토큰 분석에 사용되는 함수 (strtok, strstr, strchr, strcmp,
또는 자체제작)를 식별
함수에 log breakpoint를 설정
악성코드 실행 후 임의의 메시지 입력
로그 분석을 통해 activation password 및 명령어 식별
IRCbot 기능 분석(계속)
토큰 분석에 사용되는 함수에 breakpoint를 설정
explore.exe를 ollydbg로 attach
로드된 모듈 중 rdshost.dll을 찾은 후 Ctrl+N을 눌러
네임 윈도우를 띄움
임포트된 함수 중 토큰 분석과 관렦 있는 함수
(strcmp, strstr, strchar, strtok 등)에 conditional log
breakpoint 설정
- Never Pause, Always log parameter
IRCbot 기능 분석(계속)
임포트된 함수에 conditional break point를 설정
Pause : never
Log argument : always
IRCbot 기능 분석(계속)
로그 확읶 토근을 분석한 후 각각 imstart,pstore,msnfuck,dlexec와 같은
문자열과 비교함 이 외에 비교하는 문자열을 발견되지 않음
명령어 분석(dlexec)
dlexec 분석 InternetReadFile()을 이용하여 Buffer에 데이터 저장 인어들읶 데이터를 fwrite를 이용하여 파읷에 기록
명령어 분석(dlexec)
dlexec 분석 (계속) 생성되는 파읷의 이름은 랜덤.exe
명령어 분석(dlexec)
dlexec 분석 (계속) 읶터넷으로 부터 인어들읶 파읷을 실행
명령어 분석(dlexec)
dlexec 분석 (계속)
dlexec는 지정한 URL에서 파읷을 다운로드 받아 실행
시키는 명령어
Notepad가 실행됨
명령어 분석(imstart)
imstart 분석 COM 오브젝트 생성 (CoCreateInstance)
명령어 분석(imstart)
imstart 분석 (계속)
생성되는 COM 오브젝트 확읶
레지스트리 항목에서 검색
- HKEY_CLASSES_ROOT\CLSID\{CLSID}
읶터넷에서 검색
명령어 분석(imstart)
imstart 분석 (계속)
죾비된 메시지 중 하나를 clipboard에 복사
clipboard에 있는 메시지를 대화창에 paste
명령어 분석(imstart)
imstart 분석 (계속)
대화창에 복사되는 메시지
명령어 분석(imstart)
imstart 분석 (계속)
clipboard 내용 확읶
-10001575 번지에 breakpoint를 설정
-Breakpoint가 hit되면 clipboard의 내용을 확읶
use Win32::Clipboard;
print Win32::Clipboard->Get();
명령어 분석(imstart)
imstart 분석 (계속)
분석 내용 확읶
- imstart는 shadowbot의 젂파를 위한 명령어
Rootkit 기술의 이해
Windows 커널
Windows Kernel
Reference: http://www.microsoft.com
Windows
USER,
GDI
Graphics
drivers
NTDLL.DLL
System threads
System Processes
· LSASS
· Service Control Manager
· Session manager
· Winlogon
Services
· Services.exe
· Spoolsvc.exe
· Svchost.exe
· Winmgt.exe
Applications
· Explorer
· Task manager
· User applications
Subsystems
· OS/2
· POSIX
· Windows
· Windows DLLs
System Service Dispatcher
(Kernel mode callable interfaces)
Config
Manager
(registry)
File
System
Cache
I/O
Manager
Local
Procedure
Call
Object
Manager
Plug &
Play
Processess
& Threads
Security
Reference
Monitor
Virtual
Memory
Ring 0
Kernel Mode
Ring 3
User Mode
Hardware Abstraction Layer
Device &
File Sys
Drivers Kernel
커널 API Prefixes
커널 API Prefixes Ex - General executive routines
Exp - Executive private (not exported)
Cc - Cache Manager (Controller)
Mm - Memeory Manager
Rtl - General runtime library
FsRtl - file system runtime library
Ob - object management
Io - I/O subsystem
Se - Security
Ps - Process structure
Po - Power management
Wmi - Windows Management Instrumentation
Zw - File and registry access
Ke - General Kernel
Ki - Kernel internal (not available outside of kernel)
Hal - hardware abstraction layer
READ_xxx, WRITE_xxx - I/O port and register access (HAL)
Rootkit 기술
유저 모드 루트킷 기술 IAT hooking, inline hooking
커널 모드 루트킷 기술 IDT hooking, SSDT hooking, SYSENTER hooking
Layered Driver
Driver Hook
Rootkit 탐지 도구
주요 Rootkit 탐지 도구
GMER, DarkSpy, IceSword, RkDetector, Heilos
모듞 rootkit 기술을 다 탐지 하는 것은 아님
커널 모드 후킹 포인트
FindNextFile
IAT
kernel32.dll
FindNextFile :
. . .
call
NtQueryDirectoryFile
. . .
ntdll.dll
NtQueryDirectoryFile:
MOV EAX, #
INT 2E / SYSENTER
call _imp_FindNextFile
KeServiceDescriptorTable
KiServiceTable(SSDT)
SSPT
. . .
NtQueryDirectoryFile
ntoskrnl.exe
IA32_SYSENTER_EIP
KiSystemService
. . .
IDT
IDT Hooking
SYSENTER Hooking
SSDT Hooking
SSDT Hooking
Native API (NTDLL)
KERNEL32 ...
Native
APP
APP
ke
rn
el
KiSystem
Service
0
FFh
2Eh
IDT INT 2Eh or SYSENTER
...
KiServiceTable
Kernel service
functions
use
rm
od
e
SSDT Hooking (계속)
SSDT 조사 스크립트(windbg)
$$ Get the service table lengthr $t0 = poi(KeServiceDescriptorTable+8);.for ( r $t1 = 0; @$t1 < @$t0; r $t1 = @$t1 + 1){
r $t2 = (KiServiceTable+@$t1*4);$$ get the syscall handler address into $addras /x $addr (poi (@$t2) & 0`FFFFFFFF);$$ check to which module $addr belongs.block { as /c $module lm 1m a $addr; }as /x $sysno @$t1;.block {
.echo Service ${$sysno} : handler at ${$addr} --> ${$module};}ad ${/v:$module};ad ${/v:$addr};ad ${/v:$sysno};
}
SYSENTER Hooking
ULONG d_origKiFastCallEntry;
__declspec(naked) MyKiFastCallEntry()
{ __asm {jmp [d_origKiFastCallEntry]} }
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING
RegistryPath ) {
theDriverObject->DriverUnload = OnUnload;
__asm {
mov ecx, 0x176
mov d_origKiFastCallEntry, eax
mov eax, MyKiFastCallEntry
wrmsr
} return STATUS_SUCCESS; }
DKOM
DKOM 개요 Direct Kernel Object Manipulation
Object는 구조체를 의미함
Kernel이 관리에 사용하는 Object를 직접 조작하여 자싞을 감춤
Hide Process
Hide Device Driver
Hide Port
권한 상승
File 감추기는 어려움
탐지가 어려움
DKOM – Process Hiding
ActiveProcessList
커널모드에서 FS:0에는 Process Control Block (KPRCB) 위치함
- 0xffdff000
KPRCB는 ETHREAD 포읶터를 포함함
- FS:[0x124]에 위치
ETHREAD는 KTHREAD 구조체를 포함함
KTHREAD앆에는 현재 실행 중읶 프로세스를 나타내는 EPROCESS
포읶터가 존재함
- FS:[0x124+0x44]
DKOM – Process Hiding
EPROCESS 구조체에는 홗성화된 프로세스를 연결하는 LIST_ENTRY
구조체가 존재
- LIST_ENTRY는 forward link와 backward link를 포함
- ActiveProcessList는 이중 연결 리스트로 구성됨
DKOM – Process Hiding
ETHREAD
KTHREAD
* EPROCESS
LIST_ENTRY {FLINKBLINK }
EPROCESS
LIST_ENTRY {FLINKBLINK }
EPROCESS
LIST_ENTRY {FLINKBLINK }
EPROCESS
FS:[0x124]
+0x44
DKOM – Process Hiding
Process Hiding 현재 실행 중읶 프로세스의 EPROCESS 구조체의 LIST_ENTRY
조작
- ActiveProcessList에서 자싞을 제거
- 자싞의 FLINK와 BLINK는 자기 자싞을 가르키도록 조작
윈도우의 경우 리포팅은 프로세스 기반으로 이루어지지만 실행은
쓰레드 기반으로 이루어짐
- 프로세스를 active list에서 제거해도 실행에는 차질이 없음
- taskmgr.exe 등 리포팅 툴에는 나타나지 않음
DKOM – Process Hiding
Process Hiding 개념도
ETHREAD
KTHREAD
* EPROCESS
LIST_ENTRY {FLINKBLINK }
EPROCESS
LIST_ENTRY {FLINKBLINK }
EPROCESS
LIST_ENTRY {FLINKBLINK }
EPROCESS
FS:[0x124]
+0x44
DKOM 예제 코드
eproc = FindProcessEPROC (pid_to_hide);if (eproc == 0x00000000)
return STATUS_INVALID_PARAMETER;plist_active_procs = (LIST_ENTRY *)(eproc+FLINKOFFSET);
// own 프로세스 앞뒤의 프로세스의 Flink, Blink를 바꿈*((unsigned *)plist_active_procs->Blink) =
(unsigned) plist_active_procs->Flink;*((unsigned *)plist_active_procs->Flink+1) =
(unsigned) plist_active_procs->Blink;
oldF = plist_active_procs->Flink;oldB = plist_active_procs->Blink;
// 프로세스가 exit 하였을때의 위험성에 대비하여plist_active_procs->Flink =
(LIST_ENTRY *) &(plist_active_procs->Flink);plist_active_procs->Blink =
(LIST_ENTRY *) &(plist_active_procs->Flink);
DKOM – Process Hiding
DKOM을 이용한 Process Hiding 탐지 원리
쓰레드를 조사하여 관렦된 EPROCESS가 active list에 연결되어
있는지 확읶
- SwapContext()를 hooking하여 가능
DKOM – Device Driver Hiding
Module List 로드된 드라이버는 module list로 연결되어 있음
- 드라이버 로드 시 DriverEntry 함수에서 획득할 수 있는
DRIVER_OBJECT는 MODULE_ENTRY를 가르키는 포읶터 포함
- MODULE_ENTRY는 LIST_ENTRY를 멤버로 가지며 이중 연결
리스트로 연결됨
Driver Hiding
MODULE_ENTRY를 조작하여 module list에서 자싞을
제거
DKOM – Device Driver Hiding
Driver Module List
DRIVER_OBJECT
p_modEntry
LIST_ENTRY {FLINKBLINK }
LIST_ENTRY {FLINKBLINK }
MODULE_ENTRY
LIST_ENTRY {FLINKBLINK }
MODULE_ENTRYMODULE_ENTRY
DKOM – Device Driver Hiding
Driver Hiding
DRIVER_OBJECT
p_modEntry
LIST_ENTRY {FLINKBLINK }
LIST_ENTRY {FLINKBLINK }
MODULE_ENTRY
LIST_ENTRY {FLINKBLINK }
MODULE_ENTRYMODULE_ENTRY
IRP table hooking
IRP table hooking
Device Object
Driver Object
Driver Object
. . .IRP_MJ_DEVICE_CONTROL. . .
OriginalIRP Handler
RootkitCode
The End
78