关键字:NT,Ring0,无驱。测试环境:Windows SP4,Windows XP SP2,Windows 未测试在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