port埠掃描 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
port埠掃描
http://www.51land.com/bbs/topicdisplay.asp?boardid=3141&topicid=147878&page=1 如果你寫掃描程式可千萬不要直接去連接,應該使用別的鏈結方法,否則你的蹤迹會被別人發現.例如使用sys掃描或者fin掃描: 我給你非同步socket的api代碼:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,WInSock, ExtCtrls; const WM_SOCKET=WM_USER+1; //socket消息 type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Panel1: TPanel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
Sockhd : integer; //socket控制碼
Serv_Addr : Tsockaddr;//目標位址 procedure SockEvent(var msg: Tmessage);message WM_SOCKET; //處理cocket消息
procedure DspMsg(msg : string); //顯示資訊
{ Private declarations }
public
{ Public declarations }
end; Form1: TForm1; implementation
{$R *.DFM} function lookup_hostname(const hostname:string):longint; //把功能變數名稱轉化成IP地址
var
RemoteHost : PHostEnt; (* no, don‘t free it! *)
ip_address: longint;
begin
ip_address:=-1;
try
if hostname=‘‘ then
begin (* no host given! *)
lookup_hostname:=ip_address;
EXIT;
end
else
begin
ip_address:=Winsock.Inet_Addr(PChar(hostname)); (* try a xxx.xxx.xxx.xx first *)
if ip_address=SOCKET_ERROR then begin
RemoteHost:=Winsock.GetHostByName(PChar(hostname));
if (RemoteHost=NIL) or (RemoteHost^.h_length<=0) then
begin
lookup_hostname:=ip_address;
EXIT; (* host not found *)
end
else
ip_address:=longint(pointer(RemoteHost^.h_addr_list^)^);
end;
end;
except
ip_address:=-1;
end;
lookup_hostname:=ip_address;
end; procedure TFOrm1.DspMsg(msg: string);
begin
memo1.Lines.Add(msg+‘...‘);
if Memo1.Lines.Count>200 then Memo1.Lines.Delete(0);
end; procedure TForm1.SockEvent(var msg : tmessage); //處理socket消息
begin
case msg.LParam of
FD_READ: begin //標識可以讀數據,當然肯定已經鏈結上了
dspmsg(‘可以讀取資料‘);
//do what you want do
end; FD_WRITE: begin
dspmsg(‘可以發送資料‘);
//do what you want do
end; FD_ERROR: begin
dspmsg(‘發生錯誤‘);
//如果你是用戶端,則應該是連接不上,即埠沒有開
end; FD_CLOSE: Begin
dspmsg(‘伺服器斷開連接‘);
//對方關閉連接
end; FD_CONNECT: begin
dspmsg(‘連結上伺服器‘);
//表示對方埠開放
end; FD_ACCEPT: begin
dspmsg(‘接收一個請求‘);
//這個消息只有服務端可能出現
end;
end;
end; procedure TForm1.FormCreate(Sender: TObject);
var wsaData:TwsaData;
begin //啓動winsock動態連結程式庫
if WSAStartup (makeword(2,2), wsaData)<>0 then begin
messagebox(application.handle,‘無法啓動winsock動態連接庫!‘,‘警告‘,MB_OK or MB_APPLMODAL or MB_ICONWARNING);
Application.Terminate;
end;
end; procedure TForm1.FormDestroy(Sender: TObject);
begin //關閉dll
WSACleanup;
end; procedure TForm1.Button1Click(Sender: TObject);
begin
Sockhd := socket(AF_INET,SOCK_STREAM,0); //創建socket控制碼
if Sockhd<0 then begin
messagebox(application.handle,‘無法創建控制碼!‘,‘警告‘,MB_OK or MB_APPLMODAL or MB_ICONWARNING);
exit;
end;
Serv_addr.sin_addr.s_addr:= lookup_hostname(edit1.Text); //主機名
Serv_addr.sin_family := PF_INET;
Serv_addr.sin_port := htons(23); //any port you want to connect if WSAAsyncSelect(Sockhd,Form1.handle,WM_SOCKET,FD_ACCEPT or FD_CONNECT or FD_CLOSE or FD_READ or FD_WRITE)=SOCKET_ERROR
then begin
messagebox(application.handle,‘無法創建控制碼!‘,‘警告‘,MB_OK or MB_APPLMODAL or MB_ICONWARNING);
exit;
end; //非同步socket
connect(sockhd,serv_addr,sizeof(serv_addr)); //連接,結果會在前面的處理函數處理
end; end.
相信應該可以滿足你的要求 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |