明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

談"黑洞2001"殺防火墻的完成與對(duì)策

[摘要]談"黑洞2001"殺防火墻的實(shí)現(xiàn)與對(duì)策 "黑洞2001"是今年1月份推出的國(guó)產(chǎn)遠(yuǎn)程管理工具,相對(duì)其它遠(yuǎn)程管理工具,它添加了個(gè)很有吸引力的功能:進(jìn)程管家.它有...

談"黑洞2001"殺防火墻的實(shí)現(xiàn)與對(duì)策

"黑洞2001"是今年1月份推出的國(guó)產(chǎn)遠(yuǎn)程管理工具,相對(duì)其它遠(yuǎn)程管理工具,它添加了個(gè)很有吸引力的功能:進(jìn)程管家.它有什么用呢?在這里引述一下吳建蓉的論述:"多進(jìn)程監(jiān)控功能是干什么用的呢?原來(lái)隨著大家安全意識(shí)的不斷提高, 大多數(shù)人都安裝了防火墻, 木馬們的生存空間越來(lái)越小, 為生存計(jì), 木馬開(kāi)發(fā)者想出了一個(gè)辦法, 他讓木馬服務(wù)端定時(shí)刷新進(jìn)程, 如果發(fā)現(xiàn)其中的進(jìn)程名稱與其事先定義好的相符合, 就將這個(gè)進(jìn)程關(guān)閉, 如果這個(gè)被關(guān)閉的進(jìn)程恰巧就是防火墻, 那你的網(wǎng)絡(luò)大門就完全敞開(kāi)了, 監(jiān)控端就可為所欲為了。 事實(shí)上這個(gè)功能就是針對(duì)防火墻出現(xiàn)的, 一切堡壘都是從內(nèi)部被攻破的在此得到了充分的體現(xiàn)。 其實(shí)在黑洞2000中就有了這樣的功能, 只不過(guò)黑洞2000只能關(guān)閉天網(wǎng)防火墻, 對(duì)其它防火墻沒(méi)有任何作用。 黑洞2001則可以欲定義長(zhǎng)達(dá)99個(gè)英文字符號(hào), 完全可以將您可能會(huì)用到的防火墻都定義到其中, 從而可將這些防火墻全部關(guān)閉!"(原文見(jiàn)http://www.yesky.com/20010719/189602.shtml)現(xiàn)在有些木馬也具有這個(gè)功能了,但是"黑洞"是第一個(gè)首先提出和實(shí)現(xiàn)這一功能的軟件.

  實(shí)際上,作者當(dāng)初添加這個(gè)功能是為了方便監(jiān)控一些有害的軟件.大家可以在服務(wù)端默認(rèn)的配置看出來(lái),它以前是監(jiān)控"有害軟件,黃色軟件"的.不過(guò)后來(lái)被人誤用了而已.

  俗話說(shuō):"假傳萬(wàn)卷書,真?zhèn)饕痪湓?quot;.看起來(lái)最復(fù)雜最強(qiáng)大的東西,它的原理往往卻是最簡(jiǎn)單的.愛(ài)因思坦的質(zhì)能方程式也只不過(guò)是簡(jiǎn)單的E=MC2.其實(shí)"黑洞"這個(gè)看似很神奇的功能,只不過(guò)是用了一個(gè)API函數(shù)PostMessage(窗口句柄, WM_Quit, 0, 0);而已.

  在Windows系統(tǒng)中,每個(gè)可執(zhí)行文件在運(yùn)行時(shí)不僅有進(jìn)程ID,還存在一個(gè)窗口名.一般來(lái)說(shuō),如果一個(gè)程序運(yùn)行時(shí)在任務(wù)欄有個(gè)圖標(biāo),你把鼠標(biāo)移動(dòng)到那里出現(xiàn)的提示就是該程序的窗口名.即使程序是隱藏運(yùn)行,它的窗口名還是存在的,只不過(guò)你看不見(jiàn)而已.我們只要找到一個(gè)程序的窗口句柄,然后發(fā)送一個(gè)消息WM_Quit給它就會(huì)把它無(wú)條件關(guān)閉了.那么如何找到那個(gè)叫"句柄"的東西呢?Windows提供了一個(gè)API函數(shù)FindWindow來(lái)通過(guò)窗口名返回窗口句柄.比如說(shuō)你想查找一個(gè)窗口名為"有害軟件"的句柄,則可以用以下語(yǔ)句:

Var

Exehandle: Thandle;

begin

ExeHandle := FindWindow(Nil, '有害軟件');

if ExeHandle <> 0 then Showmessage('找到該軟件,句柄為'+InttoStr(Exehandle));

end;

  現(xiàn)在問(wèn)題簡(jiǎn)單了吧.只要看看系統(tǒng)現(xiàn)在運(yùn)行的所有窗口名稱,然后和我們需要關(guān)閉的作比較,如果條件符合的就Kill了它.查找當(dāng)前系統(tǒng)運(yùn)行的所有窗口名稱可以通過(guò)遞歸實(shí)現(xiàn).我們可以寫出下面的一個(gè)函數(shù).

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;

  我們來(lái)試試調(diào)用這個(gè)函數(shù)看看.運(yùn)行Delphi新建一個(gè)工程,放上一個(gè)ListBox控件和一個(gè)按鈕Button1,在它的OnClick事件寫代碼:

procedure TForm1.Button1Click(Sender: TObject);

Var

FormStrings:TStringList;

begin

FormStrings:=TStringList.Create;

My_RefreshForm(FormStrings);

ListBox1.Items:=FormStrings;

FormStrings.Free;

end;

  然后運(yùn)行這個(gè)程序,點(diǎn)擊Button1就會(huì)在ListBox1列出系統(tǒng)現(xiàn)在的所有窗口名.你會(huì)發(fā)現(xiàn)有一些很奇怪的操作系統(tǒng)本身運(yùn)行的程序---但是你自己在Windows任務(wù)列表中卻看不到它.有了上面這兩個(gè)函數(shù),我們就可以叫它Quit了.我們?cè)賮?lái)寫個(gè)函數(shù)吧:

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;

  我們?cè)诔绦蛑幸獨(dú)⑺滥莻(gè)"有害軟件",那么可以先用My_RefreshForm函數(shù)列出所有窗口名稱,然后一個(gè)一個(gè)和"有害軟件"這個(gè)窗口名作比較,如果條件符合就使用My_KillForm('有害軟件')把它給關(guān)了.至于象"黑洞2001"那樣做到"模糊設(shè)置",相信大家很快就可以寫出來(lái),這里就不再多講了.

  知道了它的原理后,那么我們?nèi)绾蝸?lái)防范它呢?比如說(shuō)我的軟件是個(gè)殺毒防火墻,如何不讓它給Kill了呢?一個(gè)程序如果沒(méi)有窗口名不就可以了嗎?呵呵,問(wèn)題是Windows不讓你那么做.比如說(shuō)Delphi做的程序窗口名就是Application的Title,如果你不設(shè)置它那么Windows系統(tǒng)就會(huì)把該程序主窗口的標(biāo)題當(dāng)作該程序的窗口名.其實(shí),我們可以這樣:就是定時(shí)隨機(jī)改變自己的窗口名,這樣一來(lái)它確定不了你的窗口名就那你沒(méi)轍了:)

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;

  你可以在自己的程序中用個(gè)Timer控件定時(shí)調(diào)用該函數(shù),或者比如說(shuō)你的程序是個(gè)Socket通訊程序,就可以在OnClientSocket1Read調(diào)用它.最后,說(shuō)句題外話:如果你想成為一個(gè)優(yōu)秀的程序員,那么培養(yǎng)自己那種不鉆牛角尖的思維習(xí)慣是很重要的.世界上很多問(wèn)題的答案不只有一個(gè),而我們要做的就是找出最簡(jiǎn)單的那個(gè).很多人特別是那些數(shù)學(xué)思維比較強(qiáng)的人,一拿到程序就寫,雖然算法很好,程序結(jié)構(gòu)也很清晰,但是卻走了彎路.我認(rèn)識(shí)很多名校的學(xué)生,他們數(shù)學(xué)很好,但是往往把一個(gè)很簡(jiǎn)單的問(wèn)題想的復(fù)雜化.記得有一次國(guó)際奧林匹克數(shù)學(xué)競(jìng)賽,有一道填空題:一個(gè)小時(shí)內(nèi)時(shí)針和分針重合幾次,中國(guó)學(xué)生馬上列方程來(lái)解,美國(guó)學(xué)生則取下自己的手表拔了一圈就寫出了答案.也許,只關(guān)心算法是程序員和優(yōu)秀程序員的區(qū)別吧.因?yàn)?程序,不僅僅是算法!

★作者:

陳經(jīng)韜


上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識(shí),學(xué)習(xí)了安全知識(shí),幾乎可以讓你免費(fèi)電腦中毒的煩擾。