首页
社区
课程
招聘
[求助]关于wincap用pcap_sendpacket发送包的时候出现目的地址被修改为另外一个地址的问题
发表于: 2010-6-26 18:31 10814

[求助]关于wincap用pcap_sendpacket发送包的时候出现目的地址被修改为另外一个地址的问题

2010-6-26 18:31
10814
本人菜鸟,在学习wincap的时候碰到一个问题,当用pcap_sendpacket发送包的时候出现目的地址被修改为另外一个地址
环境:xp sp3 vc++6.0 wincap 3.1 
程序目的是通过给本机ip发送arp包得到本机mac地址,本机只有一块网卡,用pcap_findalldevs_ex函数也就得到一个设备,地址为192.168.0.100,运行到sendpacket success就停止了,而用wireshark 1.4.0rc1抓包发现发出的数据包实际为:

ff ff ff ff ff ff 0f 0f 0f 0f 0f 0f 08 06 00 01
08 00 06 04 00 01 0f 0f 0f 0f 0f 0f 7f 00 00 02
00 00 00 00 00 00 cc cc c0 a8

本机地址从192.168.0.100 变为了204.204.192.168
不知道为什么,请高手帮忙解答,十分感激
程序如下:
#include <iostream.h>
#include <pcap.h>
#include <remote-ext.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32")
#pragma comment(lib,"wpcap")

struct arppacket
{
    unsigned char   eh_dst[6];
    unsigned char   eh_src[6];
    unsigned short  eh_type;         
    unsigned short  arp_hdr;
    unsigned short  arp_pro;
    unsigned char   arp_hln;
    unsigned char   arp_pln;
    unsigned short  arp_opt;
    unsigned char   arp_sha[6];
    unsigned long   arp_spa;
    unsigned char   arp_tha[6];
    unsigned long   arp_tpa;
};

  pcap_t *devpoint;
  unsigned char mmac[6];
  void getmac();
  unsigned long myip;

void main()
{
  pcap_if_t *alldevs,*d;
  struct in_addr myipaddress;
  int i=0;
  char errbuf[PCAP_BUF_SIZE];
  arppacket arppk;
  arppk.eh_type=htons(0x0806);
  arppk.arp_hdr=htons(0x1);
  arppk.arp_pro=htons(0x0800);
  arppk.arp_hln=0x6;
  arppk.arp_pln=0x4;
  pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL,  &alldevs, errbuf);
    for(d=alldevs;d;d=d->next)
      cout<<++i<<"."<<d->name<<endl;
  myip=((struct sockaddr_in *)alldevs->addresses->addr)->sin_addr.S_un.S_addr;
  myipaddress.S_un.S_addr=myip;
  cout<<"my ip address:"<<inet_ntoa(myipaddress)<<endl;
  if((devpoint=pcap_open_live (alldevs->name, 65536, 1, 1, errbuf))==NULL)
  {cout<<"pacp_open error"<<endl;
  pcap_freealldevs(alldevs);}
  else 
  {  cout<<"pacp_open success"<<endl;}

  getmac();
  cout<<"MAC:";
  for(i=0;i<6;i++)
    cout<<mmac[i]<<":";

  return;

}

