阅读:2451回复:7
如何在驱动中IRQL = 2修改用户进程的线程的EIP
存放EIP的KTRAP_FEAME结构,无论是ETHREAD->TrapFrame还是ETHREAD->InitialStack-0x29c都处于缺页状态,调用ZwGetContextThread这种用APC机制的函数也无法成功,返回ACCESS_VIOLANT,我把IRQL降到了0也不行。。。连读都不行,别说修改了。。。
修改的线程是LSASS.EXE中的某个线程,非系统线程,被阻塞前的EIP是用户空间地址,一般该地址是某个系统调用的ret 0xXX指令。 这个问题困扰我很久了,有能帮回答的高手实在感激不尽 |
|
沙发#
发布于:2004-10-08 18:58
注:前面说的缺页的都是要修改的线程,ETHREAD也是该线程的
|
|
板凳#
发布于:2004-10-08 22:07
你是如何把IRQL降低到0的?用workitem?还是单独开了一个系统线程?或是什么别的方法?
我也遇到过类似问题,但我就没能把IRQL降到0。 还望指点一二,谢谢! |
|
|
地板#
发布于:2004-10-09 04:36
To Sephiroth,
为什么要改返回地址? 如果能够给出你的目的,应该会有更好的方法。 你好象在另外一个进程中访问LSASS.EXE,会有不同的页目录基址(CR3).而且在IRQL>=2时不能有PageFault。 To shuangsy, 不要手工改,最好用DPC或者WorkerItem/System Thread.是来处理不能在高IRQL时做的事情。但是,那已经是不同的context了。 |
|
地下室#
发布于:2004-10-09 10:24
楼上的可能误解我意思了,我是要修改该线程的EIP,使它下次恢复执行时从我指定的EIP开始执行(当然,是在该进程空间内的地址)。CR3是可以手动转换的,将该进程的CR3修改CR3寄存器和任务段里的CR3(这个好象不改也行),就可以打开该进程地址空间。因为页错误会导致磁盘I/O导致环境切换,所以当然不能发生在IRQL = 2上,但我奇怪为啥IRQL = 0时也不行。
不知哪位高手有变通的方法,还望不吝赐教:) PS:我说的要修改EIP是发生在IRQL = 2时。楼上说的PsCreateSystemThread也只能在IRQL = 0时调用,所以当然得手动降IRQL,但是得确定不会导致其它错误的前提上。 [编辑 - 10/9/04 by Sephiroth] [编辑 - 10/9/04 by Sephiroth] |
|
5楼#
发布于:2004-10-10 22:51
看了两天的WINDOWS源代码,终于自己解决了,结贴,感谢回复的朋友:)
|
|
6楼#
发布于:2004-10-13 23:42
Could you please post your solution? So we can learn from you.
|
|
7楼#
发布于:2004-10-14 15:53
看了两天的WINDOWS源代码,终于自己解决了,结贴,感谢回复的朋友:) 你是如何解决的??? |
|
|