首页
社区
课程
招聘
[原创]使用PsCreateSystemTread需要注意的地方
发表于: 2009-9-13 17:35 3392

[原创]使用PsCreateSystemTread需要注意的地方

2009-9-13 17:35
3392
我是个新手,俗称小菜
这两天在尝试着inline hook系统内核,遇到的问题比较多,不过现在要说的这个问题是这两天困扰我最大的一个!

看这篇帖子前建议菜鸟同学们先看一下我另两个帖子
http://bbs.pediy.com/showthread.php?t=97582
http://bbs.pediy.com/showthread.php?t=97613
这两个帖子里有我所遇到的情况,以及各路大牛们的热心解答,相信对菜鸟应该还是有一定作用的!

言规正传
看了上面两篇帖子的,应该清楚我使用的等待线程结束的方法,是设置一个事件,然后在主线程里通过等待事件激活,来判断线程结束而进行最终的驱动卸载的.
在此郑重声明,此方法存在重大问题,,即当时有位大牛已经提出来的, 如果事件被激活的瞬间,CPU进行线程调试,主线程抢先执行,驱动卸载后,再调度回应该结束的线程进行结束操作时,即会发生BSOD

代码:0000000CE   DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
微软的介绍:
a45K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2K6k6r3&6Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8W2)9J5k6s2g2K6i4K6u0r3L8r3W2T1M7X3q4J5P5g2)9J5c8X3#2K6y4K6V1%4x3e0t1&6i4K6u0W2j5i4y4H3P5l9`.`.

说是有IRP没有被取消, 菜菜我实在是不知道在哪个操作里进行过IRP的设置 经过两天的来回测试,终于发现,唯一可能是,驱动已经被卸就是线程调度到这里时,找不到相应代码.,所以产生了蓝屏.

然后尝试着在卸载时改成下面的写法:

    ntStatus = ObReferenceObjectByHandle(hThread, (ACCESS_MASK)THREAD_ALL_ACCESS, NULL, KernelMode, &pEthreead, NULL);
     ZwClose(hThread);
    ntStatus = KeWaitForSingleObject(pEthreead, Executive, KernelMode, TRUE, 0);
    UnHook();

再不停的安装卸载驱动,没有发生过线程未结束时被调度的现象,也没有再出过那该死的BSOD

写的很烂,只是一些小小的经验,别的版块不敢发了,实在太糗,,,,只好在新手版块来卖弄卖弄!!

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回