有趣的ping-----小记

                                                                            

有趣的ping-----小记

前言:    说是小记,当然文章很短啦。 你应当熟悉的工具是winpcap

前几日,偶尔在看网络的书,好奇的用winpcap去构造了一个假冒的ping,就是icmp包拉。满心欢喜等着那台电脑上当,哪里知道,他连屁都没放一个。(事实上,那个家伙还是有反应的,容我稍候叙述) 要知道,如果我在cmd中ping的话,他可是老老实实的回话哦。

一些参数: 

我的ip:  172.16.99.3               我把我的ip改成了 172.16.99.2 (有人说,为什么不改mac,其实是自便的啦。)

那个家伙的ip:  172.16.0.100      

部分程式:

BYTE  packet[100];
 memset( packet,0, sizeof(packet) );
   
 P_MAC_HEADER pMacHdr = (P_MAC_HEADER)(BYTE*)packet;
 pMacHdr->type = 0x0008;//IP PACKET

 pMacHdr->dmac[0] = 0x00;
 pMacHdr->dmac[1] = 0x27;
 pMacHdr->dmac[2] = 0x4;
 pMacHdr->dmac[3] = 0x22;
 pMacHdr->dmac[4] = 0x64;
 pMacHdr->dmac[5] = 0xe;

 pMacHdr->smac[0] = 0x00;
 pMacHdr->smac[1] = 0x04;
 pMacHdr->smac[2] = 0x90;
 pMacHdr->smac[3] = 0x46;
 pMacHdr->smac[4] = 0x21;
 pMacHdr->smac[5] = 0xbe;

 P_IP_HEADER pIpHdr = (P_IP_HEADER)((BYTE*)(packet)+sizeof(MAC_HEADER));
 
 pIpHdr->crc             = 0;
 pIpHdr->daddr.byte1     = 172;
 pIpHdr->daddr.byte2     = 16;
 pIpHdr->daddr.byte3     = 0;
 pIpHdr->daddr.byte4     = 100;
 pIpHdr->saddr.byte1     = 172;
 pIpHdr->saddr.byte2     = 16;
 pIpHdr->saddr.byte3     = 99;
 pIpHdr->saddr.byte4     = 2;

 pIpHdr->flags_fo        = 0;
 pIpHdr->identification  = 0x3456;
 pIpHdr->proto           = IPPROTO_ICMP;
 pIpHdr->tlen            = htons(60);//htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER));
 pIpHdr->tos             = 0;
 pIpHdr->ttl             = 128;
 pIpHdr->ver_ihl         = (4<<4) | ( sizeof(IP_HEADER)/sizeof(DWORD) );
 

 P_ICMP_HEADER pIcmpHdr = (P_ICMP_HEADER)((BYTE*)(pIpHdr)+sizeof(IP_HEADER));
 
 pIcmpHdr->type          = ICMP_PING_REQUEST;
 pIcmpHdr->operation     = 0;
 pIcmpHdr->ping.spec     = 0x2;
 pIcmpHdr->ping.seq      = 0x8;
 pIcmpHdr->crc           = 0;
   
 pIpHdr->crc   =  CalculateCRC( (BYTE*)pIpHdr, (pIpHdr->ver_ihl&0xF)*4 );
 pIcmpHdr->crc =  CalculateCRC( (BYTE*)pIcmpHdr, sizeof(ICMP_HEADER) );


    packetSize = 60+14;


  if( pcap_sendpacket( adapterHandle, packet, packetSize ) != 0 )
 {
        fprintf(stderr,"/nError sending the packet: /n", pcap_geterr(adapterHandle));
        return 0;

}

其实上面的那些,只不过是填充数据而已,没什么好东西>_<。 问题是,发出这个数据包后,我发现对方没有任何的icmp回应。奇怪也。按照常理来说,尽管我给出的是一个错误的ip地址,可是mac是没错的阿。对方至少也该冒个泡吧~。~   我当初的设想是,对方手到这个消息后,会按照那个mac的地址,也发一个"ip错误"的包过来。可是,实际情况并非如此。 没办法,只好老老实实的改回自己的ip,这次终于看到久违的icmp回应了。         等一下,在reply之前,突然会冒出一个arp reply ,是我的机器回应对方的arp request。各位看官,说到这里,大家应该都知道其中的猫腻了吧,原来不是对方不冒icmp的泡,而是对方收到一个ping的请求时并没有贸贸然的发一个回应,而是非常谨慎的,广播一个arp请求,看看那个ip是不是正货>___<。我假冒了icmp ping request,可是没有假冒arp reply,所以对方也就不上当了喵~

我不清楚是否其他平台支持这样的操作,也不清楚这是否是rfc的建议抑或标准。但是如果这样的操作是为了安全的考虑的话,这是起不了什么作用的。甚至我们还可以利用这一点来隐藏自己,而去arp别人。方法就是,先是找到一台主机a, 主机号假设是1,我想要发现是否存在主机号是2的家伙是否存在。我只要填上主机号2,(可以随便改个mac)然后发个ping请求到a,自然的a就会去arp主机号是2的家伙喵~  这个方法适合自己的机器受到一些限制的情况喵~

p.s:  你知道win xp平台下,ping 里面有什么好料吗? 整个ip报是60字节,20个ip头,余下40个都归icmp用了,结果windows在里面填充了两遍 abcde~opqrstuvw  真是一包草啊。(如果我是gates的话,我就写 gates万岁喵~)不过这倒是给我们一种偷偷放入自己数据的好方法也,比如可以透过防火墙.......偏题了喵~

~The End~


 

posted on 2005-03-07 18:35  norsd  阅读(164)  评论(0编辑  收藏  举报

导航