|
作者: lulumy [lulumy] 论坛用户 | 登录 |
“黑洞”这个看似很神奇的功能,只不过是用了一个API函数PostMessage(窗口句柄,WM_Quit,0,0)而已。 在Windows系统中,每个可执行文件在运行时不仅有进程ID,还存在一个窗口名。一般来说,如果一个程序运行时在任务栏有个图标,你把鼠标移动到那里出现的提示就是该程序的窗口名。即使程序是隐藏运行,它的窗口名还是存在的,只不过你看不见而已。我们只要找到一个程序的窗口句柄,然后发送一个消息WM_Quit给它就会把它无条件关闭了。那么如何找到那个叫“句柄”的东西呢?Windows提供了一个API函数FindWindow来通过窗口名返回窗口句柄。比如说你想查找一个窗口名为“有害软件”的句柄,则可以用以下语句: Var Exehandle:Thandle; Begin ExeHandle:=FindWindow(Nil,'有害软件'); if ExeHandle <> 0 then Showmessage('找到该软件,句柄为'+InttoStr(Exehandle)); end; 现在问题简单了吧。只要看看系统现在运行的所有窗口名称,然后和我们需要关闭的作比较,如果条件符合的就Kill了它。查找当前系统运行的所有窗口名称可以通过递归实现。我们可以写出下面的一个函数。 Function My_RefreshForm(MyStringList:TStringList):Boolean; Var hCurrentWindow:HWnd; szText:array[0..254] of char; begin MyStringList.Clear; hCurrentWindow:=GetWindow(application.Handle,GW_HWNDFIRST); while hCurrentWindow <> 0 do begin if GetWindowText(hCurrentWindow,@szText,255) > 0 then MyStringList.Add(StrPas(@szText)); hCurrentWindow:=GetWindow(hCurrentWindow,GW_HWNDNEXT); end; Result:=true; end; 我们来试试调用这个函数看看。运行Delphi新建一个工程,放上一个ListBox控件和一个按钮Button1,在它的OnClick事件写代码: procedure TForm1.Button1Click(Sender:TObject); Var FormStrings:TStringList; begin FormStrings:=TStringList.Create; My_RefreshForm(FormStrings); ListBox1.Items:=FormStrings; FormStrings.Free; end; 然后运行这个程序,点击Button1就会在ListBox1列出系统现在的所有窗口名。你会发现有一些很奇怪的操作系统本身运行的程序――但是你自己在Windows任务列表中却看不到它。有了上面这两个函数,我们就可以叫它Quit了。我们再来写个函数吧: Procedure My_KillForm(S:String); Var Exehandle:Thandle; begin ExeHandle:=FindWindow(nil,Pchar(S)); if ExeHandle <> 0 then PostMessage(ExeHandle,WM_Quit,0,0); end; 我们在程序中要杀死那个“有害软件”,那么可以先用My_RefreshForm函数列出所有窗口名称,然后一个一个和“有害软件”这个窗口名作比较,如果条件符合就使用My_KillForm('有害软件')把它给关了。至于象“黑洞2001”那样做到“模糊设置”,相信大家很快就可以写出来,这里就不再多讲了 |
地主 发表时间: 09/21 11:47 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号