void getmac()
{
  int i,k;
  arppacket marppk;
  pcap_pkthdr *pkt_header;
  u_char *pkt_data;
  unsigned char sendbuf[42];
  marppk.arp_opt=htons(0x0001);
  marppk.eh_type=htons(0x0806);
  marppk.arp_hdr=htons(0x0001);
  marppk.arp_pro=htons(0x0800);
  marppk.arp_hln=6;
  marppk.arp_pln=4;
  for(i=0;i<6;i++)
  {
    marppk.arp_sha[i]=0x0f;
    marppk.eh_dst[i]=0xff;
    marppk.eh_src[i]=0x0f;
    marppk.arp_tha[i]=0x00;
  }

  marppk.arp_spa=inet_addr("127.0.0.2");
  marppk.arp_tpa=myip;
  
  memset(sendbuf,0,sizeof(sendbuf));
  memcpy(sendbuf,&marppk,sizeof(marppk));
  if((i=pcap_sendpacket(devpoint, sendbuf, 42))==0)
    cout<<"sendpacket success"<<endl;
  else
    cout<<"sendpacket error"<<endl;

  while((k=pcap_next_ex(devpoint,&pkt_header,(const u_char**)&pkt_data))>=0)
    {       
        if(*(unsigned short *)(pkt_data+12)==htons(0x0806)&&*(unsigned short*)(pkt_data+20)==htons(0x0002)&&*(unsigned long*)(pkt_data+38)==inet_addr("127.0.0.2"))
    {
      
      for(i=0;i<6;i++)
      {
        mmac[i]=*(unsigned char*)(pkt_data+22+i);
      }
        break;
    }
    }
  return;
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 185
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没有高手帮忙解决吗? 还是觉得问题太简单不屑于回答
2010-6-26 20:33
0
雪    币: 185
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
顶 没人回答吗?
2010-6-27 22:03
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
marppk.arp_tpa=myip;
memset(sendbuf,0,sizeof(sendbuf));
memcpy(sendbuf,&marppk,sizeof(marppk));
麻烦问下 在这里你的myip的数据你检查了吗?发送之前sendbuf的数据是不是正确的?另外你说success以后就停了,是怎样的停?
2010-6-27 23:00
0
雪    币: 185
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
首先感谢您能关注我这个问题,Myip的数据没问题,因为在程序中我用
myipaddress.S_un.S_addr=myip;
  cout<<"my ip address:"<<inet_ntoa(myipaddress)<<endl;
显示了myip的地址就是网卡的地址192.168.0.100
success以后就停了是因为
while((k=pcap_next_ex(devpoint,&pkt_header,(const u_char**)&pkt_data))>=0)
    {      
        if(*(unsigned short *)(pkt_data+12)==htons(0x0806)&&*(unsigned short*)(pkt_data+20)==htons(0x0002)&&*(unsigned long*)(pkt_data+38)==inet_addr("127.0.0.2"))
    {
      
      for(i=0;i<6;i++)
      {
        mmac[i]=*(unsigned char*)(pkt_data+22+i);
      }
        break;
    }
    }
因为没有得到符合条件的arp回应包(因为发出的数据包,目的地址由192.168.0.100变为了
204.204.192.168,所以不可能有204.204.192.168的主机来发送arp应答包),所以程序一直在进行while循环,循环读取包,所以是感觉是停在那儿了,我这么说您能明白吗?
sendbuf中的内容目的地址的确是错误的,但是其他内容都是正确的,所以我不明白为什么marppk中的数据没问题,memcpy到sendbuf就出错了,而且使用marppk.arp_tpa=inet_addr("192.168.0.100")结果仍然一样,请指教,谢谢
2010-6-27 23:39
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我以前用过winpcap
所以有点兴趣,是个菜鸟,一起研究吧,下了先
2010-6-28 00:22
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
原因知道了,如果你将sendbuf设为46,你会发现在sendbuf[42][43]的位置保存了我们需要的数据。在sendbuf[40][41]是我们需要的IP地址的一部分数据。而sendbuf[38][39]里面被填充了0xCC。原因我正在分析,很可能与arppacket的定义有关
2010-7-2 14:20
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
0012FAB8  FF FF FF FF FF FF 0F 0F 0F 0F 0F 0F 08 06 00 01 08 00 06  
0012FACB  04 00 01 0F 0F 0F 0F 0F 0F 7F 00 00 02 00 00 00 00 00 00
0012FADE  CC CC C0 A8 E7 01 CC CC

以上为marppk在内存中的数据,你可以看到C0 A8 E7 01 是我们所需要的,但是前面被填充了两个CC,这是起因。原因是你的arppacket声明时没有考虑到内存分布对齐。
解决办法是:
struct arppacket
{
    unsigned char   eh_dst[6];
    unsigned char   eh_src[6];
    unsigned short  eh_type;         
    unsigned short  arp_hdr;
    unsigned short  arp_pro;
    unsigned char   arp_hln;
    unsigned char   arp_pln;
    unsigned short  arp_opt;
    unsigned char   arp_sha[6];
    unsigned long   arp_spa;
    unsigned char   arp_tha[6];
    unsigned char   arp_tpa[8];
};

memcpy(marppk.arp_tpa,&myip,8);

参考 920K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6W2L8X3E0#2i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6$3K9h3g2%4i4K6u0r3j5h3p5K6z5h3g2W2j5K6M7^5z5h3g2T1x3e0M7J5k6r3g2V1y4U0y4T1y4K6p5$3i4K6u0W2K9s2c8E0L8l9`.`.
2010-7-2 19:45
0
雪    币: 185
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢您,其实原因我早已经找到了,是因为内存分布对齐的原因,其实用在前面加上
#pragma pack(2)
的方法更简单,还是谢谢您
2010-7-2 20:50
0
游客
登录 | 注册 方可回帖
返回