论坛: 菜鸟乐园 标题: “黑洞2000”关闭天网防火墙 复制本贴地址    
作者: 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号