首页
社区
课程
招聘
[求助]竹君兄弟帮忙看下 HOOK ZwTerminateProcess的问题
发表于: 2011-3-4 01:45 10764

[求助]竹君兄弟帮忙看下 HOOK ZwTerminateProcess的问题

2011-3-4 01:45
10764
在应用层写了一个对话框程序做测试。我发现了一些问题。
1.只有切换到任务管理器的进程列表去结束进程才会成功(也就是HOOK)
2.如果在任务管理的“应用程序”选项卡选择“结束任务”,那么系统会断下。
3.点击受保护进程的窗体的关闭按钮,会系统断下。

希望各位朋友能指点一下。
==========================================
上面时几天前我学习SSDT Hook遇到的问题,依旧十分迷惑。我尽量把问题描述清楚,好让大家弄懂我的意思。
==========================================
今天看了竹君兄弟的《详谈内核三步走Inline Hook实现》,感觉讲的很不错。于是我也照着上面的代码弄了一个Inline Hook ObReferenceObjectByHandle的代码,自己拿到虚拟机上测试了一下,发现了和本帖原来一样的问题(就是上面提到的SSDT Hook出现的问题)。

我的虚拟机环境是XP SP3,物理机用的WinDbg来调试的。

首先加载驱动,然后开一个记事本,进入任务管理器,点击“进程”选项卡,试图去结束记事本,很好,提示句柄无效,说明代码起作用了。

然后,我们切换到任务管理器的“应用程序”选项卡,选择结束记事本,这时,虚拟机端了,去WinDbg看看,提示一个异常,这里连续输入好几次g才使得虚拟机继续运行起来。


虽然虚拟运行了起来,但是记事本弹出一个错误对话框:

点击“关闭”,虚拟机又断了,WinDbg还是提示这哪个first chance的异常,继续连着输入好几个g,虚拟机又运行起来了,但是又弹出一个错误提示:

点确定,WinDbg又会重复前面的错误提示,重复输入g,虚拟机运行,记事本终于“关闭”了。但此时进程选项卡中还能看到“notepad.exe”,还被驱动保护着。

停止驱动,就可以把这个进程强制结束了。

如果上面不是在任务管理器的“应用程序”选项卡中结束记事本,而是直接关闭记事本,会出现同样的问题。实在是想不明白是哪里有问题,所以就直接改了下帖子,两个问题放一起了。
对于我前面的SSDT HOOK,问题是一样的。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 163
活跃值: (75)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
可以用WM_CLOSE 消息hook
2011-3-4 09:20
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
3
其实我只是不明白为什么用另外两种方式关闭程序时会出现问题。更正一下,其实不是崩溃。
如果在debug模式下并且连接到了windbg,那么windbg会提示一个“first chance”的东西。而如果在正常的模式下,应用程序会提示错误,而且在任务管理器中仍能看到进程的存在(虽然窗体已经没了)
2011-3-4 11:55
0
雪    币: 216
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不知道你驱动层的代码是怎么样的,但一般都是传递 pid 。。。
2011-3-4 15:59
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
5
你的昵称跟我以前用的一样的 就是比的pid。ZwTerminateProcess第一个参数HANDLE,通过这个得到PEPROCESS,然后得到PID。

我再研究研究,第一次搞这个。比如说进程自然关闭,是入口点函数返回了,这个应该不是terminateprocess了,但是也不应该弹出错误对话框啊,这样应该是正常结束才对。

我就是HOOK SSDT里面的ZwTerminateProcess,我的代码如下:
NTSTATUS newZwTerminateProcess(
			IN HANDLE ProcessHandle OPTIONAL,
			IN NTSTATUS ExitStatus
		)
{
	NTSTATUS status = STATUS_SUCCESS;
	PEPROCESS pEprocess = NULL;
	HANDLE processId;
	status = ObReferenceObjectByHandle(ProcessHandle,
			GENERIC_READ,
			NULL,
			KernelMode,
			&pEprocess,
			0);
	if (NT_SUCCESS(status))
	{
		processId = PsGetProcessId(pEprocess);
		if (processId == 1000) // 目标PID
		{
			ObDereferenceObject(pEprocess);
			return STATUS_ACCESS_DENIED;
		}
		else
		{
			ObDereferenceObject(pEprocess);
			return oldZwTerminateProcess(ProcessHandle, ExitStatus);		
		}
	}
	return status;
}
2011-3-4 16:12
0
雪    币: 216
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
还是没太懂你的意思,结束进程都是用需要结束进程的PID来结束啊。你在应用程序选项卡里结束是什么意思?
2011-3-5 16:54
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
7
各位朋友帮忙看下,感激不尽
2011-3-7 16:25
0
雪    币: 677
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
程序自然结束最后也是要调用ZwTerminateProcess退出
2011-3-7 17:38
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
没明白 啥问题啊?
2011-3-7 22:39
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
http://bbs.pediy.com/showthread.php?t=113285你参考下
2011-3-7 22:46
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
自身结束的时候要排除一下
2011-3-7 22:56
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
loqich 自身结束的时候要排除一下
怎么解决当进程访问一个特定的文件时就调用ZwTerminateProcess  去杀死进程,然后就会卡死的问题呀?
2018-6-7 19:14
0
游客
登录 | 注册 方可回帖
返回
//