如题,具体要求如下:
1、不使用“网卡混乱模式”,而是使用HOOK或者底层硬件驱动,截取指定进程的封包(包括进和出)当然如果使用底层驱动模式请提供封包过滤代码,以实现截取指定进程封包功能
2、提供伪封包发送功能
3、提供原封包内容显示,最好是BYTE和HEX对应,但至少应该有其中一个
4、有较为完整的注释内容,中英皆可,俄语也将就,其他语种就免了
5、以较为常见的网络应用程序为示例,例如联众游戏,QQ等,当然了,最好提供一个函数进行设置具体截获的进程
6、这个能否提供吃掉原封包的方法呢
测试通过给分,代码可以发到 [email protected]
发送后请在帖子里留言,我看到后会立即测试,通过即结贴给分

解决方案 »

  1.   

    恩,和我前面要的HOOK一样,都是用来操作一些网络程序的,
    象你所描述的,修改接收或发送的封包当然最好,最基本的功能是截获指定进程的封包,然后我要对他们进行分析,如果能修改那就省了好多事了。我想这个做起来和HOOK消息差不很远了,使用DLL注入应该比底层实现来得容易,而且在VB中也可以用较少的代码实现控制。
      

  2.   

    呵呵,也不行了,汉语都明白,偶是学俄语的,刚才看雪貂给的代码都是英文注释,让我老婆给我解释了半天呢,呵呵,呵呵,呵呵,我比较笨,弄了N多年VB了,英语一句也没学会
      

  3.   

    建议去研究一下WINPCAP,开源的。
      

  4.   

    同楼上,看看winpcap的资料吧。
    http://www.studentblog.net/m/dijk/archives/2006/16936.shtml
      

  5.   

    这个应该是Hook API范畴看看这些,应该对你有帮助:拦截其它程序的网络数据封包
    http://dev.csdn.net/develop/article/22/22765.shtm应用层截包方案与实现
    http://www.easyde.net/article/238/242/2006/2006060830651.html
      

  6.   

    CSDN里有用vb实现截包的文章,好像jyu1221写的。分为98和nt两篇。
    楼主自己去找找吧。转帖:   
        
      伪造IP包,禁止TCP连接   
        
      大家是否想过在局域网内如何禁止别人访问web   server,pop3,ftp等。那么如何禁止呢?大家都知道TCP是面向连接的,连接时有三次握手,之后才能确认连接成功。那么我们就应该能在第一次握手之后伪造一个服务方的握手返回,从而达到TCP连接不成功,无法访问某端口。程序如下:   
        
      void   DeCodeIP(buf,iBufSize)   //解析侦听到的IP数据包   
        
      {   
        
      IPHEADER   *   pIPhdr;   
        
      TCPHEADER   *   pTCPhdr;   
        
      pIPhdr=(IPHEADER   *   )buf;   
        
      //获得TCP   header的起始位置   
        
      int   iIphLen   =   sizeof(unsigned   long)   *   (pIPhdr->h_lenver   &   0xf);   
        
      pTCPhdr   =   (TCPHEADER*   )(buf+iIphLen);   
        
      //判断是否为第一次握手IP数据包,pIPhdr->th_flag=2   即("-s----")   
        
      if   (iBufSize==48)   &&   (pIPhdr->iProtocol==IPPROTO_TCP)   &&   (pIPhdr->th_flag==2)   
        
      sendTCP_SYNACK(szDestIP,szSourceIP,pTCPhdr->destPort,pTCPhdr->srcPort,pTCPhdr->seq);   
        
      }     
        
      void   sendTCP_SYNACK(char   *   szSrcIP,   char   *   szDestIP,unsigned   short   srcPort,unsigned   short   destPort,unsigned   int   iAck)   
      {   
      int   iErrorCode;   
      SOCKET   s;   
      IP_HEADER   ip_header;   
      TCP_HEADER   tcp_header;   
      PSD_HEADER   psd_header;   
      struct   sockaddr_in   remote;   
      char   *   ptr=NULL;   
      //创建socket   
      s=socket(AF_INET,   SOCK_RAW,   IPPROTO_IP);   
      if   (CheckSockError(s,   "socket-tcp"))   
      return   FALSE;   
        
      BOOL   bOpt   =   TRUE;   
      iErrorCode   =   setsockopt(s,   IPPROTO_IP,   IP_HDRINCL,   (char   *)&bOpt,   sizeof(bOpt));   
      if   (CheckSockError(iErrorCode,   "setsockopt-TCP"))   
      {   
      closesocket(s);     
      return   FALSE;   
      }   
        
      //---end­   
      //伪装连接   
        
      unsigned   short   iTotalSize=44;   
      unsigned   short   iTCPSize=24;   
      char   *sendBuf=new   char[iTotalSize];   
        
      ip_header.h_lenver=(4<<4   |   sizeof(ip_header)/sizeof(unsigned   long));   
      //高四位版本号,低四位首部长度   
      ip_header.total_len=htons(iTotalSize);   //16位总长度   
      ip_header.tos=0;   
      ip_header.ident=htons(17393);   //16??±êê?   
      ip_header.frag_and_flags=0;   //3??±ê????,13??offset   
      ip_header.ttl=57;   //8??éú′?ê±??TTL   
      ip_header.proto=IPPROTO_TCP;   //8??D&shy;òé(TCP,UDP?&shy;)   
      ip_header.checksum=0;   //16位校验和   
        
      ip_header.sourceIP=inet_addr(szSrcIP);   //32位远地址·   
      ip_header.destIP=inet_addr(szDestIP);   //32位目的地址·   
      ip_header.checksum=checksum((USHORT   *)&ip_header,20);   
        
      //填充TCP首部   
      tcp_header.th_sport=htons(srcPort);   //源端口   
      tcp_header.th_dport=htons(destPort);   //目的端口   
      tcp_header.th_seq=htonl(0x581A784D);   //SYN序列号   
      tcp_header.th_ack=htonl(iAck+1);   //应答序号   
      tcp_header.th_lenres=(iTCPSize/sizeof(unsigned   long)<<4|0);   //TCP长度和保留位   
      tcp_header.th_flag=0x12;   //SYN   标志   
        
      tcp_header.th_win=htons(65535);   //窗口大小   
      tcp_header.th_urp=0;   //紧急指针   
      tcp_header.th_sum=0;   //校验和   
        
      //填充TCP伪首部(只用于生成校验和)   
        
      psd_header.saddr=ip_header.sourceIP;   
      psd_header.daddr=ip_header.destIP;   
      psd_header.mbz=0;   
      psd_header.ptcl=IPPROTO_TCP;   
      psd_header.tcpl=htons(iTCPSize);   
        
      ZeroMemory(sendBuf,iTotalSize);   
      //计算tcp校验和,包含伪TCP   header   
      memcpy(sendBuf,&psd_header,sizeof(psd_header));     
      ptr=sendBuf+sizeof(psd_header);   
      memcpy(ptr,&tcp_header,sizeof(tcp_header));   
      ptr=sendBuf+sizeof(psd_header)+sizeof(tcp_header);   
      *ptr=(char)0x02;*(ptr+1)=(char)0x04;*(ptr+2)=(char)0x05;*(ptr+3)=(char)0xb4;   
      tcp_header.th_sum=checksum((USHORT   *)sendBuf,sizeof(psd_header)+24);   
        
      ZeroMemory(sendBuf,iTotalSize);   
        
      //填充发送缓冲区   
        
      memcpy(sendBuf,&ip_header,sizeof(ip_header));   
      ptr=sendBuf+sizeof(ip_header);   
      memcpy(ptr,&tcp_header,sizeof(tcp_header));   
      ptr=sendBuf+sizeof(ip_header)+sizeof(tcp_header);   
      *ptr=(char)0x02;*(ptr+1)=(char)0x04;*(ptr+2)=(char)0x05;*(ptr+3)=(char)0xb4;   
      remote.sin_family   =   AF_INET;   
      remote.sin_port   =   htons(destPort);   
      remote.sin_addr.s_addr   =   inet_addr(szDestIP);   
      iErrorCode   =   sendto(s,   sendBuf,   iTotalSize,   0,   (SOCKADDR   *)&remote,   sizeof(remote));   
      CheckSockError(iErrorCode,   "SYNACK   sendto");   
      //伪装关闭连接   
      iTotalSize=40;   
      iTCPSize=20;   
        
      //   end--------   
      closesocket(s);   
      delete[]   sendBuf;   
      return   TRUE;   
      }     
      

  7.   

    http://winpcap.polito.it/
    可以下载到winpcap开发文档。http://blog.csdn.net/jyu1221
    使用VB在WIN2000下截获IP数据包
    使用VB截获WIN98系列下的IP数据包
      

  8.   

    感谢大家的关注,
    拦截其它程序的网络数据封包
    http://dev.csdn.net/develop/article/22/22765.shtm
    这个文章我已经看过好多次了,手头没有DELPHI,所以没试,其实DELPHI也学过一些,早在软件公司上班的时候学过几个月,代码比较容易懂,但是由于没有编译工具没办法测试这个东东,再翻翻以前的光盘看看,如果能找到就编译这个DLL,测试通过就结了
    这个代码http://blog.csdn.net/jyu1221
    我机器上就有,测试的时候会停止响应,没有任何输出,不知道问题出现在哪了,我再去看看,另外我还有一个网卡混乱模式的代码,似乎只能截取到一些内网通讯包。没仔细看,我再测试一下http://blog.csdn.net/jyu1221里面的代码,看看和我机器上的是不是有什么不同
      

  9.   

    其实我感觉这个http://dev.csdn.net/develop/article/22/22765.shtm
    是最符合我的需要的,哪位有DELPHI编译一下给我发过来也好,谢谢
    [email protected]
      

  10.   

    自己编译一下阿绿色版的dehpi才不到10m
      

  11.   

    那个DELPHI代码仔细看了一下,里面没有封包处理函数啊。。郁闷
      

  12.   

    http://blog.csdn.net/jyu1221的代码偶尔能测试,,需要把地址改成拨号对应的IP,但是绝大多数测试不通过。。
    还是联系了一下http://dev.csdn.net/develop/article/22/22765.shtm的作者。。看是否能给出封包处理部分。。另外那个混乱模式的我也测试了,可以取到更多封包,需要修改地址,和上面一样,但是无法收到我所要的封包,不知道为什么。。
      

  13.   

    强烈建议用wincap
    我看过很多vb截包的程序,还有C++的,自己写的没几个稳定的
      

  14.   

    http://www.cn700.com/2004-11/13-231317.html
      

  15.   

    用了一下wincap的控件,不行啊,截获不到我要的封包
    还是去求HOOK吧
      

  16.   

    各位老大继续关注啊!!!!!统计了一下这几天测试的结果,VB API的示例基本都是挂掉,停止响应了wincap可以正常运行,截获封包,但不论我怎么设置,都截不到我要的包,不知道为什么,包长度总是0端口为0IP为0什么都0,但实际上我的那个游戏程序确实在一直更新界面,交换数据,为什么得不到呢,非常奇怪唯一没有测试的就是HOOK了,但是还没有得到那位老大的帮助,他的代码里面只有HOOK部分,没有数据处理,哪怕只有一个获取数据的接口也好啊(当然了,能修改更好啦,哈哈),可惜啊,DELPHI水平不行,去DELPHI区发发帖子看看吧
      

  17.   

    WINPCAP倒是可以用了,不过出现新问题了。。
    该死的网络程序不断的改变端口,愁死了,看了看网上关于进程与端口对应的文章,我直接疯掉了,他们说的API在各种VB资料里都没有声明,我是在自己写的任务管理器里面实现了PID对应端口,可是实现的很麻烦,而且连接的端口如果非常多,将慢很多,想讨教其他方法。WINPCAP的控件我用的时候没有使用混乱模式,而是使用的All Multicast模式,获取的封包用端口来区分的时候发现端口一直在变,疯了,而IP和MAC地址由于服务器很多,所以也不好逐个设定,所以给我区分造成了很大的麻烦。难于实现啊,虽然可以,但是太太太麻烦了,而且方法太土了,哈哈。所以还是怀念曾经看到的HOOK啊,真是好东西,不然去学学DELPHI。哎,痛苦中啊,大家继续帮帮忙啊
      

  18.   

    大家都在忙么,这么多高手都在,快快来帮忙吧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    现在的问题先不讨论HOOK,那个HOOK程序我找朋友改一下好了现在就讨论讨论怎么用API把进程和端口对应起来吧~不用API的土办法我是实现了,不过很差劲的,大家来解决解决API的方法吧~~~不用API实现是这样的,取进程PID(这个都会啦)
    使用TETSTAT -AO命令列表会得到PID对应端口
    从而把进程和端口对应起来,但是我是把TETSTAT -AO的结果输出到文本文件然后再处理,前些帖子里面有人说用管道操作,没做过,大家能不能也给点指点啊
      

  19.   

    直接疯了,管道倒是弄了,WINPCAP也用的比较熟了,得到了好多数据,,分析中,头大
    数据头:1 0 1 0 0 0 50 79 20 0 1 0 8 0 45 0 0 
    内容:3C 69 36 0 0 76 6 B5 18 DB 9C 7B F7 DE 86 F0 52 B D2 D E3 17 6B 60 27 66 B 
    内容:3C 20 14 0 0 76 6 FE 3A DB 9C 7B F7 DE 86 F0 52 B D2 D E3 17 6B 60 7F 66 B 3B F9 50 18 42 FC FB 4A 0 0 5 60 2 0 C 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 
    内容:3C 3C F2 0 0 76 6 E1 5C DB 9C 7B F7 DE 86 F0 52 B D2 D E3 17 6B 60 93 66 B 3B F9 50 18 42 FC FE 36 0 0 5 60 2 0 C 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
    内容:3C 87 47 0 0 76 6 97 7 DB 9C 7B F7 DE 86 F0 52 B D2 D E3 17 6B 60 A7 66 B 3B F9 50 18 42 FC FC 22 0 0 5 60 2 0 C 0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 
    内容:44 A4 EA 0 0 76 6 79 5C DB 9C 7B F7 DE 86 F0 52 B D2 D E3 17 6B 60 BB 66 B 3B F9 50 18 42 FC 51 6 0 0 5 60 2 0 14 0 0 0 2 0 0 0 3 0 0 0 2 0 0 0 2D 0 0 0 72 0 0 0 谁有封包分析的经验啊,回头去看API的那个了里面倒有封包分析。。头疼啊
      

  20.   

    丢包,丢包,严重丢包
    还有没有更好的啊,,,,,
    没太多要求了,谁能发一个能截获指定进程封包并显示出来的代码就给分了。。嘎嘎,HOOK最好啊
      

  21.   

    最近研究一个叫绿光抓包器的代码,BCB的,看了头疼。。也是DLL注入,看着比较过瘾,也有相应的DLL和源代码,不过作者老大我真比较佩服,把处理窗体什么的都写到DLL里面了,只用一个10行的程序调用了一下,所以那个DLL在VB是不能直接用了,疯掉了,正在研究(研究BCB是怎么声明变量和返回数组的),哈哈,,,,,,完全不懂,连个E书都没有,真疯了,想让那DLL出来个接口返回数据都不会做,真烂啊。。
      

  22.   

    大家研究研究这个网络封包分析利器啊!!http://www.gameres.com/hack/showthread.asp?threadid=6771
    好东西啊,,,,,可惜VB调用不了呢,呵呵
      

  23.   

    谢谢!!!!!!!!!!!!!!!!!!!!呵呵,其实不急啦,和作者聊的时候他还问我是不是要开发外挂,我说也许以后会但是会开源,不会收费;他比较赞同,只是看样最近没时间。我在CB区里发了个帖子,不知道有人回没有呢,把地址贴在这里,大家看看这样的设计是不是VB调用起来就比较easyhttp://community.csdn.net/Expert/topic/4893/4893953.xml?temp=.8214685呵呵,收集了一些内存读写的,又收集了MSGHOOK,现在是RECVEENDHOOK,看来这几个写外挂的基本条件是具备的,如果过几天开会以后决定不用我早去上班那就试着写一些外挂,到时候开源大家一起研究,共同进步。
      

  24.   

    我看完鸟
    着作者真是的,写代码居然不缩进,代码难看死了!其实他最关键就是
    BOOL init()
    函数
    你看到他下面那些汇编了吗?_asm
            {
            lea eax,Mysend
            mov ebx,pfsend
            sub eax,ebx
            sub eax,5
            mov dword ptr [newsend+1],eax
            }类似上面的
    他其实先
    hModule=LoadLibrary("wsock32.dll");
    pfsend=GetProcAddress(hModule,"send");着两句先找到wsock32.dll(这个是干什么的不用我说了吧....)的send函数在内存里面的地址
    然后用汇编做手脚
    让执行send函数前先执行Mysend
    提取出发送的内容
    原理大概就这样至于怎么调用.....我再研究一下
      

  25.   

    我有点晕了...........
    他那个东西怎么用的,我用它hook我的IE,怎么什么也截不到,倒是挂了我IE好几次....
      

  26.   

    恩,他那东西有问题,
    初始化的时候应该加入:
    form0=null:
    结束的时候也是
    还有就是MYRECV函数也要这个判断,就可以了(是我看帖子里面别人说的,呵呵)他的程序可以HOOK,先点挂钩,然后进一个网络程序,然后按小键盘上的*就看见窗口了,再点开始就看见数据交换了VirtualDesktop(吴滂) 兄改好的代码可以发到我信箱吗?我不会用BCB,呵呵,只是下了一个安上然后打开原作的工程看了看代码,不知道什么东西放什么地方,发到我信箱吧:)
    谢谢!!
    E-MAIL:[email protected]
    aspower_(论坛开通可用分捐赠!欢迎捐赠我以助csdn测试谢谢^_^)
    自己要吧,呵呵,要不VirtualDesktop(吴滂) 兄写完发给我我发给你也行!看了前几天雪貂同志的代码了吗?MSGHOOK的那个,你试没试挂系统的时候会怎么样?
      

  27.   

    实在是穷死了,这几天开了N多贴了。。 现在可用分为40,不过放心,我承诺的分一分不少的给大家!结贴以后看新开帖子标题,我给大家加分,特别是VirtualDesktop(吴滂) 兄。
    问题如果解决了马上结贴!
      

  28.   

    TO:VirtualDesktop(吴滂) 兄
    这个代码我看了2天了,呵呵,自己确实改不了,只是看了点端倪,因为没学过CB所以没办法了,自己改了一些,就编译不了了,哈哈。。我在CB版块写的要求就是根据我的分析写的,如果你改好了,测试通过,CB版块承诺的500分也一样在这里给你加,那边就把分散掉结帖了。
      

  29.   

    我发了
    "他的程序可以HOOK,先点挂钩,然后进一个网络程序"
    "进一个网络程序"什么意思?我进IE行么?
      

  30.   

    oooooooooooooooooooooooooooooooooooooooooooooooooooooooo我看到鸟.................
      

  31.   

    VirtualDesktop(吴滂) 是这方面的专家。还要“影子”,不过很就没见他了。
      

  32.   

    TO:VirtualDesktop(吴滂) 兄
    我详细说一下我弄的过程:
    1、打开他的EXE文件,点“开始挂钩”
    2、然后我进了联众大厅,进入保皇游戏(旁观或者打都行啦)
    3、在保皇界面上按下NUM *
    4、在弹出的界面上按下“开始”
    就看见他的程序里面显示出取得的信息包内容了
      

  33.   

    Modest(塞北雪貂)·(偶最欣赏楼主的分)老大也来了~~~~看看BC代码吧。。BCB代码和源程序,按上面方法运行就可以了
    http://www.gameres.com/hack/showthread.asp?threadid=6771
    要求贴:
    http://community.csdn.net/Expert/topic/4893/4893953.xml?temp=.8214685
      

  34.   

    VirtualDesktop(吴滂) 兄是要把程序改成VB的吗?用汇编转地址,然后呢。我是不会了,那不就成了VB也可以HOOK了,前段时间看了一个XP拦截任务管理器的,用了汇编修改了一个内存地址,好象是WlxLoggedOnSAS函数的什么东西不乱猜了,等你改好了就知道结果了~~辛苦了:)
      

  35.   

    我的意思是做个dll给你调用
    那个exe我会用了
    但是改不成.......................我都不知道怎么的,就是取不出那个Memo的内容...
    死了...死了...这次...下了海口...结果做不出来.........
      

  36.   

    lz啊~~郁闷啊~~我就快要投降了
    要不我捐分给你到C++版问问吧~~~
      

  37.   

    没关系,你先别着急麻~不是夸海口,呵呵,相信你是有这个能耐的,只是一时没做出来,雪貂都说你是专家了,我相信你!!:)我觉得也是做个DLL,照着他的原代码改,可是我不行的
    还是麻烦你!我已经联系好给分的人了,解决马上给,这个帖子的分散一部分,因为毕竟大家都出力了,等你改好了,我就开N个帖子给你加500分,我回头再看看我上面说给分没有,一概给你加上:)然后我去把CB区里的分一散,就OK了~~~~~
      

  38.   

    别,别着急,千万别着急,不用去那里散分的,我已经在C和DELPHI里面都发过类似的帖子了,没人回的,所以我现在手头分才紧的呀,呵呵,不过说给的一定马上给的。
    不用着急,你可以慢慢研究,我不着急的,因为不是给别人做工程,就是凭自己的爱好,业余么,就是有这点好处,已经快12点了,你早睡吧!!(虽然我知道程序员都熬,连我这个爱好者都熬,但是早睡明天才有精力!)
      

  39.   


    [Linker Error] Could not create G:\程序\sf_2004428951\green\main\hook.tds (error code 3)这是为什么啊,我看了看改过的代码。5555555555没有输出接口啊,即使便宜了也没办法在VB里面调用啊。VirtualDesktop(吴滂) 兄再努力努力麻~~~~~~~~~~~
      

  40.   

    直接晕那,哪位给我发的VC代码。谢谢。。我这VC前几天刚删了。。再安,虽然我不会。。
      

  41.   

    TO:zcsor8169() 最好还是找原作者,vb能调用的机会希望渺茫
    因为它那个出内容的函数是用汇编跳转执行的,我怎么都弄不出个返回值来(明明是赋值了,调用的时候居然说没有).............这种东西最好还是不要用vb做...
    我再给你发个能用的
      

  42.   

    继续我的问题啊,还是那个BCB的代码,在下载地址的49楼有一个改过的,但是DLL里面还是封装了窗体,而且RECV函数的返回值有问题,为空,,,,VirtualDesktop(吴滂) 兄  
    继续看看吧,那个改了的加了4个函数,还有一些功能,使用方法和前面我说的相同,看看对你有帮助么,继续帮我做做吧!!
      

  43.   

    hu030152(用程序说话) 的代码我看了(没看明白),所以不知道怎么样啊。。还是谢谢你
     
    VirtualDesktop(吴滂)兄
    不知道你改的怎么样了。
    我联系了原帖49楼的兄,讨论了一点,他说是可以实现的,可是他现在有事走了,呵呵,我还在等,说了一下汇编跳转,他说和数据封包那里没什么关系,只是一个INSHOOK,刚说改成带参数的,他就有事走了,哎,我没描述清楚怎么回事。。
      

  44.   

    VirtualDesktop(吴滂)兄思前想后啊,这个HOOK即使得到了输出用VB再调用也是本末倒置。最后得出了一个折中的解决办法,因为如果我们一直用VB循环调用,那系统资源就耗尽了,我们的VB程序会停止响应,那就只能DOEVENTS,但是这样就很可能丢包,还是应该是在HOOK的自定义函数里面执行操作是正确的,但是呢,也可以把得到的数据依次排列到一个数组里,然后提供接口去读。这样就不丢了。
    数据模型如下:
    TYPE MDT
    A AS LONG  'VB已经读到的编号
    B AS STRING '数据的由来,是SEND还是什么
    C() AS BYTE '数据
    END TYPE
    DIM M(4) AS MDT
    把数据装入M中,而后根据VB已经读到的数据编号来返回。
    这样可以实现了,但还是本末倒置的,呵呵...非常麻烦我先把这个帖子结了,再去开一个,登陆注销登陆注销的真的很烦。
      

  45.   

    上面说的,还需要在DLL中进行数据的维护,我们读过的数据应该由DLL中函数删除,并将数据依次上移
    M(0)=M(1)
    M(1)=M(2)
    …………
    感觉最后的结果就是在DLL中放一个仓库,哈哈但仅仅是防止VB读的时候丢包。类似个先进先出的堆栈