如何阻止《任务管理器》结束我的进程呀??
一个进程被结束前会收到什么消息吗?
一个进程被结束前会收到什么消息吗?
解决方案 »
- 关于with ... do 的问题?
- C/S结构数据库程序问题?
- 小弟想学Delphi请这里的老大们推荐些书。
- 在EDIT中按下上下光标键,怎样怎样触发一个过程或函数?
- 求For delphi5 或delphi6光盘中的InstallShield Express
- 希望大家推荐几本DELPHI入门书籍 谢谢
- 关于PACKAGE和DLL,在撰写大型数据库程序时应该选择那一种,我需要源代码
- 如何删除ini文件中的某一字段?
- (沈阳)沈阳的程序员和未来的程序员.大家都想知道程的序员待遇问题:薪水、工作性质。我们都在同一战壕上,面对老板我们心里应该有个数,想吹牛的朋友请您忍一忍。
- 请问DELPHI中是否有类似Powerpoint效果预览的控件
- query控件匹配问题!!急啊!
- 用QReport打印,DataSet属性如何赋值?我用的是DAO
HANDLE hProcess; // 将被结束进程的句柄
UINT uExitCode; // 指定进程的退出码
); 看到这里,是不是觉得不必往下看都知道接下来要做什么:Hook TerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。真的是这么简单吗?先提出一个问题,如何根据hProcess判断它是否是我的进程的句柄?答案是:在我的进程当中先获得我的进程的句柄,然后通过进程间通讯机制传递给钩子函数,与hProcess进行比较不就行了?错!因为句柄是一个进程相关的值,不同进程中得到的我的进程的句柄的值在进程间进行比较是无意义的。 怎么办?我们来考察一下我的hProcess它是如何得到的。一个进程只有它的进程ID是独一无二的,操作系统通过进程ID来标识一个进程,当某个程序要对这个进程进行访问的话,它首先得用OpenProcess这个函数并传入要访问的进程ID来获得进程的句柄,来看看它的参数:HANDLE OpenProcess(
DWORD dwDesiredAccess, // 希望获得的访问权限
BOOL bInheritHandle, // 指明是否希望所获得的句柄可以继承
DWORD dwProcessId // 要访问的进程ID
); 脉络渐渐显现:在调用TerminateProcess()之前,必先调用OpenProcess(),而OpenProcess()的参数表中的dwProcessId是在系统范围内唯一确定的。得出结论:要Hook的函数不是TerminateProcess()而是OpenProcess(),在每次调用OpenProcess()的时候,我们先检查dwProcessId是否为我的进程的ID(利用进程间通讯机制),如果是的话就简单地返回一个错误码就可以了,任务管理器拿不到我的进程的句柄,它如何结束我的进程呢? 至此,疑团全部揭开了。由Hook TerminateProcess()到Hook OpenProcess()的这个过程,体现了一个逆向思维的思想。其实我当初钻进了TerminateProcess()的死胡同里半天出也不来,但最终还是蹦出了灵感的火花,注意力转移到了OpenProcess()上面,实现了进程防杀。