www.pudn.com > whocq2src.zip > Unit1.pas


unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  Menus, ComCtrls, StatusBarEx, ExtCtrls, OleCtrls, SHDocVw, StdCtrls, 
  Buttons, FmxUtils, NMUDP, ShellAPI, ImgList,Winsock, ToolWin, 
  Ingusclass, Protohdr, IngusPacket; 
 
const 
  WM_MY_Notify=WM_USER+100; 
 
type 
  SArray = array[$0..$ffff] of integer; 
  TForm1 = class(TForm) 
    MainMenu1: TMainMenu; 
    N1: TMenuItem; 
    StatusBarEx1: TStatusBarEx; 
    Panel1: TPanel; 
    Panel2: TPanel; 
    Adver: TWebBrowser; 
    PageControl1: TPageControl; 
    TabSheet1: TTabSheet; 
    TabSheet2: TTabSheet; 
    TabSheet3: TTabSheet; 
    TabSheet4: TTabSheet; 
    GroupBox1: TGroupBox; 
    GroupBox2: TGroupBox; 
    GroupBox3: TGroupBox; 
    GroupBox4: TGroupBox; 
    BitBtn1: TBitBtn; 
    SmMess: TMemo; 
    SmInfo: TRichEdit; 
    Label1: TLabel; 
    Label2: TLabel; 
    SmIp: TEdit; 
    SmPort: TEdit; 
    Label3: TLabel; 
    SmNum: TEdit; 
    Label4: TLabel; 
    SmFace: TComboBox; 
    CheckBox1: TCheckBox; 
    BitBtn2: TBitBtn; 
    Sender1: TNMUDP; 
    Timer1: TTimer; 
    CheckBox2: TCheckBox; 
    PopupMenu1: TPopupMenu; 
    TrayPop: TMenuItem; 
    N21: TMenuItem; 
    Image1: TImage; 
    GroupBox5: TGroupBox; 
    Label5: TLabel; 
    IPSearchArea: TEdit; 
    Label6: TLabel; 
    IPSearchPort: TEdit; 
    GroupBox6: TGroupBox; 
    IPDeted: TListView; 
    ImageList1: TImageList; 
    BitBtn3: TBitBtn; 
    BitBtn4: TBitBtn; 
    GroupBox7: TGroupBox; 
    IPSearcher: TNMUDP; 
    ReSender: TNMUDP; 
    SearchInfo: TLabel; 
    DetePro: TProgressBar; 
    DLab1: TLabel; 
    DLab2: TLabel; 
    DetedPop: TPopupMenu; 
    TabSheet5: TTabSheet; 
    Image2: TImage; 
    TabSheet6: TTabSheet; 
    N2: TMenuItem; 
    WEB1: TMenuItem; 
    GroupBox8: TGroupBox; 
    Label10: TLabel; 
    PDeteIP: TEdit; 
    Label11: TLabel; 
    PDeteB: TEdit; 
    Label12: TLabel; 
    PDeteE: TEdit; 
    GroupBox9: TGroupBox; 
    PortDeted: TListView; 
    GroupBox10: TGroupBox; 
    BitBtn6: TBitBtn; 
    Label13: TLabel; 
    BitBtn5: TBitBtn; 
    Label14: TLabel; 
    Label15: TLabel; 
    PDetePro: TProgressBar; 
    PortSearcher: TNMUDP; 
    PSearchMess: TLabel; 
    IP1: TMenuItem; 
    PopupMenu2: TPopupMenu; 
    N3: TMenuItem; 
    WEB2: TMenuItem; 
    GroupBox11: TGroupBox; 
    GroupBox12: TGroupBox; 
    Label7: TLabel; 
    ComboBox1: TComboBox; 
    chudp: TCheckBox; 
    GroupBox13: TGroupBox; 
    FriendList: TListView; 
    CheckBox4: TCheckBox; 
    BitBtn7: TBitBtn; 
    GroupBox14: TGroupBox; 
    Memo1: TMemo; 
    FLPop: TPopupMenu; 
    IP2: TMenuItem; 
    N4: TMenuItem; 
    Label17: TLabel; 
    Label18: TLabel; 
    Label19: TLabel; 
    Label8: TLabel; 
    Label20: TLabel; 
    Label9: TLabel; 
    Label21: TLabel; 
    Label22: TLabel; 
    Label23: TLabel; 
    Label24: TLabel; 
    Label25: TLabel; 
    Label26: TLabel; 
    BitBtn8: TBitBtn; 
    IPLab: TLabel; 
    Label27: TLabel; 
    GroupBox15: TGroupBox; 
    Label16: TLabel; 
    Label28: TLabel; 
    Edit1: TEdit; 
    Edit2: TEdit; 
    GroupBox16: TGroupBox; 
    Label29: TLabel; 
    Label30: TLabel; 
    Edit3: TEdit; 
    ComboBox2: TComboBox; 
    CheckBox3: TCheckBox; 
    CheckBox5: TCheckBox; 
    GroupBox17: TGroupBox; 
    Memo2: TMemo; 
    GroupBox18: TGroupBox; 
    BitBtn9: TBitBtn; 
    BitBtn10: TBitBtn; 
    ListView1: TListView; 
    NetTest: TTimer; 
 
    procedure FormCreate(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    procedure BitBtn2Click(Sender: TObject); 
    procedure BitBtn1Click(Sender: TObject); 
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
    procedure Sender1DataReceived(Sender: TComponent; NumberBytes: Integer; 
      FromIP: String; Port: Integer); 
    procedure BitBtn4Click(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure BitBtn3Click(Sender: TObject); 
    procedure IPSearcherDataReceived(Sender: TComponent; 
      NumberBytes: Integer; FromIP: String; Port: Integer); 
    procedure Label8Click(Sender: TObject); 
    procedure Label9Click(Sender: TObject); 
    procedure IPDetedSelectItem(Sender: TObject; Item: TListItem; 
      Selected: Boolean); 
    procedure N2Click(Sender: TObject); 
    procedure WEB1Click(Sender: TObject); 
    procedure BitBtn5Click(Sender: TObject); 
    procedure BitBtn6Click(Sender: TObject); 
    procedure PortSearcherDataReceived(Sender: TComponent; 
      NumberBytes: Integer; FromIP: String; Port: Integer); 
    procedure IP1Click(Sender: TObject); 
    procedure PortDetedSelectItem(Sender: TObject; Item: TListItem; 
      Selected: Boolean); 
    procedure N3Click(Sender: TObject); 
    procedure WEB2Click(Sender: TObject); 
    procedure chudpClick(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure BitBtn7Click(Sender: TObject); 
    procedure FriendListSelectItem(Sender: TObject; Item: TListItem; 
      Selected: Boolean); 
    procedure N4Click(Sender: TObject); 
    procedure IP2Click(Sender: TObject); 
    procedure Label23Click(Sender: TObject); 
    procedure Label27Click(Sender: TObject); 
    procedure BitBtn8Click(Sender: TObject); 
    procedure NetTestTimer(Sender: TObject); 
 
 
     
//        function GetComputerName(IP:string):string; 
     
  private 
    { Private declarations } 
    TBRect: TRect; 
    sIngus: TIngusSniffer; 
    procedure GetAdve; 
    procedure SetTrayIcon(WIcon:hwnd; Job:Integer); 
    procedure MainTrayIconClick(var msg : TMessage); Message WM_My_Notify; 
    procedure DeMessStru(Num,Face,Mess:string); //消息结构定义 
    procedure SendMess1(IP,Num,Face,Mess:string;Port,LocalPort:integer);//定向单信息发送 
    procedure SendReMess(IP,Num:string;Port:integer); 
    procedure IPSearchMess(Area:string;RemotePort:integer); 
    procedure WSmInfo(color:Tcolor;mess:string;bold:boolean); 
    procedure WMNcPaint(var m: TMessage);message WM_NCPAINT; // 当画标题栏时进入该过程 
    procedure DrawCaptionBtn(uEdge: UINT); 
    procedure WMNcActivate(var m: TMessage);message WM_NCACTIVATE;// 当标题栏在激活与非激活之间切换时进入该过程 
    procedure WMNcLButtonDown(var m: TMessage);message WM_NCLBUTTONDOWN;// 当在标题栏上按下鼠标左按钮时进入该过程 
    procedure WMNcLButtonUp(var m: TMessage);message WM_NCLBUTTONUP;// 当在标题栏上放开鼠标左按钮时进入该过程 
 
  public 
    { Public declarations } 
    procedure OnParsePacketHandle( nPacketSeq: Longint; uBuffer: PChar; 
                                   nRecvBytes: integer; sPacket: TIngusPacketBase ); 
    procedure OnAfterGetMacAddress(bStatus: Boolean; pMacAddr: PChar); 
    procedure OnAfterGetAdapterDesc(bStatus: Boolean; sAdapterDesc: string); 
    end; 
 
var 
  Form1 : TForm1; 
  MainTrayIcon: PNotifyIconDataA; 
  MessStru,ReMess : SArray; //消息结构数组 
  SendStream : TMemoryStream; 
  Rzz : integer;  //随机数种子 
  DetedSb1,DetedSb2,DetedSb3:string; 
  RecvMessbuffer:string; 
  Closebool : integer; 
implementation 
 
{$R *.DFM} 
 
 
procedure TForm1.GetAdve; 
var 
  Flags: OLEVariant; 
begin 
Flags := 0; 
Adver.Navigate(WideString('http://www.coolfan.net'), Flags, Flags, Flags, Flags); 
 
end; 
 
 
procedure TForm1.DeMessStru(Num,Face,Mess:string); 
var i,RandBuff : integer; 
    DebugStr : string; 
begin 
MessStru[0] := $02;//HEADER 
MessStru[1] := $03; 
MessStru[2] := $0a; 
MessStru[3] := $00; 
MessStru[4] := $78; 
MessStru[5] := $3a;//MESSAGE CHANGE 
MessStru[6] := $2b; 
MessStru[7] := $34;//ICQ Number 
MessStru[8] := $33; 
MessStru[9] := $30; 
MessStru[10] := $34; 
MessStru[11] := $34; 
MessStru[12] := $36;//^^^ 
MessStru[13] := $1f;//Split 
MessStru[14] := $30; 
MessStru[15] := $1f;//Split 
MessStru[16] := $31;//Face 
MessStru[17] := $37; 
MessStru[18] := $32;//^^^ 
MessStru[19] := $1f; 
MessStru[20] := $33; 
MessStru[21] := $30; 
MessStru[22] := $30; 
MessStru[23] := $30; 
MessStru[24] := $2d; 
MessStru[25] := $30; 
MessStru[26] := $39; 
MessStru[27] := $2d; 
MessStru[28] := $30; 
MessStru[29] := $36; 
MessStru[30] := $1f; 
MessStru[31] := $30; 
MessStru[32] := $38; 
MessStru[33] := $3a; 
MessStru[34] := $34; 
MessStru[35] := $39; 
MessStru[36] := $3a; 
MessStru[37] := $31; 
MessStru[38] := $33; 
MessStru[39] := $1f; 
MessStru[40] := $50; 
MessStru[41] := $03; 
 
SendStream := TMemoryStream.Create; 
for i := 0 to 4 do SendStream.Write(MessStru[i],1); 
RandBuff := Random(Rzz); 
RandBuff := Random(Rzz); 
RandBuff := Random(Rzz); 
//showmessage(inttostr(RandBuff)); 
SendStream.Write(RandBuff,1); 
RandBuff := Random(Rzz); 
SendStream.Write(RandBuff,1); 
DebugStr := inttostr(Length(Num)); 
//showmessage(DebugStr); 
SendStream.Write(Num[1],Length(Num)); 
for i := 13 to 15 do SendStream.Write(MessStru[i],1); 
SendStream.Write(Face[1],Length(Face)); 
for i := 19 to 39 do SendStream.Write(MessStru[i],1); 
SendStream.Write(Mess[1],Length(Mess)); 
SendStream.Write(MessStru[41],1); 
end; 
 
 
procedure TForm1.SendMess1(IP,Num,Face,Mess:string;Port,LocalPort:integer); 
 
begin 
DeMessStru(Num,Face,Mess); 
Sender1.RemoteHost := IP; 
Sender1.RemotePort := Port; 
Sender1.LocalPort  := LocalPort; 
//showMessage 
  try 
     Sender1.SendStream(SendStream); 
  finally 
    SendStream.Free; 
  end; 
end; 
 
 
procedure TForm1.WSmInfo(color:Tcolor;mess:string;bold:boolean); 
var n:integer; 
begin 
n := Length(mess); 
SmInfo.Lines.Add(mess); 
SmInfo.SelLength:=-n-2; 
if bold then SmInfo.SelAttributes.Style :=[fsBold]; 
SmInfo.SelAttributes.Color:=color; 
postmessage(SmInfo.handle, WM_VSCROLL, 1, SB_LINEDOWN); 
end; 
 
 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
Closebool := 0; 
//SetTrayIcon(Form1.Icon.Handle,0); 
//SetTrayIcon(Form1.Icon.Handle,0); 
//SetTrayIcon(Form1.Icon.Handle,0); 
SetTrayIcon(Form1.Icon.Handle,0); 
DrawCaptionBtn(EDGE_RAISED); 
GetAdve; 
RecvMessbuffer := ''; 
Rzz := 13; 
 
//Sniff INI 
  sIngus := TIngusSniffer.Create; 
  sIngus.OnParsePacket := OnParsePacketHandle; 
  //sIngus.OnAfterGetAdapterDesc := OnAfterGetAdapterDesc; 
  //sIngus.OnAfterGetMacAddress := OnAfterGetMacAddress; 
  ComboBox1.Items.Assign(sIngus.AdapterNameList); 
  ComboBox1.ItemIndex := 0; 
 
 
end; 
 
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
if Rzz < $100 then Rzz := Rzz +1 
else Rzz := 13; 
end; 
 
procedure TForm1.BitBtn2Click(Sender: TObject); 
begin 
SendMess1(SmIp.Text,SmNum.Text,SmFace.Text,SmMess.Text,strtoint(SmPort.Text),1234); 
WSmInfo(clGreen,'消息已经发往:'+SmIp.Text,False); 
if CheckBox2.Checked = True then SmMess.Clear; 
end; 
 
procedure TForm1.BitBtn1Click(Sender: TObject); 
begin 
//SetTrayIcon(Form1.Icon.Handle,0); 
SmInfo.Clear; 
end; 
 
procedure TForm1.SetTrayIcon (WIcon:hwnd; Job:Integer); 
begin 
if Job = 0 then 
begin 
NEW(MainTrayIcon); 
MainTrayIcon^.Wnd := Form1.Handle; 
MainTrayIcon^.uID := 0; 
MainTrayIcon^.uFlags := NIF_ICON+NIF_MESSAGE+NIF_TIP; 
MainTrayIcon^.hIcon := WIcon; 
MainTrayIcon^.uCallbackMessage := WM_MY_Notify; 
MainTrayIcon^.szTip := 'Left Click hide or restore WhoCQ window! Right Click pop Menu'; 
//showmessage(inttostr(Form1.Handle)+'/'+inttostr(NIF_ICON+NIF_MESSAGE+NIF_TIP)+'/'+inttostr(WIcon)); 
Shell_NotifyIcon(NIM_ADD,MainTrayIcon); 
end; 
 
if Job = 2 then 
begin 
Shell_NotifyIcon(NIM_DELETE,MainTrayIcon); 
end; 
end; 
 
 
procedure TForm1.MainTrayIconClick(var msg : TMessage); 
var p:TPoint; 
begin 
 try 
     case msg.LParam of 
      WM_LBUTTONDOWN: 
        begin 
        GetCursorPos(p); 
        TrayPop.Checked := not TrayPop.Checked; 
        if TrayPop.Checked = False then 
        begin 
        Form1.show; 
        Application.Restore; 
        SendMessage(Handle,WM_NCACTIVATE,HTCaption,GetMessagePos); 
        end 
        else 
        begin 
 
        //Application.Minimize; 
        //SetWindowLong(Application.handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW); 
        Form1.hide; 
        end; 
        end; 
      WM_RBUTTONDOWN: 
        begin 
        GetCursorPos(p); 
        PopupMenu1.Popup(p.x,p.y); 
        end; 
      WM_LBUTTONDBLCLK: 
        begin 
        //ShowMessage('LBDD'); 
        end; 
      WM_RBUTTONDBLCLk: 
        begin 
        //ShowMessage('RBDD'); 
        end; 
     end; 
 except 
 end; 
end; 
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
Shell_NotifyIcon(NIM_DELETE,MainTrayIcon); 
sIngus.StopSnoop; 
 
//SetTrayIcon(Form1.Icon.Handle,2); 
end; 
 
 
 
procedure TForm1.DrawCaptionBtn(uEdge: UINT); 
var 
   hCaptionDC: HDC; // 标题条Device Context 
   //hOldFont: HFONT; // 原来的字体 
   r: TRect; 
begin 
     hCaptionDC := GetWindowDC(Self.Handle); 
          // 注意不能用GetDC,那样的话,将得不到标题栏 
          // 的设备上下文 
          //画按钮的样子,如果uEdge=EDGE_RAIS, 
          //则画出的样子为凸起;如果 
          //uEdge=EDGE_SUNKEN,则画出的样子为凹下。 
     DrawEdge(hCaptionDC, TBRect, uEdge, BF_RECT or BF_MIDDLE or BF_SOFT); 
           //设置标题栏的设备上下文为透明状态 
     SetBkMode(hCaptionDC, TRANSPARENT); 
           //设置标题栏设备上下文的字体 
           //hOldFont:= SelectObject(hCaptionDC, CBBtnFont.Handle); 
           //画按钮 
     if uEdge = EDGE_RAISED then 
        begin 
        SetRect(TBRect,459,5,475,19); 
        DrawText(hCaptionDC, '*',1, TBRect, DT_CENTER); 
        end 
     else begin 
        r := TBRect; 
        SetRect(r,459,5,475,19); 
        OffsetRect(r, 1, 1); 
        DrawText(hCaptionDC, '*', 1, r, DT_CENTER); 
     end; 
            //还原为原来的字体 
            //SelectObject(hCaptionDC, hOldFont); 
end; 
 
procedure TForm1.WMNcActivate(var m: TMessage); 
begin 
     inherited; 
     DrawCaptionBtn(EDGE_RAISED); 
end; 
 
procedure TForm1.WMNcPaint(var m: TMessage); 
begin 
     inherited; 
     DrawCaptionBtn(EDGE_RAISED); 
end; 
 
procedure TForm1.WMNcLButtonDown(var m: TMessage); 
var 
   p: TPoint; 
begin 
     p.x := LOWORD(m.lParam) - Self.Left; 
     p.y := HIWORD(m.lParam) - Self.Top; 
     if PtInRect(TBRect, p) then  // 如果按在了按钮区域 
     begin 
        Self.BringToFront; 
        DrawCaptionBtn(EDGE_SUNKEN); 
     end 
     else 
        inherited; // 执行默认的操作 
end; 
 
procedure TForm1.WMNcLButtonUp(var m: TMessage); 
var 
   p: TPoint; 
begin 
     p.x := LOWORD(m.lParam) - Self.Left; 
     p.y := HIWORD(m.lParam) - Self.Top; 
     if PtInRect(TBRect, p) then //如果在标题栏按钮区域释放鼠标 
     begin 
        DrawCaptionBtn(EDGE_RAISED); 
        Form1.hide; 
     end 
     else 
        inherited; // 执行默认的操作 
end; 
 
 
 
procedure TForm1.Sender1DataReceived(Sender: TComponent; 
  NumberBytes: Integer; FromIP: String; Port: Integer); 
var RecvStream:TMemoryStream; 
    RecvString,RecvNum:String; 
    Bcount:integer; 
begin 
//StatusBar1.Panels[4].Text := 'R: '+inttostr(NumberBytes)+' bytes from '+FromIP; 
RecvStream := TMemoryStream.Create; 
Try 
   Sender1.ReadStream(RecvStream); 
   SetLength(RecvString,NumberBytes); 
   RecvStream.Read(RecvString[1],NumberBytes); 
 
finally 
   RecvStream.Free; 
   Bcount := 8; 
   while RecvString[Bcount] <> RecvString[NumberBytes] do 
   begin 
   RecvNum := RecvNum+RecvString[Bcount]; 
   Bcount := Bcount+1; 
   end; 
   //showmessage(RecvNum); 
   if RecvMessbuffer <> RecvNum then 
   begin 
   WSmInfo(clNavy,RecvNum,False); 
   RecvMessbuffer := RecvNum; 
   end; 
   SendReMess(FromIP,SmNum.Text,Port); 
   //DetedShow(FromIP,Port,RecvNum); 
end; 
end; 
 
procedure TForm1.BitBtn4Click(Sender: TObject); 
begin 
IPDeted.Items.Clear; 
end; 
 
procedure TForm1.SendReMess(IP,Num:string;Port:integer); 
var ReStream:TMemoryStream; 
    ri:integer; 
begin 
ReMess[0] := $02; 
ReMess[1] := $02; 
ReMess[2] := $00; 
ReMess[3] := $00; 
ReMess[4] := $79; 
ReMess[5] := $0b; 
ReMess[6] := $b7; 
ReMess[7] := $34;//Number begin 
ReMess[8] := $32; 
ReMess[9] := $35; 
ReMess[10] := $34; 
ReMess[11] := $38; 
ReMess[12] := $30; 
ReMess[13] := $39;//End 
ReMess[14] := $03; 
ReStream := TMemoryStream.Create; 
 Try 
   if chudp.Checked then sIngus.StopSnoop; 
   for ri := 0 to 6 do ReStream.Write(ReMess[ri],1); 
   Restream.Write('20000',5); 
   Restream.Write(ReMess[14],1); 
   ReSender.RemoteHost := IP; 
   ReSender.RemotePort := Port; 
   ReSender.SendStream(ReStream); 
  Finally 
   ReStream.Free; 
   if chudp.Checked then sIngus.StartSnoop(ComboBox1.ItemIndex); 
  end; 
end; 
 
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
Shell_NotifyIcon(NIM_DELETE,MainTrayIcon); 
end; 
 
procedure Tform1.IPSearchMess(Area:string;RemotePort:integer); 
var i1,i2,i3,i4,CNbuffer:integer; 
 
begin 
if chudp.Checked then sIngus.StopSnoop; 
DeMessStru('20000','001',SearchInfo.caption); 
DLab1.Enabled := True; 
DLab2.Enabled := True; 
IPSearcher.RemotePort := RemotePort; 
IPSearcher.LocalPort := 1235; 
  try 
   for i4 := 0 to 255 do 
    begin 
   for i1 := 0 to 25 do 
     begin 
       for i2 := 1 to 10 do 
         begin 
           for i3 := 1 to 3 do; 
             begin 
              CNbuffer := i1*10+i2; 
              if CNbuffer < 255 then 
                begin 
                  IPSearcher.RemoteHost := Area + '.' + inttostr(i4)+'.'+inttostr(CNbuffer); 
                  IPSearcher.SendStream(SendStream); 
                end; 
             end; 
         DLab2.Caption := IPSearcher.RemoteHost; 
         DetePro.StepIt; 
         end; 
      sleep(100); 
     end; 
     end; 
  finally 
  SendStream.Free; 
  if chudp.Checked then sIngus.StartSnoop(ComboBox1.ItemIndex); 
  end; 
DLab1.Enabled := False; 
DLab2.Enabled := False; 
DetePro.Position := 0; 
showmessage('对'+Area+'区域的探索已经完成!'); 
end; 
 
 
 
 
 
procedure TForm1.BitBtn3Click(Sender: TObject); 
begin 
 
IPSearchMess(IPSearchArea.Text,strtoint(IPSearchPort.text)); 
 
end; 
 
procedure TForm1.IPSearcherDataReceived(Sender: TComponent; 
  NumberBytes: Integer; FromIP: String; Port: Integer); 
var RecvStream:TMemoryStream; 
    RecvString,RecvNum:String; 
    Bcount,i,ibool:integer; 
    DeteItem:TListItem; 
begin 
ibool := 0; 
RecvStream := TMemoryStream.Create; 
Try 
   IPSearcher.ReadStream(RecvStream); 
   SetLength(RecvString,NumberBytes); 
   RecvStream.Read(RecvString[1],NumberBytes); 
 
finally 
   RecvStream.Free; 
   Bcount := 8; 
   while RecvString[Bcount] <> RecvString[NumberBytes] do 
   begin 
   RecvNum := RecvNum+RecvString[Bcount]; 
   Bcount := Bcount+1; 
   end; 
for i := 0 to IPDeted.Items.count-1 do 
 begin 
  if FromIP = IPDeted.Items[i].Caption then ibool := 1; 
 end; 
if ibool = 0 then 
 begin 
   DeteItem := IPDeted.Items.Add; 
   DeteItem.Caption := FromIP; 
   DeteItem.SubItems.Add(inttostr(Port)); 
   DeteItem.SubItems.Add(RecvNum); 
 end; 
end; 
end; 
 
procedure TForm1.Label8Click(Sender: TObject); 
begin 
ExecuteFile('mailto:tyler_zhong@gre.net.cn','','',0); 
end; 
 
procedure TForm1.Label9Click(Sender: TObject); 
begin 
ExecuteFile('http://www.coolfan.net','','',0); 
end; 
 
procedure TForm1.IPDetedSelectItem(Sender: TObject; Item: TListItem; 
  Selected: Boolean); 
begin 
DetedSb1 := Item.Caption; 
DetedSb2 := Item.SubItems[0]; 
DetedSb3 := Item.SubItems[1]; 
end; 
 
procedure TForm1.N2Click(Sender: TObject); 
begin 
SmIp.Text := DetedSb1; 
SmPort.Text := DetedSb2; 
PageControl1.ActivePageIndex := 0; 
end; 
 
procedure TForm1.WEB1Click(Sender: TObject); 
var URL : string; 
begin 
URL :=  'http://search.tencent.com/cgi-bin/friend/user_show_info?ln='+DetedSb3; 
ExecuteFile(URL,'','',0); 
end; 
 
 
 
procedure TForm1.BitBtn5Click(Sender: TObject); 
var i1,i2:integer; 
begin 
PortDeted.Items.Clear; 
sleep(1000); 
if (strtoint(PDeteB.Text) > strtoint(PDeteE.Text)) or (strtoint(PDeteB.Text)<1) or (strtoint(PDeteE.Text)>65535)  then 
begin 
showmessage('端口号是1到65535的整数且必须遵循由小至大的顺序'); 
end 
else 
if (strtoint(PDeteE.Text)-strtoint(PDeteb.Text)) > 300 then 
begin 
showmessage('一次最多只能探测300个端口'); 
end 
else 
begin 
if chudp.Checked then sIngus.StopSnoop; 
PDetePro.Max := strtoint(PDeteE.Text)-strtoint(PDeteb.Text); 
DeMessStru('20001','001',PSearchMess.caption); 
//Label5.Caption := PDeteIP.Text; 
PortSearcher.RemoteHost := PDeteIP.Text; 
PortSearcher.LocalPort := 1236; 
 Try 
  for i1 := strtoint(PDeteb.Text) to strtoint(PDeteE.Text) do 
   begin 
    PortSearcher.RemotePort := i1; 
    for i2 := 1 to 3 do 
     begin 
     PortSearcher.SendStream(SendStream); 
     end; 
    PDetePro.StepIt; 
    sleep(100); 
   end; 
 Finally 
 SendStream.Free; 
 PDetePro.Position := 0; 
 showmessage('对'+PDeteIP.Text+'的'+PDeteb.Text+'到'+PDeteE.Text+'端口探测已经完成!'); 
 if chudp.Checked then sIngus.StartSnoop(ComboBox1.ItemIndex); 
end; 
end; 
end; 
 
procedure TForm1.BitBtn6Click(Sender: TObject); 
begin 
PortDeted.Items.Clear; 
end; 
 
procedure TForm1.PortSearcherDataReceived(Sender: TComponent; 
  NumberBytes: Integer; FromIP: String; Port: Integer); 
var RecvStream:TMemoryStream; 
    RecvString,RecvNum:String; 
    Bcount,i,ibool:integer; 
    DeteItem:TListItem; 
begin 
ibool := 0; 
RecvStream := TMemoryStream.Create; 
Try 
   PortSearcher.ReadStream(RecvStream); 
   SetLength(RecvString,NumberBytes); 
   RecvStream.Read(RecvString[1],NumberBytes); 
finally 
   RecvStream.Free; 
   Bcount := 8; 
   while RecvString[Bcount] <> RecvString[NumberBytes] do 
   begin 
   RecvNum := RecvNum+RecvString[Bcount]; 
   Bcount := Bcount+1; 
   end; 
   for i := 0 to PortDeted.Items.count-1 do 
     begin 
      if inttostr(Port) = PortDeted.Items[i].Caption then ibool := 1; 
     end; 
   if ibool = 0 then 
     begin 
      DeteItem := PortDeted.Items.Add; 
      DeteItem.Caption := inttostr(Port); 
      DeteItem.SubItems.Add(RecvNum); 
     end; 
end; 
end; 
 
procedure TForm1.IP1Click(Sender: TObject); 
begin 
PDeteIP.Text := DetedSb1; 
PageControl1.ActivePageIndex := 2; 
end; 
 
procedure TForm1.PortDetedSelectItem(Sender: TObject; Item: TListItem; 
  Selected: Boolean); 
begin 
DetedSb1 := PDeteIP.Text; 
DetedSb2 := Item.Caption; 
DetedSb3 := Item.SubItems[0]; 
end; 
 
procedure TForm1.N3Click(Sender: TObject); 
begin 
SmIp.Text := DetedSb1; 
SmPort.Text := DetedSb2; 
PageControl1.ActivePageIndex := 0; 
end; 
 
procedure TForm1.WEB2Click(Sender: TObject); 
var URL : string; 
begin 
URL :=  'http://search.tencent.com/cgi-bin/friend/user_show_info?ln='+DetedSb3; 
ExecuteFile(URL,'','',0); 
end; 
 
 
 
 
 
procedure TForm1.OnParsePacketHandle( nPacketSeq: Longint; uBuffer: PChar; 
                                      nRecvBytes: integer; sPacket: 
                                      TIngusPacketBase ); 
var 
  sMacAddr,DAddr,DPort: string; 
  UDPbool,UDPbool2,i:integer; 
  sIpPacket: TIngusIPPacket; 
  //sIcmpPacket: TIngusICMPPacket; 
  sTCPPacket: TIngusTCPPacket; 
   nDestPort: integer; //nSrcPort, 
  DeteItem,Itembuff:TListItem; 
begin 
  UDPbool := 0; 
  UDPbool2 := 1; 
  if sPacket.EthernetProtocol <> PROTO_IP then exit; 
  sIPPacket := TIngusIPPacket(sPacket); 
 
  sMacAddr := Format( '网络适配器实时地址: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X', 
                      [ UCHAR(sIngus.MacAddr[0]), UCHAR(sIngus.MacAddr[1]), 
                        UCHAR(sIngus.MacAddr[2]), UCHAR(sIngus.MacAddr[3]), 
                        UCHAR(sIngus.MacAddr[4]), UCHAR(sIngus.MacAddr[5]) ] ); 
  sTCPPacket := TIngusTCPPacket(sPacket); 
  nDestPort := sTCPPacket.DestPort; 
  DAddr :=  Format('%u.%u.%u.%u', [ UCHAR((sIPPacket.IPDestAddr)^), 
                                                       UCHAR((sIPPacket.IPDestAddr+1)^), 
                                                       UCHAR((sIPPacket.IPDestAddr+2)^), 
                                                       UCHAR((sIPPacket.IPDestAddr+3)^) ]); 
  DPort := inttostr(nDestPort); 
  case sIPPacket.IPProtocol of 
  17: begin 
      UDPbool := 1; 
      for i := 0 to FriendList.Items.Count -1 do 
         begin 
           Itembuff := FriendList.Items[i]; 
           if (Itembuff.SubItems[0] = DAddr) and (Itembuff.SubItems[1] = DPort) then UDPbool2 := 0;    //and (Itembuff.SubItems[1] <> DPort) 
         end; 
      //UDPT.caption := 'UDP'; 
     end; 
  end; 
 
  case sPacket.PacketDirection of 
  pdInput: 
    begin 
      //Input; 
    end; 
  pdOutput: 
    begin 
         if (UDPbool = 1) and (UDPbool2 = 1) then 
           begin 
             DeteItem := FriendList.Items.Add; 
             DeteItem.Caption := '校验被禁止'; 
             DeteItem.SubItems.Add(DAddr); 
                          DeteItem.SubItems.Add(inttostr(nDestPort)); 
             postmessage(FriendList.handle, WM_VSCROLL, 1, SB_LINEDOWN); 
            end; 
    end; 
  end; 
 
end; 
 
procedure TForm1.OnAfterGetAdapterDesc(bStatus: Boolean; sAdapterDesc: string); 
begin 
  //Memo1.Lines.Add('网卡适配器型号: '+sAdapterDesc); 
end; 
 
procedure TForm1.OnAfterGetMacAddress(bStatus: Boolean; pMacAddr: PChar); 
begin 
  //Memo1.Lines.Add(Format( '网卡适配器实时地址: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X', 
  //                        [ UCHAR(pMacAddr^), UCHAR((pMacAddr+1)^), UCHAR((pMacAddr+2)^), 
  //                          UCHAR((pMacAddr+3)^), UCHAR((pMacAddr+4)^), UCHAR((pMacAddr+5)^) ] )); 
end; 
 
 
procedure TForm1.chudpClick(Sender: TObject); 
begin 
if  chudp.Checked then 
  begin 
    showmessage('开始侦测好友号码'); 
    sIngus.StartSnoop(ComboBox1.ItemIndex); 
  end 
else 
  begin 
  sIngus.StopSnoop; 
  showmessage('停止侦测好友号码'); 
  end; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
sIngus.Free; 
end; 
 
 
procedure TForm1.BitBtn7Click(Sender: TObject); 
begin 
FriendList.Items.Clear; 
end; 
 
procedure TForm1.FriendListSelectItem(Sender: TObject; Item: TListItem; 
  Selected: Boolean); 
begin 
DetedSb1 := Item.SubItems[0]; 
DetedSb2 := Item.SubItems[1]; 
end; 
 
procedure TForm1.N4Click(Sender: TObject); 
begin 
SmIp.Text := DetedSb1; 
SmPort.Text := DetedSb2; 
PageControl1.ActivePageIndex := 0; 
end; 
 
procedure TForm1.IP2Click(Sender: TObject); 
begin 
PDeteIP.Text := DetedSb1; 
PageControl1.ActivePageIndex := 2; 
end; 
 
procedure TForm1.Label23Click(Sender: TObject); 
begin 
ExecuteFile('http://www.coolfan.net','','',0); 
end; 
 
 
 
procedure TForm1.Label27Click(Sender: TObject); 
begin 
ExecuteFile('http://www.coolfan.net','','',0); 
end; 
 
procedure TForm1.BitBtn8Click(Sender: TObject); 
begin 
ExecuteFile('help.html','','',0); 
end; 
 
procedure TForm1.NetTestTimer(Sender: TObject); 
var 
  WSData:TWSAData; 
  Buffer:array[0..63]of Char; 
  HostEnt:PHostEnt; 
  PPInAddr:^PInAddr; 
  //返回值 
  //LocalIP:DWord; 
  IPString:String; 
begin 
 
  //LocalIP:=0; 
  IPString:=''; 
  WSAStartUp($101,WSData); 
  try 
    GetHostName(Buffer,SizeOf(Buffer)); 
    HostEnt:=GetHostByName(Buffer); 
    if Assigned(HostEnt) then 
    begin 
      PPInAddr:=@(PInAddr(HostEnt.H_Addr_List^)); 
      while Assigned(PPInAddr^) do 
      begin 
        IPString:=StrPas(INet_NToA(PPInAddr^^)); 
        //LocalIP:=PPInAddr^^.S_Addr; 
        Inc(PPInAddr); 
      end; 
    end; 
  finally 
    WSACleanUp; 
    if Closebool = 0 then 
    begin 
    if IPString = '127.0.0.1' then 
    begin 
    Closebool := 1; 
    //Shell_NotifyIcon(NIM_DELETE,MainTrayIcon); 
    //Shell_NotifyIcon(NIM_DELETE,MainTrayIcon); 
    //sIngus.StopSnoop; 
    //sIngus.Free; 
 
    showmessage('尚未连接到网络,无法运行程序!'); 
    Form1.Close; 
    Nettest.Free; 
    halt; 
    //sleep(2000); 
    //halt; 
    end; 
    end; 
    IPLab.caption := '当前此机器的IP地址为:'+IPString; 
  end; 
 
end; 
 
end.