| 引用: |
【loveperday的贴子】========Content======== 其实猫叔,我的疑问是: 咱们平时启动程序,关闭程序,程序的执行者不都是explorer么?那么“用户关闭程序”不就是应该explorer结束程序么? 规则中的“强迫”应该如何理解呢?我们观察病毒时,病毒试图结束杀软进程,那他的执行者有可能是explorer么? ……………… |
关闭一个程序窗口时系统是怎么做的,其实那个提示已经告诉你了:
动作:禁止
应用程序:explorer.exe
访问:Forced process/thread termination
目标:SendNotifyMessageA(Message=WM_CLOSE,Handle=0xC03EC)
时间:2007-5-28 20:43:36
一般来说,要关闭其他程序窗口的程序,用SendMessage函数来向目标窗口发送WM_CLOSE消息(这需要目标窗口的句柄(Handle),这个句柄可以用FindWindow等函数得到)。Windows将此消息放到目标进程的消息队列之中,由目标进程的窗口过程(这个窗口过程,是在目标进程用CreateWindowEx创建窗口时,由其使用的WNDCLASSEX结构的lpfnWndProc字段所指定的),窗口过程内部用GetMessage得到消息,并根据自己的代码来处理消息。对于一般的程序窗口,WM_CLOSE消息就是一个关闭窗口程序的消息,所以窗口过程在接到这个消息之后一般就会进行关闭程序的一系列操作。这样一个程序就结束了。
在任务管理器中的结束进程,则是采用另一种方式:用OpenProcess(带参数PROCESS_TERMINATE)得到进程句柄,然后以此进程句柄作为参数,调用TerminateProcess来强制结束进程。
对于以服务启动的程序,则还有其他的方法,如猫叔所说用net.exe,这是一种命令行调用方式,而net.exe程序其实也是调用各种处理服务的API对系统当前的服务进行处理。
HIPS软件对这些操作进行监视和处理的方法(纯属我猜测,实际可能更复杂):
对于使用WM_CLOSE消息的方式:用SetWindowsHookEx函数,建立一个钩子,钩子类型为WH_CALLWNDPROC(每当调用SendMessage函数时,函数将消息发送给目标窗口过程前首先调用钩子函数)。这样钩子的目标窗口过程所收到的消息,在收到前都要先经过这个钩子函数的处理。钩子函数根据HIPS软件设置,决定是将WM_CLOSE消息丢弃不传给目标窗口过程(这样目标窗口过程不收到消息,自然不会关闭),还是如常传递(这样目标窗口过程如常关闭)。
对于使用TerminateProcess的方法:HIPS软件通过驱动进入系统底层,用修改SSDT表等方式实现对TerminateProcess对应的NATIVE API的HOOK,这样当有程序调用TerminateProcess的时候,实际上首先调用的是HIPS软件的相关程序,HIPS软件依据设置,决定是如常再调用真正的相应系统函数来结束进程呢,还是直接阻止这个操作并返回一个错误。
HIPS软件的监控,实际上就是通过各种各样的HOOK,在系统处理消息之前先截获它们,然后根据软件设置决定如何处理,再继续传递给系统进行工作。就像寄信要通过邮局,邮局检查所寄信函是否符合规范,如无问题,传递给收信人,如有问题,扣在邮局并通知寄信人或收信人(返回一个错误)。
以上是我了解到的一些情况,不一定全对。如果对这方面的内容不太了解,可以去看有关Windows编程的书,了解Win32 API的作用。当然,不一定非这样不可,就算不了解这些,依靠一些软件提供的功能,你依然可以轻松设置并处理一些问题。