关注!我也知道是UDP方式,但具体的包结构不知????

解决方案 »

  1.   

    主  题:追捕的OICQ探测技术 ---冯志宏 [撰稿]
    作  者:pgcat
    所属论坛:灌水乐园
    问题点数:100
    回复次数:33
    发表时间:2001-2-16 14:54:00
     
    实际上目前所有的OICQ探测方法都一样,发送一个OICQ消息给对方,凭借OICQ 
    的返回信息来判断对方的OICQ号码,具体的DELPHI实现如下: 
    NMUDP1是ICS控件包的UDP控件。 NMUDP1.ReportLevel := Status_Basic; 
    NMUDP1.RemoteHost := edit1.Text; 
    NMUDP1.RemotePort := 4000; UdpTmpStr :=#$02 +#$03 +#$0a +#$00 +#$78 +#13 +#$A 
    + '88888' +#$1f +#$30 +#$1f + #$33 + #$39 +#$1f 
    +FormatDateTime('yyyy-mm-dd',now) 
    +#$1f 
    +FormatDateTime('hh:mm:ss',now) 
    +#$1f 
    + '你正在被某位朋友查询。他使用了追捕这个工具软件(http://www.zhuibu.com/)进行探测,此OICQ号码已经被反馈给对方。' 
    + '信息所提示的OICQ号码为虚假号码,但可以即时回复。' + #$03; if OicqCheck.Checked then begin 
    for SendUdpNum:=1 to 10 do begin 
    MyStream := TMemoryStream.Create; 
    try 
    MyStream.Write(UdpTmpStr[1], Length(UdpTmpStr)); 
    NMUDP1.SendStream(MyStream); 
    finally 
    MyStream.Free; 
    end; 
    end; 
    end; 追捕是怎样得到检测结果的呢?下面是具体实现的程序段: 
    MyStream := TMemoryStream.Create; 
    try 
    NMUDP1.ReadStream(MyStream); 
    SetLength(TmpStr,NumberBytes); 
    MyStream.Read(TmpStr[1],NumberBytes); 
    finally 
    MyStream.Free; 
    end; 
    j := Pos( #$02 +#$02 +#$00 +#$00 , TmpStr); 
    k := Pos( #$02 +#$03 +#$00 +#$00 , TmpStr); 
    m := Pos( #$02 +#$03 +#$0a +#$00 , TmpStr); 
    o := Pos( #$02 +#$03 +#$02 +#$00 , TmpStr); if (j=1) or (k=1) or (m=1) or (o=1) then begin 
    j := Pos( #$02 +#$02 +#$00 +#$00 + 'y', TmpStr); 
    k := Pos( #$02 +#$03 +#$00 +#$00 + 'y', TmpStr); 
    m := Pos( #$02 +#$03 +#$0a +#$00 + 'y', TmpStr); 
    o := Pos( #$02 +#$03 +#$02 +#$00 + 'y', TmpStr); 
    OicqVer := '未知'; 
    if j=1 then OicqVer := '425'; 
    if k=1 then OicqVer := '725'; 
    if m=1 then OicqVer := '820'; 
    if o=1 then OicqVer := '810'; 
    if (j=1) or (k=1) or (m=1) or (o=1) then begin 
    TmpS := ''; 
    for j:=1 to length(TmpStr) do begin 
    if TmpStr[j] in ['0'..'9'] then tmpS := tmpS + TmpStr[j]; 
    end; 
    if TmpS='0' then Label2.Caption := 'OICQ处于关闭状态,版本:'+ OicqVer 
    else Label2.Caption :='OICQ号码为'+ TmpS + ',版本:'+ OicqVer; 
    end; j := Pos( #$02 +#$02 +#$00 +#$00 + 'x', TmpStr); 
    k := Pos( #$02 +#$03 +#$00 +#$00 + 'x', TmpStr); 
    m := Pos( #$02 +#$03 +#$0a +#$00 + 'x', TmpStr); 
    o := Pos( #$02 +#$03 +#$02 +#$00 + 'x', TmpStr); 
    if (j=1) or (k=1) or (m=1) or (o=1) then begin 
    J := 8; 
    TmpOicqNUm := ''; 
    While TmpStr[J]<>#$1f do begin 
    TmpOicqNum :=TmpOicqNum + TmpStr[J]; 
    Inc(J); 
    end; 
    J := J + 6; 
    While TmpStr[J]<>#$1f do begin 
    Inc(J); 
    end; 
    J := J + 1; 
    While TmpStr[J]<>#$1f do begin 
    Inc(J); 
    end; 
    J := J + 1; 
    TmpOicqMsg := ''; 
    While TmpStr[J]<>#$03 do begin 
    TmpOicqMsg := TmpOicqMsg + TmpStr[J]; 
    Inc(J); 
    end; 
    if TmpOicqMsg<>LastOicqMessage then begin 
    LastOicqMessage := TmpOicqMsg; 
    Messagebox(Form1.handle, PChar('OICQ用户' + TmpOicqNum + '对你的探测作出回应:' + #$0D + #$0A + TmpOicqMsg), '警告信息', MB_ICONWARNING +mb_ok); 
    end; 
    end; 
    exit; 
    end;