【供热客服系统源码】【学校随机点名源码】【源码有市场吗】delphi 源码 网络抓包

1.如何在delphi中使用winpcap的例子

delphi 源码 网络抓包

如何在delphi中使用winpcap的例子

       è®°å¾—当初能够开始写.1x的港湾登陆器纯粹是因为loser自己改好了pcap.pas,源码供热客服系统源码所以我才能继续的把pcap的代码写下去。最近继续研究delphi和winpcap是因为现在rad平台是做的越来越漂亮了,其实用delphi的控件等等来做我们的界面,而用vc来写我们的主要功能模块不失为一个好的办法。

       ä½†æ˜¯è™½ç„¶delphi简单快速,可是我还是费了不少时间的,在vc中你很少去处理错误类,而在delphi中try expect 这些错误捕获的代码很多很多,从简单的理解来看,我认为是指针的多次释放,或者销毁对象的多次销毁而引起的,但是不管怎么说,原来我写了这个登陆器的时候,他还是不稳定的,所以虽然引起轰动,但是很快就没了,最后不得已而转向vc开发。

       winpcap的几个函数相信你已经知道了,pcap.pas在我的博客中也找的到代码,那么剩下的就自己看看学学吧:

       procedure recvThread(myconfig:pconfigini);stdcall;

       const

       cStartPacket:array[0..] of Byte=($, $, $c2, $, $, $,

       $ff, $ff, $ff, $ff, $ff, $ff,

       $, $8e, $, $, $, $,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5);

       cuserPacket :array[0..] of Byte = ($, $, $c2, $, $, $,

       $ff, $ff, $ff, $ff, $ff, $ff,

       $, $8e, $, $, $, $ff,

       $, $, $, $ff, $, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5);

       cResponseMD5 :array[0..] of Byte = ($, $, $c2, $, $, $,

       $ff, $ff, $ff, $ff, $ff, $ff,

       $, $8e, $, $, $, $ff,

       $, $, $, $ff, $, $,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5);

       cLogoffPacket :array[0..] of Byte = ($, $, $c2, $, $, $,

       $ff, $ff, $ff, $ff, $ff, $ff,

       $, $8e, $, $, $, $,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5, $a5, $a5,

       $a5, $a5, $a5, $a5);

       var

       outnetbyte,innetbyte:int;

       StartPacket,userPacket,ResponseMD5,LogoffPacket:array[0..] of Byte;

       szMd5Buffer: Md5Buffer;

       nLen: Integer;

       md5Ctx: MD5Context;

       md5Dig: MD5Digest;

       mmcount:string;

       pcap:ppcap;

       mac:TMacAddr;//物理网卡地址

       user:string;

       ErrStr:string;

       errbuf:array[0..PCAP_ERRBUF_SIZE] of Char;

       userlength,i:integer;

       buftoint : array[0..3] of byte;

       bufint:integer;

       headlen2:integer;

       pRecvBuf :array of Byte;

       pRecvHeaderBuf :ppcap_pkthdr;

       q_MD5Source:array[0..] of byte;

       f:TextFile;

       textstring:string;

       begin

       assignfile(f,'test.txt');

       for i:=0 to do

       begin

       StartPacket[i]:=cStartPacket[i];

       userPacket[i]:=cuserPacket[i];

       ResponseMD5[i]:=cResponseMD5[i];

       LogoffPacket[i]:=cLogoffPacket[i];

       end;

       buftoint[2]:=0;

       buftoint[3]:=0;

       try

       pcap := pcap_open_live(PChar(myconfig^.ethname),

       , PCAP_OPENFLAG_PROMISCUOUS, 1, errbuf);

       except

       showmessage('打开网卡失败');

       isloop:=false;

       exit;

       end;

       // end;

       if pcap<>nil then

       begin

       mac:=Pcap_GetMacAddress (Pcap, ErrStr) ;

       end;

       //填写mac地址

       for i:=0 to 5 do

       begin

       StartPacket[i+6] := mac[i];

       userPacket[i+6] := mac[i];

       ResponseMD5[i+6] := mac[i];

       LogoffPacket[i+6] := mac[i];

       end;

       //填写账号

       user:=myconfig^.username;

       userlength:=5+length(user);

       userPacket[]:=byte(userlength);

       userPacket[]:=byte(userlength);

       for i:= to length(user)+ do

       begin

       userpacket[i] := Str_HexToInt(InttoHex( ord(user[i-]) ,2));

       end;

       //发送开始认证包

       pcap_sendpacket(pcap, @StartPacket, SizeOf(StartPacket)) ;

       mmcount:=formatdatetime('ss',now());

       while isloop=true do

       begin

       //

       if (formatdatetime('ss',now()) <>mmcount) then

       begin

       try

       PostMessage(myconfig^.formhandle, WM_THREAD_MSG, 4, outnetbyte);

       PostMessage(myconfig^.formhandle, WM_THREAD_MSG, 5, innetbyte);

       except

       showmessage('子线程发送流量数据出错');

       end;

       mmcount:=formatdatetime('ss',now());

       end;

       //开始抓包

       try

       i:= pcap_next_ex(pcap, @pRecvHeaderBuf, @pRecvBuf);

       except

       showmessage('抓包函数出错');

       end;

       if( i>0 ) then

       begin

       if (pRecvBuf[] = $) and (pRecvBuf[] = $8e) then

       begin

       case precvbuf[] of

       $:

       begin

       if (pRecvBuf[] = $) then //Request Identity

       begin

       //form1.Lab_login_state.Caption:='发送账号包';

       try

       pcap_sendpacket(pcap, @userpacket, SizeOf(userpacket)) ;

       except

       showmessage('发送账号包出错');

       end;

       end

       else

       begin

       for i:=0 to do

       begin

       q_MD5Source[i] := pRecvBuf[i + ];

       end;

       PostMessage(myconfig^.formhandle, WM_THREAD_MSG, 0, 0);

       szMd5Buffer[0] := $;

       nLen := 1;

       CopyMemory(@szMd5Buffer[nLen], PChar(Trim(myconfig^.userpass)), Length(Trim(myconfig^.userpass))); // 用户密码

       nLen := nLen + Length(Trim(myconfig^.userpass));

       CopyMemory(@szMd5Buffer[nLen], @q_MD5Source, ); // 服务器返回密钥

       nLen := nLen + ;

       for i:=0 to nlen-1 do

       begin

       textstring:=textstring+inttohex(szMd5Buffer[i],2)+' ';

       end;

       textstring:=textstring+##;

       MD5Init(md5Ctx);

       MD5Update(md5Ctx, @szMd5Buffer, nLen);

       MD5Final(md5Ctx, md5Dig);

       for i:= to do

       begin

       ResponseMD5[i] := md5dig[i-];

       textstring:=textstring+inttohex(md5dig[i-],2)+' ';

       end;

       textstring:=textstring+##;

       rewrite(f);

       writeln(f,textstring);

       responsemd5[]:=byte(length(myconfig^.username)+);

       responsemd5[]:=byte(length(myconfig^.username)+);

       for i:= to length(user)+ do

       begin

       ResponseMD5[i] := Str_HexToInt(InttoHex( ord(user[i-]) ,2));

       end;

       pcap_sendpacket(pcap, @ResponseMD5, SizeOf(ResponseMD5)) ;

       end;

       end;

       $:

       begin

       PostMessage(myconfig^.formhandle, WM_THREAD_MSG, 1, 0);

       end;

       $:

       begin

       PostMessage(myconfig^.formhandle, WM_THREAD_MSG, 3, 0);

       isloop:=false;

       end;

       end;

       end;

       if (pRecvBuf[] = $) and (pRecvBuf[] = $) then

       begin

       if (pRecvBuf[] = $) then //tcp包

       begin

       try

       buftoint[0]:= pRecvBuf[];

       buftoint[1]:= pRecvBuf[];

       Bufint := integer(buftoint);

       except

       showmessage('tcp字节转化错误');

       end;

       headlen2:=;

       case pRecvBuf[] of

       $:headlen2:=;

       $:headlen2:=;

       $:headlen2:=;

       $:headlen2:=;

       $:headlen2:=;

       $a0:headlen2:=;

       $b0:headlen2:=;

       $c0:headlen2:=;

       end;

       //if totalbyte< then totalbyte:=totalbyte+abuf^ - -headlen2;

       if ((pRecvBuf[] = $c0) or (pRecvBuf[] = $ac) ) and ((pRecvBuf[] = $c0) or (pRecvBuf[] = $ac) ) then

       begin

       try

       innetbyte:=innetbyte+ bufint - -headlen2;

       except

       showmessage('tcp计算出错in');

       end;

       end

       else

       begin

       try

       outnetbyte:=outnetbyte+ bufint - -headlen2;

       except

       showmessage('tcp计算出错out');

       end;

       end;

       //if (pRecvBuf[] = $c0) and ( pRecvBuf[] <> $c0 ) and (pRecvBuf[] <> $ac) then outnetbyte:=outnetbyte+ abuf^ - -headlen2;

       //if (pRecvBuf[] = $c0) and ( pRecvBuf[] <> $c0 ) and (pRecvBuf[] <> $ac) then outnetbyte:=outnetbyte+ abuf^ - -headlen2;

       //if (pRecvBuf[] = $ac) and ( pRecvBuf[] <> $c0 ) and (pRecvBuf[] <> $ac) then outnetbyte:=outnetbyte+ abuf^ - -headlen2;

       //if (pRecvBuf[] = $ac) and ( pRecvBuf[] <> $c0 ) and (pRecvBuf[] <> $ac) then outnetbyte:=outnetbyte+ abuf^ - -headlen2;

       end;

       if (pRecvBuf[] = $) then //udp包

       begin

       try

       buftoint[0]:= pRecvBuf[];

       buftoint[1]:= pRecvBuf[];

       Bufint := integer(buftoint);

       except

       showmessage('udp字节转化错误');

       end;

       if ((pRecvBuf[] = $c0) or (pRecvBuf[] = $ac) ) and ((pRecvBuf[] = $c0) or (pRecvBuf[] = $ac) ) then

       begin

       try

       innetbyte:=innetbyte+ bufint - ;

       except

       showmessage('udp计算出错in');

       end;

       end

       else

       begin

       try

       outnetbyte:=outnetbyte+ bufint - ;

       except

       showmessage('udp计算出错out');

       end;

       end;

       end;

       end;

       end;

       end;

       pcap_sendpacket(pcap, @LogoffPacket, SizeOf(LogoffPacket)) ;

       end;

        转载

更多内容请点击【知识】专栏

精彩资讯