实际上目前所有的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; 

解决方案 »

  1. To njbudong
       你的二篇贴子我在网上都已见过,它们所述的都是UDP协议明文传送内容,我想知道腾讯公司采用密文传送所用的加密算法。
       恳请njbugong大侠不吝赐教!!!
      

  2. To smhpnuaa
         csdn论坛高手如云,你们公司的这点商业秘密恐怕是保不住了!哈哈!
      

aliyun

类似问题 »