华怡青越剧专辑断肠人:任意Ring3进程User APC插入

来源:百度文库 编辑:中财网 时间:2024/05/05 12:38:58
任意Ring3进程User APC插入-关于APC的一个新发现2007年06月10日 星期日 11:19

作者:kruglinski(kruglinski_at_sohu_dot_com)
出处:http://hi.baidu.com/kruglinski
时间:2007.06.10

也许不算什么新东西,但对我来说是新发现。

本来使用APC机制来实现Ring0 call Ring3要枚举系统中的ring3线程,找到一个可警告等待状态的来插。

前天实验了一下,先用一个内核APC劫持一个Ring3进程的一个非可警告等待状态的线程,然后在这个内核模式APC中(也就是在这个进程的这个线程上下文中)硬给它插一个UserMode APC,相关的参数也是映射到这个进程的用户态地址空间,然后使用KeDelayExecutionThread进行一次UserMode和Alertable的调用,我设置成0x7fffffffffffffff(根据SleepEx(INFINITE)调用得到的这个值,但KeDelayExecutionThread调用会立即返回STATUS_ALERTED,因为当前的内核APC还没有运行完,所以CPU的IRQL在APC_LEVEL,当这个内核APC一返回后,IRQL将下来了,UserMode APC会在PASSIVE_LEVEL被运行,我就用上次写的那个ShellCode试了一下,可以在2000系统中弹出一个记事本。

这样做的意义就是可以对任意一个Ring3进程插入UserMode APC让它运行,不需要它原有线程是否是可警告等待状态,而且不需要经过"授权",是不是可以考虑用这样的方法,在一个可以通过防火墙规则的进程中运行一段代码,来实现一些特殊的功能!!!

有一个需要注意的地方就是KeDelayExecutionThread,在DDK文档上写到"Callers of KeDelayExecutionThread must be running at IRQL = PASSIVE_LEVEL",然后我在内核APC中将IRQL硬降下来,然后调用KeDelayExecutionThread,等它返回STATUS_ALERTED后再将IRQL提升回去是可以的,本来我认为APC Dispatcher在调用APC例程时会请求自旋锁之类的东西,这样一降就可能会引发未知的问题而蓝屏,可实际上并没有。

最Cool的发现是KeDelayExecutionThread直接在APC_LEVEL运行也行(不知道在多核系统中会有什么我没有发现的问题???),如果没有什么问题,这应该是最通用的一种方法了,因为只使用了通用的未公开函数,而没有使用未公开数据结构。

参考资料:

1. 《DriverWorks Online Help》-Mapping a System Buffer to User Space

2. 《ReactOS源代码》

3. 《Windows Internals》