谈"黑洞2001"杀防火墙的实现与对策pc软件 文章资讯 手机软件

您当前的位置→图文中心安全防范谈"黑洞2001"杀防火墙的实现与对策

谈"黑洞2001"杀防火墙的实现与对策


2009/2/15  编辑:佚名 来源:本站整理  关键词:

谈"黑洞2001"杀防火墙的实现与对策

 

谈"黑洞2001"杀防火墙的实现与对策
"黑洞2001"是今年1月份推出的国产远程管理必备工具,相对其它远程管理必备工具,它添加了个很有吸引力的功能:进程管家.它有什么用呢?就在这里引述一下吴建蓉的论述:"多进程监控功能是干什么用的呢?本来随着大家安全意识的会一直不断提高, 大多数人都安装了防火墙, 木马们的生存空间越来越小, 为生存计, 木马开发者想出了一个办法, 他让木马服务端定时刷新进程, 如果发现其中的进程名称与其事先定义好的相符合, 就将这个进程关闭, 如果这个被关闭的进程恰巧就是防火墙, 那您的网络net大门就完全敞开了, 监控端就可为所欲为了。 事实上这个功能就是针对防火墙出现的, 一切堡垒都是从内部被攻破的就在此得到了充分的体现。 其实就在黑洞2000中就有了这样的功能, 只不过黑洞2000只能关闭天网防火墙, 对其它防火墙没有任意一个作用。 黑洞2001则可以能够欲定义长达99个英文字符号, 完全可以能够将您有可能会用到的防火墙都定义到其中, 从而可将这些防火墙全部关闭!"(原文见http://www.yesky.com/20010719/189602.shtml)现就在有些木马也具有这个功能了,但是"黑洞"是第一个最先是提出和实现这一功能的软件.
  实际上,作者当初添加这个功能是为了方便监控一些有害的软件.大家可以能够就在服务端默认的配置看出来,它以前是监控"有害软件,黄色软件"的.不过后来被人误用了而已.
  俗话说:"假传万卷书,真传一句话".看起来最复杂最强大的东西,它的原理往往却是最不复杂的.爱因思坦的质能方程式也只不过是不复杂的E=MC2.其实"黑洞"这个看似很神奇的功能,只不过是用了一个API函数PostMessage(窗口句柄, WM_Quit, 0, 0);而已.
  就在Windows系统system中,每个可执行文件程序就在运行时不只有进程ID,还存就在一个窗口名.一般来说,如果一个程序运行时就在任务栏有个图标,您把鼠标移动到那里出现的提示就是该程序的窗口名.即便程序是隐藏运行,它的窗口名还是存就在的,只不过您看不见而已.我们我自己只要去寻找到一个程序的窗口句柄,之后发送send一个消息WM_Quit给它就一定会把它无条件关闭了.那么怎么才能去寻找到那个叫"句柄"的东西呢?Windows提供了一个API函数FindWindow来可以通过窗口名返回窗口句柄.比如说您想查找一个窗口名为"有害软件"的句柄,则可以能够用以下语句:
Var
Exehandle: Thandle;
begin
ExeHandle := FindWindow(Nil, '有害软件');
if ExeHandle <> 0 then Showmessage('去寻找到该软件,句柄为'+InttoStr(Exehandle));
end;
  现就在问题不复杂了吧.只要看看系统system现就在运行的所有窗口名称,之后和我们我自己有请求需要关闭的作比较,如果条件符合的就Kill了它.查找当前系统system运行的所有窗口名称可以能够可以通过递归实现.我们我自己可以能够写出下面的一个函数.
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列出系统system现就在的所有窗口名.您会发现有一些很奇怪的操作系统system本身运行的程序---但是您我自己就在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"那样做到"模糊布置设置",相信大家很快就可以能够写出来,这里就不会再多讲了.
  知道了它的原理后,那么我们我自己怎么才能来防范它呢?比如说我的软件是个杀毒防火墙,怎么才能不让它给Kill了呢?一个程序如果没有窗口名不就可以能够了吗?呵呵,问题是Windows不让您那么做.比如说Delphi做的程序窗口名就是Application的Title,如果您不布置设置它那么Windows系统system就一定会把该程序主窗口的标题当作该程序的窗口名.其实,我们我自己可以能够这样:就是定时随机改变我自己的窗口名,这样一来它确定不了您的窗口名就那您没辙了:)
Procedure RandomChangeTitle;
begin
Application.Title := Chr(Random(25)+65)+Chr(Random(25)+65)+Chr(Random(25)+65)
+Chr(Random(25)+65)+Chr(Random(25)+65)+Chr(Random(25)+65);
Application.name := Chr(Random(25)+65)+Chr(Random(25)+65)+Chr(Random(25)+65)
+Chr(Random(25)+65)+Chr(Random(25)+65)+Chr(Random(25)+65);
end;
  您可以能够就在我自己的程序中用个Timer控件定时调用该函数,或者比如说您的程序是个Socket通讯程序,就可以能够就在OnClientSocket1Read调用它.最后,说句题外话:如果您想成为一个优秀的程序员,那么培养我自己那种不钻牛角尖的思维习惯是很重要的.世界上很多问题的答案不只有一个,而我们我自己要做的就是找出最不复杂的那个.很多人特别是那些数学思维比较强的人,一拿到程序就写,虽然算法很好,程序结构也很清晰,但是却走了弯路.我认识很多名校的学生,他们数学很好,但是往往把一个很不复杂的问题想的复杂化.记得有一次国际奥林匹克数学竞赛,有一道填空题:一个小时内时针和分针重合几次,中国学生马上列方程来解,美国(美利坚和众国)学生则取下我自己的手表拔了一圈就写出了答案.也许,只关心算法是程序员和优秀程序员的区别吧.因为,程序,不只只是算法!

★作者:

陈经韬

相关文章
发表评论
阅读排行
相关热门
网站帮助 - 广告合作 - 下载声明 - 网站地图