談"黑洞2001"殺防火墻的完成與對策
發表時間:2023-06-02 來源:明輝站整理相關軟件相關文章人氣:
[摘要]談"黑洞2001"殺防火墻的實現與對策 "黑洞2001"是今年1月份推出的國產遠程管理工具,相對其它遠程管理工具,它添加了個很有吸引力的功能:進程管家.它有...
談"黑洞2001"殺防火墻的實現與對策
"黑洞2001"是今年1月份推出的國產遠程管理工具,相對其它遠程管理工具,它添加了個很有吸引力的功能:進程管家.它有什么用呢?在這里引述一下吳建蓉的論述:"多進程監控功能是干什么用的呢?原來隨著大家安全意識的不斷提高, 大多數人都安裝了防火墻, 木馬們的生存空間越來越小, 為生存計, 木馬開發者想出了一個辦法, 他讓木馬服務端定時刷新進程, 如果發現其中的進程名稱與其事先定義好的相符合, 就將這個進程關閉, 如果這個被關閉的進程恰巧就是防火墻, 那你的網絡大門就完全敞開了, 監控端就可為所欲為了。 事實上這個功能就是針對防火墻出現的, 一切堡壘都是從內部被攻破的在此得到了充分的體現。 其實在黑洞2000中就有了這樣的功能, 只不過黑洞2000只能關閉天網防火墻, 對其它防火墻沒有任何作用。 黑洞2001則可以欲定義長達99個英文字符號, 完全可以將您可能會用到的防火墻都定義到其中, 從而可將這些防火墻全部關閉!"(原文見http://www.yesky.com/20010719/189602.shtml)現在有些木馬也具有這個功能了,但是"黑洞"是第一個首先提出和實現這一功能的軟件.
實際上,作者當初添加這個功能是為了方便監控一些有害的軟件.大家可以在服務端默認的配置看出來,它以前是監控"有害軟件,黃色軟件"的.不過后來被人誤用了而已.
俗話說:"假傳萬卷書,真傳一句話".看起來最復雜最強大的東西,它的原理往往卻是最簡單的.愛因思坦的質能方程式也只不過是簡單的E=MC2.其實"黑洞"這個看似很神奇的功能,只不過是用了一個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"那樣做到"模糊設置",相信大家很快就可以寫出來,這里就不再多講了.
知道了它的原理后,那么我們如何來防范它呢?比如說我的軟件是個殺毒防火墻,如何不讓它給Kill了呢?一個程序如果沒有窗口名不就可以了嗎?呵呵,問題是Windows不讓你那么做.比如說Delphi做的程序窗口名就是Application的Title,如果你不設置它那么Windows系統就會把該程序主窗口的標題當作該程序的窗口名.其實,我們可以這樣:就是定時隨機改變自己的窗口名,這樣一來它確定不了你的窗口名就那你沒轍了:)
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調用它.最后,說句題外話:如果你想成為一個優秀的程序員,那么培養自己那種不鉆牛角尖的思維習慣是很重要的.世界上很多問題的答案不只有一個,而我們要做的就是找出最簡單的那個.很多人特別是那些數學思維比較強的人,一拿到程序就寫,雖然算法很好,程序結構也很清晰,但是卻走了彎路.我認識很多名校的學生,他們數學很好,但是往往把一個很簡單的問題想的復雜化.記得有一次國際奧林匹克數學競賽,有一道填空題:一個小時內時針和分針重合幾次,中國學生馬上列方程來解,美國學生則取下自己的手表拔了一圈就寫出了答案.也許,只關心算法是程序員和優秀程序員的區別吧.因為,程序,不僅僅是算法!
★作者:
陳經韜
上面是電腦上網安全的一些基礎常識,學習了安全知識,幾乎可以讓你免費電腦中毒的煩擾。