关键字:NT,Ring0,无驱。测试环境:Windows 2000 SP4,Windows XP SP2,Windows 2003 未测试在NT下无驱进入Ring0是一个老生常谈的方法了,网上也有一些C代码的例子,我之所以用汇编重写是因为上次在 [原创/探讨]Windows 核心编程研究系列之一(改变进程 PTE) 的帖子中自己没有实验成功(其实已经成功了,只是自己太马虎,竟然还不知道 -_-b),顺面聊聊PM(保护模式)中的调用门的使用情况。鉴于这些都是可以作为基本功来了解的知识点,所以对此已经熟悉的朋友就可以略过不看了,当然由于本人水平有限,各位前来“挑挑刺”也是非常欢迎的,呵呵。 下面言归正传,我们知道在NT中进入Ring0的一般方法是通过驱动,我的Windows 核心编程研究系列 文章前两篇都使用了 这个方法进入Ring0 完成特定功能。现在我们还可以通过在Ring3下直接写物理内存的方法来进入Ring0,其主要步骤是:0 以写权限打开物理内存对象; 1 取得 系统 GDT 地址,并转换成物理地址; 2 构造一个调用门; 3 寻找 GDT 中空闲的位置,将 CallGate 植入; 4 Call植入的调用门。 前面已打通主要关节,现在进一步看看细节问题: [零] 默认只有 System 用户有写物理内存的权限 administrators 组的用户只有读的权限,但是通过修改用户安全对象中的DACL 可以增加写的权限: Copy code _SetPhyMemDACLs proc uses ebx edi esi \ _hPhymem:HANDLE,\ _ptusrname:dword local @dwret:dword local @htoken:HANDLE local @hprocess:HANDLE local @个local @OldDACLs:PACLlocal @SecurityDescriptor:PSECURITY_DESCRIPTOR local @Access:EXPLICIT_ACCESS mov @dwret,FALSE invoke RtlZeroMemory,addr @NewDACLs,sizeof @NewDACLs invoke RtlZeroMemory,addr @SecurityDescriptor,\ sizeof @SecurityDescriptor invoke GetSecurityInfo,_hPhymem,SE_KERNEL_OBJECT,\ DACL_SECURITY_INFORMATION,NULL,NULL,\ addr @OldDACLs,NULL,\ addr @SecurityDescriptor .if eax != ERROR_SUCCESS jmp SAFE_RET .endif invoke RtlZeroMemory,addr @Access,sizeof @Access mov @Access.grfAccessPermissions,SECTION_ALL_ACCESS mov @Access.grfAccessMode,GRANT_ACCESS mov @Access.grfInheritance,NO_INHERITANCE mov @Access.stTRUSTEE.MultipleTrusteeOperation,\ NO_MULTIPLE_TRUSTEE mov @Access.stTRUSTEE.TrusteeForm,TRUSTEE_IS_NAME mov @Access.stTRUSTEE.TrusteeType,TRUSTEE_IS_USER push _ptusrname pop @Access.stTRUSTEE.ptstrName invoke GetCurrentProcess mov @hprocess,eax invoke OpenProcessToken,@hprocess,TOKEN_ALL_ACCESS,\ addr @htoken invoke SetEntriesInAcl,1,addr @Access,\ @OldDACLs,addr @NewDACLs .if eax != ERROR_SUCCESS jmp SAFE_RET .endif invoke SetSecurityInfo,_hPhymem,SE_KERNEL_OBJECT,\ DACL_SECURITY_INFORMATION,NULL,NULL,\ @NewDACLs,NULL .if eax != ERROR_SUCCESS jmp SAFE_RET .endif mov @dwret,TRUE SAFE_RET: .if @NewDACLs != NULL invoke LocalFree,@NewDACLs mov @NewDACLs,NULL .endif .if @SecurityDescriptor != NULL invoke LocalFree,@SecurityDescriptor