有趣的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~