扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
我们把NonPagedPool作为参数传递给ExAllocatePool,然后把shell code拷贝到non-paged区域,再简单的执行一个JMP指令来到这个内存区域。现在所有的代码都可以安全的执行而不会再受到影响。
当注入驱动程序时,我们必须意识到当前的IRQL。IRQL是一个指定内核程序当前的硬件优先级,很多内核程序为了能成功执行会请求IRQL的PASSIVE (0) 。如果运行在DISPATCH (2)级(用于程序调度和延迟过程调用) ,必须把IRQL下降到PASSIVE. 这只是一件简单的事情,只需要调用HAL的导出函数KeLowerIrql并且把0(PASSIVE)做为参数。
现在我们需要把用户域代码绑定到进程,就必须先得到EPROCESS结构的指针,每一个进程都有一个对应的EPROCESS结构。关于这篇文章所有结构的更多信息都可以在WinDbg中通过dump结构体取得(例如: dt NT!_EPROCESS)。我们将要使用的函数需要EPROCESS的偏移地址,如果可以得到指向所有EPROCESS结构的指针,那么可以通过遍历所有结构来得到当前的所有活动进程。
一般情况下,可以通过调用PsGetCurrentProcess来得到第一个EPROCESS结构。不幸的是,当注入一个远程驱动程序的时候,我们可能注入到一个处于“等待”状态的进程中,这个“等待”进程不会返回一个有效进程控制块。我用PsLookupProcessByProcessId来替换,并且把“system”进程的PID作为参数。在Windows XP中这个值为4,而在Windows 2000中这个值为8。
lea ebp, [edi-4]
push ebp
push 04
call dword ptr _pslookupprocessbyprocessid ;取得系统EPROCESS
mov eax, [ebp] ; 取得系统EPROCESS结构指针
取得了第一个EPROCESS结构,现在我们就可以访问当前所有活动进程。虽然我选择把代码注入LSASS地址空间,但所有正在运行的系统进程都是合适的目标。为了访问LSASS,采用循环方式枚举EPROCESS+ActiveProcessLinks所指向的每一个入口地址并且与LSASS模块名相比较。
mov cl, EP_ActiveProcessLinks ; offset to ActiveProcessLinks
add eax, ecx ; get address of EPROCESS+ActiveProcessLinks
@eproc_loop:
mov eax, [eax] ; get next EPROCESS struct
mov cl, EP_ModuleName
cmp dword ptr [eax+ecx], "sasl" ; is it LSASS?
jnz @eproc_loop
一旦定位LSASS进程,就可以通过减去ActiveProcessLinks偏移值,从而得到LSASS与第一个EPROCESS结构的偏移值。
下一步就是把shell code拷贝到目标内存空间。起先我打算把代码存放在PEB;以前,PEB总是被映射到0x7ffdf000,但在XP SP2中PEB的映射地址是随机的。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。