Unit1.~pas
上传用户:sunrenlu
上传日期:2007-01-08
资源大小:199k
文件大小:27k
源码类别:

Internet/网络编程

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   Menus, ComCtrls, StatusBarEx, ExtCtrls, OleCtrls, SHDocVw, StdCtrls,
  6.   Buttons, FmxUtils, NMUDP, ShellAPI, ImgList,Winsock, ToolWin,
  7.   Ingusclass, Protohdr, IngusPacket;
  8. const
  9.   WM_MY_Notify=WM_USER+100;
  10. type
  11.   SArray = array[$0..$ffff] of integer;
  12.   TForm1 = class(TForm)
  13.     MainMenu1: TMainMenu;
  14.     N1: TMenuItem;
  15.     StatusBarEx1: TStatusBarEx;
  16.     Panel1: TPanel;
  17.     Panel2: TPanel;
  18.     Adver: TWebBrowser;
  19.     PageControl1: TPageControl;
  20.     TabSheet1: TTabSheet;
  21.     TabSheet2: TTabSheet;
  22.     TabSheet3: TTabSheet;
  23.     TabSheet4: TTabSheet;
  24.     GroupBox1: TGroupBox;
  25.     GroupBox2: TGroupBox;
  26.     GroupBox3: TGroupBox;
  27.     GroupBox4: TGroupBox;
  28.     BitBtn1: TBitBtn;
  29.     SmMess: TMemo;
  30.     SmInfo: TRichEdit;
  31.     Label1: TLabel;
  32.     Label2: TLabel;
  33.     SmIp: TEdit;
  34.     SmPort: TEdit;
  35.     Label3: TLabel;
  36.     SmNum: TEdit;
  37.     Label4: TLabel;
  38.     SmFace: TComboBox;
  39.     CheckBox1: TCheckBox;
  40.     BitBtn2: TBitBtn;
  41.     Sender1: TNMUDP;
  42.     Timer1: TTimer;
  43.     CheckBox2: TCheckBox;
  44.     PopupMenu1: TPopupMenu;
  45.     TrayPop: TMenuItem;
  46.     N21: TMenuItem;
  47.     Image1: TImage;
  48.     GroupBox5: TGroupBox;
  49.     Label5: TLabel;
  50.     IPSearchArea: TEdit;
  51.     Label6: TLabel;
  52.     IPSearchPort: TEdit;
  53.     GroupBox6: TGroupBox;
  54.     IPDeted: TListView;
  55.     ImageList1: TImageList;
  56.     BitBtn3: TBitBtn;
  57.     BitBtn4: TBitBtn;
  58.     GroupBox7: TGroupBox;
  59.     IPSearcher: TNMUDP;
  60.     ReSender: TNMUDP;
  61.     SearchInfo: TLabel;
  62.     DetePro: TProgressBar;
  63.     DLab1: TLabel;
  64.     DLab2: TLabel;
  65.     DetedPop: TPopupMenu;
  66.     TabSheet5: TTabSheet;
  67.     Image2: TImage;
  68.     TabSheet6: TTabSheet;
  69.     N2: TMenuItem;
  70.     WEB1: TMenuItem;
  71.     GroupBox8: TGroupBox;
  72.     Label10: TLabel;
  73.     PDeteIP: TEdit;
  74.     Label11: TLabel;
  75.     PDeteB: TEdit;
  76.     Label12: TLabel;
  77.     PDeteE: TEdit;
  78.     GroupBox9: TGroupBox;
  79.     PortDeted: TListView;
  80.     GroupBox10: TGroupBox;
  81.     BitBtn6: TBitBtn;
  82.     Label13: TLabel;
  83.     BitBtn5: TBitBtn;
  84.     Label14: TLabel;
  85.     Label15: TLabel;
  86.     PDetePro: TProgressBar;
  87.     PortSearcher: TNMUDP;
  88.     PSearchMess: TLabel;
  89.     IP1: TMenuItem;
  90.     PopupMenu2: TPopupMenu;
  91.     N3: TMenuItem;
  92.     WEB2: TMenuItem;
  93.     GroupBox11: TGroupBox;
  94.     GroupBox12: TGroupBox;
  95.     Label7: TLabel;
  96.     ComboBox1: TComboBox;
  97.     chudp: TCheckBox;
  98.     GroupBox13: TGroupBox;
  99.     FriendList: TListView;
  100.     CheckBox4: TCheckBox;
  101.     BitBtn7: TBitBtn;
  102.     GroupBox14: TGroupBox;
  103.     Memo1: TMemo;
  104.     FLPop: TPopupMenu;
  105.     IP2: TMenuItem;
  106.     N4: TMenuItem;
  107.     Label17: TLabel;
  108.     Label18: TLabel;
  109.     Label19: TLabel;
  110.     Label8: TLabel;
  111.     Label20: TLabel;
  112.     Label9: TLabel;
  113.     Label21: TLabel;
  114.     Label22: TLabel;
  115.     Label23: TLabel;
  116.     Label24: TLabel;
  117.     Label25: TLabel;
  118.     Label26: TLabel;
  119.     BitBtn8: TBitBtn;
  120.     IPLab: TLabel;
  121.     Label27: TLabel;
  122.     GroupBox15: TGroupBox;
  123.     Label16: TLabel;
  124.     Label28: TLabel;
  125.     Edit1: TEdit;
  126.     Edit2: TEdit;
  127.     GroupBox16: TGroupBox;
  128.     Label29: TLabel;
  129.     Label30: TLabel;
  130.     Edit3: TEdit;
  131.     ComboBox2: TComboBox;
  132.     CheckBox3: TCheckBox;
  133.     CheckBox5: TCheckBox;
  134.     GroupBox17: TGroupBox;
  135.     Memo2: TMemo;
  136.     GroupBox18: TGroupBox;
  137.     BitBtn9: TBitBtn;
  138.     BitBtn10: TBitBtn;
  139.     ListView1: TListView;
  140.     NetTest: TTimer;
  141.     procedure FormCreate(Sender: TObject);
  142.     procedure Timer1Timer(Sender: TObject);
  143.     procedure BitBtn2Click(Sender: TObject);
  144.     procedure BitBtn1Click(Sender: TObject);
  145.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  146.     procedure Sender1DataReceived(Sender: TComponent; NumberBytes: Integer;
  147.       FromIP: String; Port: Integer);
  148.     procedure BitBtn4Click(Sender: TObject);
  149.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  150.     procedure BitBtn3Click(Sender: TObject);
  151.     procedure IPSearcherDataReceived(Sender: TComponent;
  152.       NumberBytes: Integer; FromIP: String; Port: Integer);
  153.     procedure Label8Click(Sender: TObject);
  154.     procedure Label9Click(Sender: TObject);
  155.     procedure IPDetedSelectItem(Sender: TObject; Item: TListItem;
  156.       Selected: Boolean);
  157.     procedure N2Click(Sender: TObject);
  158.     procedure WEB1Click(Sender: TObject);
  159.     procedure BitBtn5Click(Sender: TObject);
  160.     procedure BitBtn6Click(Sender: TObject);
  161.     procedure PortSearcherDataReceived(Sender: TComponent;
  162.       NumberBytes: Integer; FromIP: String; Port: Integer);
  163.     procedure IP1Click(Sender: TObject);
  164.     procedure PortDetedSelectItem(Sender: TObject; Item: TListItem;
  165.       Selected: Boolean);
  166.     procedure N3Click(Sender: TObject);
  167.     procedure WEB2Click(Sender: TObject);
  168.     procedure chudpClick(Sender: TObject);
  169.     procedure FormDestroy(Sender: TObject);
  170.     procedure BitBtn7Click(Sender: TObject);
  171.     procedure FriendListSelectItem(Sender: TObject; Item: TListItem;
  172.       Selected: Boolean);
  173.     procedure N4Click(Sender: TObject);
  174.     procedure IP2Click(Sender: TObject);
  175.     procedure Label23Click(Sender: TObject);
  176.     procedure Label27Click(Sender: TObject);
  177.     procedure BitBtn8Click(Sender: TObject);
  178.     procedure NetTestTimer(Sender: TObject);
  179.     
  180. //        function GetComputerName(IP:string):string;
  181.     
  182.   private
  183.     { Private declarations }
  184.     TBRect: TRect;
  185.     sIngus: TIngusSniffer;
  186.     procedure GetAdve;
  187.     procedure SetTrayIcon(WIcon:hwnd; Job:Integer);
  188.     procedure MainTrayIconClick(var msg : TMessage); Message WM_My_Notify;
  189.     procedure DeMessStru(Num,Face,Mess:string); //消息结构定义
  190.     procedure SendMess1(IP,Num,Face,Mess:string;Port,LocalPort:integer);//定向单信息发送
  191.     procedure SendReMess(IP,Num:string;Port:integer);
  192.     procedure IPSearchMess(Area:string;RemotePort:integer);
  193.     procedure WSmInfo(color:Tcolor;mess:string;bold:boolean);
  194.     procedure WMNcPaint(var m: TMessage);message WM_NCPAINT; // 当画标题栏时进入该过程
  195.     procedure DrawCaptionBtn(uEdge: UINT);
  196.     procedure WMNcActivate(var m: TMessage);message WM_NCACTIVATE;// 当标题栏在激活与非激活之间切换时进入该过程
  197.     procedure WMNcLButtonDown(var m: TMessage);message WM_NCLBUTTONDOWN;// 当在标题栏上按下鼠标左按钮时进入该过程
  198.     procedure WMNcLButtonUp(var m: TMessage);message WM_NCLBUTTONUP;// 当在标题栏上放开鼠标左按钮时进入该过程
  199.   public
  200.     { Public declarations }
  201.     procedure OnParsePacketHandle( nPacketSeq: Longint; uBuffer: PChar;
  202.                                    nRecvBytes: integer; sPacket: TIngusPacketBase );
  203.     procedure OnAfterGetMacAddress(bStatus: Boolean; pMacAddr: PChar);
  204.     procedure OnAfterGetAdapterDesc(bStatus: Boolean; sAdapterDesc: string);
  205.     end;
  206. var
  207.   Form1 : TForm1;
  208.   MainTrayIcon: PNotifyIconDataA;
  209.   MessStru,ReMess : SArray; //消息结构数组
  210.   SendStream : TMemoryStream;
  211.   Rzz : integer;  //随机数种子
  212.   DetedSb1,DetedSb2,DetedSb3:string;
  213.   RecvMessbuffer:string;
  214.   Closebool : integer;
  215. implementation
  216. {$R *.DFM}
  217. procedure TForm1.GetAdve;
  218. var
  219.   Flags: OLEVariant;
  220. begin
  221. Flags := 0;
  222. Adver.Navigate(WideString('http://oq998.yeah.net'), Flags, Flags, Flags, Flags);
  223. end;
  224. procedure TForm1.DeMessStru(Num,Face,Mess:string);
  225. var i,RandBuff : integer;
  226.     DebugStr : string;
  227. begin
  228. MessStru[0] := $02;//HEADER
  229. MessStru[1] := $03;
  230. MessStru[2] := $0a;
  231. MessStru[3] := $00;
  232. MessStru[4] := $78;
  233. MessStru[5] := $3a;//MESSAGE CHANGE
  234. MessStru[6] := $2b;
  235. MessStru[7] := $34;//ICQ Number
  236. MessStru[8] := $33;
  237. MessStru[9] := $30;
  238. MessStru[10] := $34;
  239. MessStru[11] := $34;
  240. MessStru[12] := $36;//^^^
  241. MessStru[13] := $1f;//Split
  242. MessStru[14] := $30;
  243. MessStru[15] := $1f;//Split
  244. MessStru[16] := $31;//Face
  245. MessStru[17] := $37;
  246. MessStru[18] := $32;//^^^
  247. MessStru[19] := $1f;
  248. MessStru[20] := $33;
  249. MessStru[21] := $30;
  250. MessStru[22] := $30;
  251. MessStru[23] := $30;
  252. MessStru[24] := $2d;
  253. MessStru[25] := $30;
  254. MessStru[26] := $39;
  255. MessStru[27] := $2d;
  256. MessStru[28] := $30;
  257. MessStru[29] := $36;
  258. MessStru[30] := $1f;
  259. MessStru[31] := $30;
  260. MessStru[32] := $38;
  261. MessStru[33] := $3a;
  262. MessStru[34] := $34;
  263. MessStru[35] := $39;
  264. MessStru[36] := $3a;
  265. MessStru[37] := $31;
  266. MessStru[38] := $33;
  267. MessStru[39] := $1f;
  268. MessStru[40] := $50;
  269. MessStru[41] := $03;
  270. SendStream := TMemoryStream.Create;
  271. for i := 0 to 4 do SendStream.Write(MessStru[i],1);
  272. RandBuff := Random(Rzz);
  273. RandBuff := Random(Rzz);
  274. RandBuff := Random(Rzz);
  275. //showmessage(inttostr(RandBuff));
  276. SendStream.Write(RandBuff,1);
  277. RandBuff := Random(Rzz);
  278. SendStream.Write(RandBuff,1);
  279. DebugStr := inttostr(Length(Num));
  280. //showmessage(DebugStr);
  281. SendStream.Write(Num[1],Length(Num));
  282. for i := 13 to 15 do SendStream.Write(MessStru[i],1);
  283. SendStream.Write(Face[1],Length(Face));
  284. for i := 19 to 39 do SendStream.Write(MessStru[i],1);
  285. SendStream.Write(Mess[1],Length(Mess));
  286. SendStream.Write(MessStru[41],1);
  287. end;
  288. procedure TForm1.SendMess1(IP,Num,Face,Mess:string;Port,LocalPort:integer);
  289. begin
  290. DeMessStru(Num,Face,Mess);
  291. Sender1.RemoteHost := IP;
  292. Sender1.RemotePort := Port;
  293. Sender1.LocalPort  := LocalPort;
  294. //showMessage
  295.   try
  296.      Sender1.SendStream(SendStream);
  297.   finally
  298.     SendStream.Free;
  299.   end;
  300. end;
  301. procedure TForm1.WSmInfo(color:Tcolor;mess:string;bold:boolean);
  302. var n:integer;
  303. begin
  304. n := Length(mess);
  305. SmInfo.Lines.Add(mess);
  306. SmInfo.SelLength:=-n-2;
  307. if bold then SmInfo.SelAttributes.Style :=[fsBold];
  308. SmInfo.SelAttributes.Color:=color;
  309. postmessage(SmInfo.handle, WM_VSCROLL, 1, SB_LINEDOWN);
  310. end;
  311. procedure TForm1.FormCreate(Sender: TObject);
  312. begin
  313. Closebool := 0;
  314. //SetTrayIcon(Form1.Icon.Handle,0);
  315. //SetTrayIcon(Form1.Icon.Handle,0);
  316. //SetTrayIcon(Form1.Icon.Handle,0);
  317. SetTrayIcon(Form1.Icon.Handle,0);
  318. DrawCaptionBtn(EDGE_RAISED);
  319. GetAdve;
  320. RecvMessbuffer := '';
  321. Rzz := 13;
  322. //Sniff INI
  323.   sIngus := TIngusSniffer.Create;
  324.   sIngus.OnParsePacket := OnParsePacketHandle;
  325.   //sIngus.OnAfterGetAdapterDesc := OnAfterGetAdapterDesc;
  326.   //sIngus.OnAfterGetMacAddress := OnAfterGetMacAddress;
  327.   ComboBox1.Items.Assign(sIngus.AdapterNameList);
  328.   ComboBox1.ItemIndex := 0;
  329. end;
  330. procedure TForm1.Timer1Timer(Sender: TObject);
  331. begin
  332. if Rzz < $100 then Rzz := Rzz +1
  333. else Rzz := 13;
  334. end;
  335. procedure TForm1.BitBtn2Click(Sender: TObject);
  336. begin
  337. SendMess1(SmIp.Text,SmNum.Text,SmFace.Text,SmMess.Text,strtoint(SmPort.Text),1234);
  338. WSmInfo(clGreen,'消息已经发往:'+SmIp.Text,False);
  339. if CheckBox2.Checked = True then SmMess.Clear;
  340. end;
  341. procedure TForm1.BitBtn1Click(Sender: TObject);
  342. begin
  343. //SetTrayIcon(Form1.Icon.Handle,0);
  344. SmInfo.Clear;
  345. end;
  346. procedure TForm1.SetTrayIcon (WIcon:hwnd; Job:Integer);
  347. begin
  348. if Job = 0 then
  349. begin
  350. NEW(MainTrayIcon);
  351. MainTrayIcon^.Wnd := Form1.Handle;
  352. MainTrayIcon^.uID := 0;
  353. MainTrayIcon^.uFlags := NIF_ICON+NIF_MESSAGE+NIF_TIP;
  354. MainTrayIcon^.hIcon := WIcon;
  355. MainTrayIcon^.uCallbackMessage := WM_MY_Notify;
  356. MainTrayIcon^.szTip := 'Left Click hide or restore WhoCQ window! Right Click pop Menu';
  357. //showmessage(inttostr(Form1.Handle)+'/'+inttostr(NIF_ICON+NIF_MESSAGE+NIF_TIP)+'/'+inttostr(WIcon));
  358. Shell_NotifyIcon(NIM_ADD,MainTrayIcon);
  359. end;
  360. if Job = 2 then
  361. begin
  362. Shell_NotifyIcon(NIM_DELETE,MainTrayIcon);
  363. end;
  364. end;
  365. procedure TForm1.MainTrayIconClick(var msg : TMessage);
  366. var p:TPoint;
  367. begin
  368.  try
  369.      case msg.LParam of
  370.       WM_LBUTTONDOWN:
  371.         begin
  372.         GetCursorPos(p);
  373.         TrayPop.Checked := not TrayPop.Checked;
  374.         if TrayPop.Checked = False then
  375.         begin
  376.         Form1.show;
  377.         Application.Restore;
  378.         SendMessage(Handle,WM_NCACTIVATE,HTCaption,GetMessagePos);
  379.         end
  380.         else
  381.         begin
  382.         //Application.Minimize;
  383.         //SetWindowLong(Application.handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
  384.         Form1.hide;
  385.         end;
  386.         end;
  387.       WM_RBUTTONDOWN:
  388.         begin
  389.         GetCursorPos(p);
  390.         PopupMenu1.Popup(p.x,p.y);
  391.         end;
  392.       WM_LBUTTONDBLCLK:
  393.         begin
  394.         //ShowMessage('LBDD');
  395.         end;
  396.       WM_RBUTTONDBLCLk:
  397.         begin
  398.         //ShowMessage('RBDD');
  399.         end;
  400.      end;
  401.  except
  402.  end;
  403. end;
  404. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  405. begin
  406. Shell_NotifyIcon(NIM_DELETE,MainTrayIcon);
  407. sIngus.StopSnoop;
  408. //SetTrayIcon(Form1.Icon.Handle,2);
  409. end;
  410. procedure TForm1.DrawCaptionBtn(uEdge: UINT);
  411. var
  412.    hCaptionDC: HDC; // 标题条Device Context
  413.    //hOldFont: HFONT; // 原来的字体
  414.    r: TRect;
  415. begin
  416.      hCaptionDC := GetWindowDC(Self.Handle);
  417.           // 注意不能用GetDC,那样的话,将得不到标题栏
  418.           // 的设备上下文
  419.           //画按钮的样子,如果uEdge=EDGE_RAIS,
  420.           //则画出的样子为凸起;如果
  421.           //uEdge=EDGE_SUNKEN,则画出的样子为凹下。
  422.      DrawEdge(hCaptionDC, TBRect, uEdge, BF_RECT or BF_MIDDLE or BF_SOFT);
  423.            //设置标题栏的设备上下文为透明状态
  424.      SetBkMode(hCaptionDC, TRANSPARENT);
  425.            //设置标题栏设备上下文的字体
  426.            //hOldFont:= SelectObject(hCaptionDC, CBBtnFont.Handle);
  427.            //画按钮
  428.      if uEdge = EDGE_RAISED then
  429.         begin
  430.         SetRect(TBRect,459,5,475,19);
  431.         DrawText(hCaptionDC, '*',1, TBRect, DT_CENTER);
  432.         end
  433.      else begin
  434.         r := TBRect;
  435.         SetRect(r,459,5,475,19);
  436.         OffsetRect(r, 1, 1);
  437.         DrawText(hCaptionDC, '*', 1, r, DT_CENTER);
  438.      end;
  439.             //还原为原来的字体
  440.             //SelectObject(hCaptionDC, hOldFont);
  441. end;
  442. procedure TForm1.WMNcActivate(var m: TMessage);
  443. begin
  444.      inherited;
  445.      DrawCaptionBtn(EDGE_RAISED);
  446. end;
  447. procedure TForm1.WMNcPaint(var m: TMessage);
  448. begin
  449.      inherited;
  450.      DrawCaptionBtn(EDGE_RAISED);
  451. end;
  452. procedure TForm1.WMNcLButtonDown(var m: TMessage);
  453. var
  454.    p: TPoint;
  455. begin
  456.      p.x := LOWORD(m.lParam) - Self.Left;
  457.      p.y := HIWORD(m.lParam) - Self.Top;
  458.      if PtInRect(TBRect, p) then  // 如果按在了按钮区域
  459.      begin
  460.         Self.BringToFront;
  461.         DrawCaptionBtn(EDGE_SUNKEN);
  462.      end
  463.      else
  464.         inherited; // 执行默认的操作
  465. end;
  466. procedure TForm1.WMNcLButtonUp(var m: TMessage);
  467. var
  468.    p: TPoint;
  469. begin
  470.      p.x := LOWORD(m.lParam) - Self.Left;
  471.      p.y := HIWORD(m.lParam) - Self.Top;
  472.      if PtInRect(TBRect, p) then //如果在标题栏按钮区域释放鼠标
  473.      begin
  474.         DrawCaptionBtn(EDGE_RAISED);
  475.         Form1.hide;
  476.      end
  477.      else
  478.         inherited; // 执行默认的操作
  479. end;
  480. procedure TForm1.Sender1DataReceived(Sender: TComponent;
  481.   NumberBytes: Integer; FromIP: String; Port: Integer);
  482. var RecvStream:TMemoryStream;
  483.     RecvString,RecvNum:String;
  484.     Bcount:integer;
  485. begin
  486. //StatusBar1.Panels[4].Text := 'R: '+inttostr(NumberBytes)+' bytes from '+FromIP;
  487. RecvStream := TMemoryStream.Create;
  488. Try
  489.    Sender1.ReadStream(RecvStream);
  490.    SetLength(RecvString,NumberBytes);
  491.    RecvStream.Read(RecvString[1],NumberBytes);
  492. finally
  493.    RecvStream.Free;
  494.    Bcount := 8;
  495.    while RecvString[Bcount] <> RecvString[NumberBytes] do
  496.    begin
  497.    RecvNum := RecvNum+RecvString[Bcount];
  498.    Bcount := Bcount+1;
  499.    end;
  500.    //showmessage(RecvNum);
  501.    if RecvMessbuffer <> RecvNum then
  502.    begin
  503.    WSmInfo(clNavy,RecvNum,False);
  504.    RecvMessbuffer := RecvNum;
  505.    end;
  506.    SendReMess(FromIP,SmNum.Text,Port);
  507.    //DetedShow(FromIP,Port,RecvNum);
  508. end;
  509. end;
  510. procedure TForm1.BitBtn4Click(Sender: TObject);
  511. begin
  512. IPDeted.Items.Clear;
  513. end;
  514. procedure TForm1.SendReMess(IP,Num:string;Port:integer);
  515. var ReStream:TMemoryStream;
  516.     ri:integer;
  517. begin
  518. ReMess[0] := $02;
  519. ReMess[1] := $02;
  520. ReMess[2] := $00;
  521. ReMess[3] := $00;
  522. ReMess[4] := $79;
  523. ReMess[5] := $0b;
  524. ReMess[6] := $b7;
  525. ReMess[7] := $34;//Number begin
  526. ReMess[8] := $32;
  527. ReMess[9] := $35;
  528. ReMess[10] := $34;
  529. ReMess[11] := $38;
  530. ReMess[12] := $30;
  531. ReMess[13] := $39;//End
  532. ReMess[14] := $03;
  533. ReStream := TMemoryStream.Create;
  534.  Try
  535.    if chudp.Checked then sIngus.StopSnoop;
  536.    for ri := 0 to 6 do ReStream.Write(ReMess[ri],1);
  537.    Restream.Write('20000',5);
  538.    Restream.Write(ReMess[14],1);
  539.    ReSender.RemoteHost := IP;
  540.    ReSender.RemotePort := Port;
  541.    ReSender.SendStream(ReStream);
  542.   Finally
  543.    ReStream.Free;
  544.    if chudp.Checked then sIngus.StartSnoop(ComboBox1.ItemIndex);
  545.   end;
  546. end;
  547. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  548. begin
  549. Shell_NotifyIcon(NIM_DELETE,MainTrayIcon);
  550. end;
  551. procedure Tform1.IPSearchMess(Area:string;RemotePort:integer);
  552. var i1,i2,i3,i4,CNbuffer:integer;
  553. begin
  554. if chudp.Checked then sIngus.StopSnoop;
  555. DeMessStru('20000','001',SearchInfo.caption);
  556. DLab1.Enabled := True;
  557. DLab2.Enabled := True;
  558. IPSearcher.RemotePort := RemotePort;
  559. IPSearcher.LocalPort := 1235;
  560.   try
  561.    for i4 := 0 to 255 do
  562.     begin
  563.    for i1 := 0 to 25 do
  564.      begin
  565.        for i2 := 1 to 10 do
  566.          begin
  567.            for i3 := 1 to 3 do;
  568.              begin
  569.               CNbuffer := i1*10+i2;
  570.               if CNbuffer < 255 then
  571.                 begin
  572.                   IPSearcher.RemoteHost := Area + '.' + inttostr(i4)+'.'+inttostr(CNbuffer);
  573.                   IPSearcher.SendStream(SendStream);
  574.                 end;
  575.              end;
  576.          DLab2.Caption := IPSearcher.RemoteHost;
  577.          DetePro.StepIt;
  578.          end;
  579.       sleep(100);
  580.      end;
  581.      end;
  582.   finally
  583.   SendStream.Free;
  584.   if chudp.Checked then sIngus.StartSnoop(ComboBox1.ItemIndex);
  585.   end;
  586. DLab1.Enabled := False;
  587. DLab2.Enabled := False;
  588. DetePro.Position := 0;
  589. showmessage('对'+Area+'区域的探索已经完成!');
  590. end;
  591. procedure TForm1.BitBtn3Click(Sender: TObject);
  592. begin
  593. IPSearchMess(IPSearchArea.Text,strtoint(IPSearchPort.text));
  594. end;
  595. procedure TForm1.IPSearcherDataReceived(Sender: TComponent;
  596.   NumberBytes: Integer; FromIP: String; Port: Integer);
  597. var RecvStream:TMemoryStream;
  598.     RecvString,RecvNum:String;
  599.     Bcount,i,ibool:integer;
  600.     DeteItem:TListItem;
  601. begin
  602. ibool := 0;
  603. RecvStream := TMemoryStream.Create;
  604. Try
  605.    IPSearcher.ReadStream(RecvStream);
  606.    SetLength(RecvString,NumberBytes);
  607.    RecvStream.Read(RecvString[1],NumberBytes);
  608. finally
  609.    RecvStream.Free;
  610.    Bcount := 8;
  611.    while RecvString[Bcount] <> RecvString[NumberBytes] do
  612.    begin
  613.    RecvNum := RecvNum+RecvString[Bcount];
  614.    Bcount := Bcount+1;
  615.    end;
  616. for i := 0 to IPDeted.Items.count-1 do
  617.  begin
  618.   if FromIP = IPDeted.Items[i].Caption then ibool := 1;
  619.  end;
  620. if ibool = 0 then
  621.  begin
  622.    DeteItem := IPDeted.Items.Add;
  623.    DeteItem.Caption := FromIP;
  624.    DeteItem.SubItems.Add(inttostr(Port));
  625.    DeteItem.SubItems.Add(RecvNum);
  626.  end;
  627. end;
  628. end;
  629. procedure TForm1.Label8Click(Sender: TObject);
  630. begin
  631. ExecuteFile('mailto:tyler_zhong@gre.net.cn','','',0);
  632. end;
  633. procedure TForm1.Label9Click(Sender: TObject);
  634. begin
  635. ExecuteFile('http://leosoft.home.dhs.org','','',0);
  636. end;
  637. procedure TForm1.IPDetedSelectItem(Sender: TObject; Item: TListItem;
  638.   Selected: Boolean);
  639. begin
  640. DetedSb1 := Item.Caption;
  641. DetedSb2 := Item.SubItems[0];
  642. DetedSb3 := Item.SubItems[1];
  643. end;
  644. procedure TForm1.N2Click(Sender: TObject);
  645. begin
  646. SmIp.Text := DetedSb1;
  647. SmPort.Text := DetedSb2;
  648. PageControl1.ActivePageIndex := 0;
  649. end;
  650. procedure TForm1.WEB1Click(Sender: TObject);
  651. var URL : string;
  652. begin
  653. URL :=  'http://search.tencent.com/cgi-bin/friend/user_show_info?ln='+DetedSb3;
  654. ExecuteFile(URL,'','',0);
  655. end;
  656. procedure TForm1.BitBtn5Click(Sender: TObject);
  657. var i1,i2:integer;
  658. begin
  659. PortDeted.Items.Clear;
  660. sleep(1000);
  661. if (strtoint(PDeteB.Text) > strtoint(PDeteE.Text)) or (strtoint(PDeteB.Text)<1) or (strtoint(PDeteE.Text)>65535)  then
  662. begin
  663. showmessage('端口号是1到65535的整数且必须遵循由小至大的顺序');
  664. end
  665. else
  666. if (strtoint(PDeteE.Text)-strtoint(PDeteb.Text)) > 300 then
  667. begin
  668. showmessage('一次最多只能探测300个端口');
  669. end
  670. else
  671. begin
  672. if chudp.Checked then sIngus.StopSnoop;
  673. PDetePro.Max := strtoint(PDeteE.Text)-strtoint(PDeteb.Text);
  674. DeMessStru('20001','001',PSearchMess.caption);
  675. //Label5.Caption := PDeteIP.Text;
  676. PortSearcher.RemoteHost := PDeteIP.Text;
  677. PortSearcher.LocalPort := 1236;
  678.  Try
  679.   for i1 := strtoint(PDeteb.Text) to strtoint(PDeteE.Text) do
  680.    begin
  681.     PortSearcher.RemotePort := i1;
  682.     for i2 := 1 to 3 do
  683.      begin
  684.      PortSearcher.SendStream(SendStream);
  685.      end;
  686.     PDetePro.StepIt;
  687.     sleep(100);
  688.    end;
  689.  Finally
  690.  SendStream.Free;
  691.  PDetePro.Position := 0;
  692.  showmessage('对'+PDeteIP.Text+'的'+PDeteb.Text+'到'+PDeteE.Text+'端口探测已经完成!');
  693.  if chudp.Checked then sIngus.StartSnoop(ComboBox1.ItemIndex);
  694. end;
  695. end;
  696. end;
  697. procedure TForm1.BitBtn6Click(Sender: TObject);
  698. begin
  699. PortDeted.Items.Clear;
  700. end;
  701. procedure TForm1.PortSearcherDataReceived(Sender: TComponent;
  702.   NumberBytes: Integer; FromIP: String; Port: Integer);
  703. var RecvStream:TMemoryStream;
  704.     RecvString,RecvNum:String;
  705.     Bcount,i,ibool:integer;
  706.     DeteItem:TListItem;
  707. begin
  708. ibool := 0;
  709. RecvStream := TMemoryStream.Create;
  710. Try
  711.    PortSearcher.ReadStream(RecvStream);
  712.    SetLength(RecvString,NumberBytes);
  713.    RecvStream.Read(RecvString[1],NumberBytes);
  714. finally
  715.    RecvStream.Free;
  716.    Bcount := 8;
  717.    while RecvString[Bcount] <> RecvString[NumberBytes] do
  718.    begin
  719.    RecvNum := RecvNum+RecvString[Bcount];
  720.    Bcount := Bcount+1;
  721.    end;
  722.    for i := 0 to PortDeted.Items.count-1 do
  723.      begin
  724.       if inttostr(Port) = PortDeted.Items[i].Caption then ibool := 1;
  725.      end;
  726.    if ibool = 0 then
  727.      begin
  728.       DeteItem := PortDeted.Items.Add;
  729.       DeteItem.Caption := inttostr(Port);
  730.       DeteItem.SubItems.Add(RecvNum);
  731.      end;
  732. end;
  733. end;
  734. procedure TForm1.IP1Click(Sender: TObject);
  735. begin
  736. PDeteIP.Text := DetedSb1;
  737. PageControl1.ActivePageIndex := 2;
  738. end;
  739. procedure TForm1.PortDetedSelectItem(Sender: TObject; Item: TListItem;
  740.   Selected: Boolean);
  741. begin
  742. DetedSb1 := PDeteIP.Text;
  743. DetedSb2 := Item.Caption;
  744. DetedSb3 := Item.SubItems[0];
  745. end;
  746. procedure TForm1.N3Click(Sender: TObject);
  747. begin
  748. SmIp.Text := DetedSb1;
  749. SmPort.Text := DetedSb2;
  750. PageControl1.ActivePageIndex := 0;
  751. end;
  752. procedure TForm1.WEB2Click(Sender: TObject);
  753. var URL : string;
  754. begin
  755. URL :=  'http://search.tencent.com/cgi-bin/friend/user_show_info?ln='+DetedSb3;
  756. ExecuteFile(URL,'','',0);
  757. end;
  758. procedure TForm1.OnParsePacketHandle( nPacketSeq: Longint; uBuffer: PChar;
  759.                                       nRecvBytes: integer; sPacket:
  760.                                       TIngusPacketBase );
  761. var
  762.   sMacAddr,DAddr,DPort: string;
  763.   UDPbool,UDPbool2,i:integer;
  764.   sIpPacket: TIngusIPPacket;
  765.   //sIcmpPacket: TIngusICMPPacket;
  766.   sTCPPacket: TIngusTCPPacket;
  767.    nDestPort: integer; //nSrcPort,
  768.   DeteItem,Itembuff:TListItem;
  769. begin
  770.   UDPbool := 0;
  771.   UDPbool2 := 1;
  772.   if sPacket.EthernetProtocol <> PROTO_IP then exit;
  773.   sIPPacket := TIngusIPPacket(sPacket);
  774.   sMacAddr := Format( '网络适配器实时地址: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X',
  775.                       [ UCHAR(sIngus.MacAddr[0]), UCHAR(sIngus.MacAddr[1]),
  776.                         UCHAR(sIngus.MacAddr[2]), UCHAR(sIngus.MacAddr[3]),
  777.                         UCHAR(sIngus.MacAddr[4]), UCHAR(sIngus.MacAddr[5]) ] );
  778.   sTCPPacket := TIngusTCPPacket(sPacket);
  779.   nDestPort := sTCPPacket.DestPort;
  780.   DAddr :=  Format('%u.%u.%u.%u', [ UCHAR((sIPPacket.IPDestAddr)^),
  781.                                                        UCHAR((sIPPacket.IPDestAddr+1)^),
  782.                                                        UCHAR((sIPPacket.IPDestAddr+2)^),
  783.                                                        UCHAR((sIPPacket.IPDestAddr+3)^) ]);
  784.   DPort := inttostr(nDestPort);
  785.   case sIPPacket.IPProtocol of
  786.   17: begin
  787.       UDPbool := 1;
  788.       for i := 0 to FriendList.Items.Count -1 do
  789.          begin
  790.            Itembuff := FriendList.Items[i];
  791.            if (Itembuff.SubItems[0] = DAddr) and (Itembuff.SubItems[1] = DPort) then UDPbool2 := 0;    //and (Itembuff.SubItems[1] <> DPort)
  792.          end;
  793.       //UDPT.caption := 'UDP';
  794.      end;
  795.   end;
  796.   case sPacket.PacketDirection of
  797.   pdInput:
  798.     begin
  799.       //Input;
  800.     end;
  801.   pdOutput:
  802.     begin
  803.          if (UDPbool = 1) and (UDPbool2 = 1) then
  804.            begin
  805.              DeteItem := FriendList.Items.Add;
  806.              DeteItem.Caption := '校验被禁止';
  807.              DeteItem.SubItems.Add(DAddr);
  808.                           DeteItem.SubItems.Add(inttostr(nDestPort));
  809.              postmessage(FriendList.handle, WM_VSCROLL, 1, SB_LINEDOWN);
  810.             end;
  811.     end;
  812.   end;
  813. end;
  814. procedure TForm1.OnAfterGetAdapterDesc(bStatus: Boolean; sAdapterDesc: string);
  815. begin
  816.   //Memo1.Lines.Add('网卡适配器型号: '+sAdapterDesc);
  817. end;
  818. procedure TForm1.OnAfterGetMacAddress(bStatus: Boolean; pMacAddr: PChar);
  819. begin
  820.   //Memo1.Lines.Add(Format( '网卡适配器实时地址: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X',
  821.   //                        [ UCHAR(pMacAddr^), UCHAR((pMacAddr+1)^), UCHAR((pMacAddr+2)^),
  822.   //                          UCHAR((pMacAddr+3)^), UCHAR((pMacAddr+4)^), UCHAR((pMacAddr+5)^) ] ));
  823. end;
  824. procedure TForm1.chudpClick(Sender: TObject);
  825. begin
  826. if  chudp.Checked then
  827.   begin
  828.     showmessage('开始侦测好友号码');
  829.     sIngus.StartSnoop(ComboBox1.ItemIndex);
  830.   end
  831. else
  832.   begin
  833.   sIngus.StopSnoop;
  834.   showmessage('停止侦测好友号码');
  835.   end;
  836. end;
  837. procedure TForm1.FormDestroy(Sender: TObject);
  838. begin
  839. sIngus.Free;
  840. end;
  841. procedure TForm1.BitBtn7Click(Sender: TObject);
  842. begin
  843. FriendList.Items.Clear;
  844. end;
  845. procedure TForm1.FriendListSelectItem(Sender: TObject; Item: TListItem;
  846.   Selected: Boolean);
  847. begin
  848. DetedSb1 := Item.SubItems[0];
  849. DetedSb2 := Item.SubItems[1];
  850. end;
  851. procedure TForm1.N4Click(Sender: TObject);
  852. begin
  853. SmIp.Text := DetedSb1;
  854. SmPort.Text := DetedSb2;
  855. PageControl1.ActivePageIndex := 0;
  856. end;
  857. procedure TForm1.IP2Click(Sender: TObject);
  858. begin
  859. PDeteIP.Text := DetedSb1;
  860. PageControl1.ActivePageIndex := 2;
  861. end;
  862. procedure TForm1.Label23Click(Sender: TObject);
  863. begin
  864. ExecuteFile('http://oqforum.home.dhs.org','','',0);
  865. end;
  866. procedure TForm1.Label27Click(Sender: TObject);
  867. begin
  868. ExecuteFile('http://whocq.yeah.net','','',0);
  869. end;
  870. procedure TForm1.BitBtn8Click(Sender: TObject);
  871. begin
  872. ExecuteFile('help.html','','',0);
  873. end;
  874. procedure TForm1.NetTestTimer(Sender: TObject);
  875. var
  876.   WSData:TWSAData;
  877.   Buffer:array[0..63]of Char;
  878.   HostEnt:PHostEnt;
  879.   PPInAddr:^PInAddr;
  880.   //返回值
  881.   //LocalIP:DWord;
  882.   IPString:String;
  883. begin
  884.   //LocalIP:=0;
  885.   IPString:='';
  886.   WSAStartUp($101,WSData);
  887.   try
  888.     GetHostName(Buffer,SizeOf(Buffer));
  889.     HostEnt:=GetHostByName(Buffer);
  890.     if Assigned(HostEnt) then
  891.     begin
  892.       PPInAddr:=@(PInAddr(HostEnt.H_Addr_List^));
  893.       while Assigned(PPInAddr^) do
  894.       begin
  895.         IPString:=StrPas(INet_NToA(PPInAddr^^));
  896.         //LocalIP:=PPInAddr^^.S_Addr;
  897.         Inc(PPInAddr);
  898.       end;
  899.     end;
  900.   finally
  901.     WSACleanUp;
  902.     if Closebool = 0 then
  903.     begin
  904.     if IPString = '127.0.0.1' then
  905.     begin
  906.     Closebool := 1;
  907.     //Shell_NotifyIcon(NIM_DELETE,MainTrayIcon);
  908.     //Shell_NotifyIcon(NIM_DELETE,MainTrayIcon);
  909.     //sIngus.StopSnoop;
  910.     //sIngus.Free;
  911.     showmessage('尚未连接到网络,无法运行程序!');
  912.     Form1.Close;
  913.     Nettest.Free;
  914.     halt;
  915.     //sleep(2000);
  916.     //halt;
  917.     end;
  918.     end;
  919.     IPLab.caption := '当前此机器的IP地址为:'+IPString;
  920.   end;
  921. end;
  922. end.