拦截进程创建(不会卡死桌面)
菜鸟作品,大牛请无视。如有错误或纰漏,望指出
之前看过很多关于进程创建的拦截,都是勾在NtCreateProcess或者NtCreateSection上,拦截到的往往都是Explorer进程中的线程,此时如果将线程卡在内核中,就会导致桌面卡死。这不是我想要的。
百度GOOGLE了好久,没找到类似的解决办法,逆又逆不出来,就只有自己翻书动脑子了(不知道各大安全卫士是怎么实现的
)。
既然不能卡死Explorer的线程,那咱就卡别人去,卡谁?我想你已经知道了被创建者的主线程
相关知识:
每一个线程都是从内核空间的KiThreadStartup开始运行的,线程在被创建的时候就指定了它在系统空间的上下文以及返回用户空间的自陷框架。在KiThreadStartup中,线程将运行级别降低至APC_LEVEL后调用PspUserThreadStartup(如果是系统线程,这里调用的是PspSystemThreadStartup),PspUserThreadStartup将用户空间ntdll.dll中的函数LdrInitializeThunk作为APC函数挂入APC队列。当线程返回用户空间时,就会检测到APC函数的存在,并先加以执行,直到APC队列中不再有请求时才算正式回到用户空间。
回到用户空间的什么地方呢?这要看线程被创建的时候设定的自陷框架了。如果是主线程,则回到BaseProcessStartup,非主线程则是BaseThreadStartup。至于用户空间给定的线程入口(如主线程的OEP),则存放在寄存器EAX中,作为参数调用BaseProcessStartup或者BaseThreadStartup,再由这二者之一将其放在一个SEH保护域中加以调用。
实现:
如果上面看晕了,没关系,只需知道每个线程都是在KiThreadStartup中开始运行的,如果是用户线程,则会调用PspUserThreadStartup。注意此时的IRQL为APC_LEVEL。
而我选择的挂钩地点就是PspUserThreadStartup。E9跳转需要5个字节,我选择在PspUserThreadStartup+2的位置JMP,即
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
