让WIN9X和NT一样坚固!!!

wowocock 2002-03-10 12:24:57
众所周知WINNT下的GDT,LDT,IDT都是被保护起来的,RING3级程序不能直接访问,而WIN9X下的这些系统表格都是RING0级的,而且可以任意被修改,从而CIH及其相关类病毒,可以任意进入RING0层大搞破坏,能不能象NT那样也把这些系统表格也保护起来呢??经过研究发现一种行之有效的方法。
研究过CIH类RING0病毒的人都知道,在WIN9X下,不通过VXD而直接进入RING0层的方法主要有2种,
一是象CIH那样通过修改IDT的中断门进入RING0,还有就是通过在GDT,及LDT中生成调用门进入RING0,而NT下这些系统表格都被保护起来,而WIN9X下这些表格都是位于3级数据段中,而且是可以被RING3级程序读写的,所以在WIN9X下,可以任意进入RING0,当然我们也可以自己将这些表格保护起来。
众所周知在80X86下保护模式采用2级保护方式,即段级保护和页级保护,MICROSOFT开放了段级保护,那么我们可以从页级保护入手,通过将这些表格所在的物理页标记为READONLY,或SUPERVISIOR,达到保护的目的。以下的程序用MASM32V7编译,在WIN98下运行后,所有通过GDT,LDT的调用门,或IDT中断门进入RING0的程序都会产生一个EXCEPTION,由于直接杀入WIN9X内核,
所以那些专门针对WIN9X的内核工具,可能也无法运行,如TRW2000,所以可以先运行其,再运行保护程序。
.386p
.model flat, stdcall
option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
Call32 macro Selector,Offsetv
db 09ah
dd Offsetv
dw Selector
endm

; #########################################################################

.data
IdtAddressLinear dd ?
LdtAddressLinear dd ?
GdtAddressLinear dd ?
szText db 'Can not change to Ring0!',0
szCaption db 'Exception',0
SucText db 'System Table Protected OK!',0
SucCaption db 'Sucessfully',0
; #########################################################################

.code

GetLdtAddress proc
push ebx
sgdt [esp-2]
pop ebx
sldt ax
and eax,0fff8h
add ebx,eax
mov eax,[ebx+2]
and eax,0ffffffh
mov dl,[ebx+7]
shl edx,24
or eax,edx
ret
GetLdtAddress endp

GetGdtAddress proc
push eax
sgdt[esp-2]
pop eax
ret
GetGdtAddress endp

GetIdtAddress proc
push eax
sidt[esp-2]
pop eax
ret
GetIdtAddress endp

ToRing0Code proc Ring0Proc:DWORD ;在LDT的第0个描述符处生成调用门进入RING0
local Temp1,Temp2
call GetIdtAddress
mov IdtAddressLinear,eax
call GetGdtAddress
mov GdtAddressLinear,eax
call GetLdtAddress
mov LdtAddressLinear,eax
push [eax]
pop Temp1
push [eax+4]
pop Temp2
mov edx,Ring0Proc
mov [eax],dx
mov cx,28h
mov [eax+2],cx
mov cx,0ec00h
mov [eax+4],cx
shr edx,16
mov [eax+6],dx
push eax
Call32 7h,0
pop ebx
mov edx,Temp1
mov [ebx],edx
mov edx,Temp2
mov [ebx+4],edx
ret
ToRing0Code endp

SetSEHProc proc
invoke MessageBoxA,0,addr szText,addr szCaption,MB_OK ;SEH处理程序
invoke ExitProcess,-1
SetSEHProc endp

start:
assume fs:nothing 挂钩SEH,以便发生EXCEPTION时程序可以正常推出
lea eax,[esp-2*4]
xchg eax,fs:[0]
push offset SetSEHProc
push eax
push offset DisableAll
call ToRing0Code
invoke MessageBoxA,0,addr SucText,addr SucCaption,MB_OK
invoke ExitProcess,0

DisableAll proc
call IdtL2P ;保护IDT
call GdtL2P ;保护GDT
retf
DisableAll endp

P2L proc P2LAddress:DWORD
push P2LAddress
int 20h
dd 0001006ch ;VmmCall_MapPhysToLinear
add esp,4
ret
P2L endp

IdtL2P proc
mov eax,cr3
and eax,0fffff000h
push eax
call P2L
mov edx,IdtAddressLinear
shr edx,22
shl edx,2
mov eax,[eax+edx]
cmp eax,1
jz IdtExit
and eax,0fffff000h
push eax
call P2L
push eax
mov edx,IdtAddressLinear
shl edx,10
shr edx,22
shl edx,2
mov eax,[eax+edx]
cmp eax,1
jz IdtExit
pop ecx
and eax,0fffffffdh ;将IDT页属性改为只读
mov [ecx+edx],eax
and eax,0fffff000h
mov edx,IdtAddressLinear
and edx,00000fffh
or eax,edx ;返回其物理地址
IdtExit:
ret
IdtL2P endp

GdtL2P proc
mov eax,cr3
and eax,0fffff000h
push eax
call P2L
mov edx,GdtAddressLinear
shr edx,22
shl edx,2
mov eax,[eax+edx]
cmp eax,1
jz GdtExit
and eax,0fffff000h
push eax
call P2L
push eax
mov edx,GdtAddressLinear
shl edx,10
shr edx,22
shl edx,2
mov eax,[eax+edx]
cmp eax,1
jz GdtExit
pop ecx
and eax,0fffffffbh ;将GDT的页属性改为SUPERVISIOR
mov [ecx+edx],eax
and eax,0fffff000h
mov edx,GdtAddressLinear
and edx,00000fffh
or eax,edx
GdtExit:
ret
GdtL2P endp
end start
如果将LDT改为只读将影响正常运行系统的,而所有病毒即使想在LDT中生成调用门,也必须要获得LDTBASE,就需要访问GDT,由于将GDT设为SUPERVISIOR,故对于RING3程序是不可访问的,亦达到同样的效果。
...全文
199 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
roy_hu 2002-03-14
  • 打赏
  • 举报
回复
收藏之
cnrac 2002-03-13
  • 打赏
  • 举报
回复
请教楼上的兄弟不通过DRIVER怎么进入NT 0级?
xrenwu 2002-03-13
  • 打赏
  • 举报
回复
不错,收藏!
ZHLMNET 2002-03-11
  • 打赏
  • 举报
回复
GAO
qinzm 2002-03-11
  • 打赏
  • 举报
回复
没意思
nt照样可以不用driver进入ring0
真正的破坏性不在于ring0的问题
natureshuo 2002-03-10
  • 打赏
  • 举报
回复
get it
awinder 2002-03-10
  • 打赏
  • 举报
回复
试试

1,660

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