200分!关于防止一个进程被杀的问题。 (200分)

  • 主题发起人 Coolcfan
  • 开始时间
C

Coolcfan

Unregistered / Unconfirmed
GUEST, unregistred user!
这是原来那个讨论WM_CLOSE的帖子。谢谢大家的帮助,但现在有了新问题。<br>现在的问题是让受保护的进程用任何方法都杀不掉。防止WM_CLOSE我已经知道了,<br>但是还有一些很变态的函数,比如TerminateProcess,如何防止?除了服务之外就<br>没有其他方法?那么拒绝访问的进程是怎么回事?<br>欢迎讨论除了SendMessage:WM_CLOSE之外的所有关闭、杀死进程的函数的预防措施。<br><br>每一种,如果很长就发E-Mail给我:coolcfan@sina.com
 
用 WindowHook :<br>&nbsp; SetWindowsHookEx(WH_GETMESSAGE, MsgFilter, g_hInstance, NULL);<br>在 MsgFilter 中分析窗口句柄是否是记事本,然后判断消息是否是 WM_CLOSE<br>如果是,则修改消息为 WM_NULL。<br><br>在 http://www.delphibbs.com/delphibbs/dispq.asp?lid=2414531 有一个例子。
 
HOOK是程序员的必修课啊
 
谢谢!但是我在这个论坛曾经见过一个帖子,楼主说他用<br>HOOK拦截PostMessage的消息不成功,他拦的是WM_CHAR,<br>WM_CLOSE如果用PostMessage来发是不是也有这种问题呢?<br><br>在这里献给savetime 50分
 
I'm sorry,savetime那50分没发出去。。。<br>
 
savetime,你的那个是C语言代码,我最不懂得就是C语言!!!!!!
 
你说的问题是: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2476431<br>我曾在该贴 POST 一段:<br>从原理上说,只要是使用 WH_GETMESSAGE 就可以修改使用 GetMessage 和 PeekMessage<br>的消息,对于直接使用 CallWindowProc 的是改不了的。<br>------------------------------------------------------------------<br>WM_CLOSE 确实在多数情况下是非进队消息,但是如果 DefWindowProc 是用<br>SendMessage 发送的 WM_CLOSE 那应该是可以拦住的。<br><br>C 的代码看不懂,我也没办法,可以找原贴楼主要一份,他说已经改成 DELPHI 的了。
 
如果要百分之百拦截呢?<br>比如如果我对记事本进行保护,那么除非将我的拦截程序关掉,否则谁也<br>关不掉记事本,不论是有杀进程功能的木马、任务管理器或者其他杀进程<br>软件都不行!!!!!!!!!!!!!!!!!!!!!!!!!!!<br>是不是要“分类讨论思想”?<br><br>只要能达到以上目的,我这200分就给谁!!!!!<br>请贴出比较详细的代码。
 
进程插入技术呢
 
杀进程和拦截 WM_CLOSE 差别大了。<br>WM_CLOSE 只是窗口/线程级别的东东,进程都能杀掉,窗口消息几乎失效了。
 
下邊2個函數就可以:<br>GetWindowLong(hWnd, GWL_WNDPROC)<br>SetWindowLong(hWnd, GWL_WNDPROC, @Proc)
 
Terminateprocess这个函数就是用来杀进程的。<br>要阻止它杀掉我们保护的进程,用上面的函数可以吗?<br>另外,如果要同时对多个进程进行保护,应该怎么办?<br>我认为用Findwindow找进程是不行的;应该用文件名来<br>找进程,就是Snapshot内存然后。。。但这又有一个路<br>径问题。
 
&gt;&gt;来自:savetime, 时间:2004-3-10 13:00:25, ID:2495337 <br>&gt;&gt;杀进程和拦截 WM_CLOSE 差别大了。<br>&gt;&gt;WM_CLOSE 只是窗口/线程级别的东东,进程都能杀掉,窗口消息几乎失效了。<br>就是嘛,我说我怎么成功拦截了自身的WM_CLOSE却还会被杀掉。<br>很多木马是不是用Terminateprocess函数呢?
 
别老hook了,累人啊!
 
var<br>&nbsp; OldProc : Pointer = nil;<br><br>function NewProc(hWnd: HWND; Msg: UINT;<br>&nbsp; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;<br>begin<br>&nbsp; Case Msg of<br>&nbsp; &nbsp; WM_CLOSE:ShowMessage('Close');<br>&nbsp; end;<br>&nbsp; Result := CallWindowProc(OldProc, hWnd, Msg, wParam, lParam);<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; OldProc := Pointer(GetWindowLong(Handle, GWL_WNDPROC));<br>&nbsp; if Assigned(@OldProc) then<br>&nbsp; &nbsp; SetWindowLong(Handle, GWL_WNDPROC, Integer(@NewProc));<br>end;
 
:amli,补充<br>&nbsp; &nbsp;在退出时,要调用SetWindowLong(Handle, GWL_WNDPROC, Integer(@OldProc));<br>&nbsp; &nbsp;还原,<br>&nbsp; &nbsp;<br>
 
to ranksun:<br>不需要这样.<br>OldProc有生存期.
 
这样用 TerminateProcess 就不能关闭了么?
 
顶部