扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
push eax ; push 0
push dword ptr [edi+4] ; system arg
push dword ptr [edi+8] ; system arg
push esi ; APC object
call dword ptr _keinsertqueueapc
最后一个函数是KeInsertQueueApc用来发送APC。在上面的代码中,EAX为0,而且两个系统参数也是指向空地址的指针,当然也传递了先前由KeInitializeApc返回的APC对象。
最后,为了防止我们的刚初始化的负载线程返回并出现蓝屏,把0X80000000:00000000传递给KeDelayExecutionThread,让线程睡眠。
push offset LARGE_INT
push FALSE
push KernelMode
call dword ptr _kedelayexecutionthread
如果在偶然的情况下,我们进入了“Idle”地址空间,那么这个调用就会失败。解决这个问题的方法是放弃执行该线城,然后继续循环.代码片段如下:
@yield_loop:
call dword ptr _keyieldexecution
jmp @yield_loop
万幸,用户模式线程应该还在你所选择的SYSTEM进程中安全的执行。如果完成APC函数后调用ExitThread来退出用户代码,那么系统很可能还是稳定的。
The ICMP Patching Interrupt Hooking Key-Logger
当我和来自eEye的Derek Soeder闲聊的时候,我们讨论了哪些是完全由内核级内代码组成的有用的shell code。其中的一个想法是内核级key-logger,它可以返回键盘缓冲区到远程线程。显然,这是一个shell code,创建一个完整的键盘过滤器和通信管道可能会大大超出可以接受的代码长度范围,所以采取捷径是必须的。
我们采用源于DOS时代的技术,把键盘中断处理程序入口替换为自己的代码入口来捕获扫描码,而不是绑定键盘过滤器来捕获键盘消息。我决定修改TCPIP.SYS驱动程序的ICMP处理体,而不是通过自己创建管道返回键盘消息到远程用户。补丁程序修改了ICMP ECHO处理体,用我们自己的键盘缓冲区来替换原来的缓冲区。发送一个ICMP ECHO请求到远程系统将会返回所捕获的按键情况。
第一步,把键盘处理体的IDT入口替换为我们自己中断处理体的入口。现在,Windows XP 和 2000 SP4有存储在HAL内存区域的IRQ中断向量表。我们可以很方便的搜索临近的标志字节,并且查询对应于IRQ1(键盘IRQ)的中断向量。在早期的服务包中,例如Window 2000 SP0,这个表是不存在的,然而中断向量表是静止的,RQ1 = Vector 0x31, IRQ2 = Vector 0x32等等。下面的代码首先尝试定位向量表,如果定位失败的话就会直接使用中断向量0X31。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。