flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1732回复:15

为什么我收到的packet非的启动sniffer才能接收正常啊?asmsys 和zxcasd请进,我送分来了:)其他人也进来坐坐吧! 胡老大有没时间啊:)

楼主#
更多 发布于:2004-04-22 18:47
老问题解决了,新问题又来了 :(
老问题见http://www.driverdevelop.com/forum/html_65893.html?1082699550

具体如下:
我在miniport(虚拟的)中的miniportsend例程中把收到的packet数据取到自己的缓冲区,然后修改目的和源MAC,ip地址信息,端口,校验和等信息,再回传到上层协议,用sniffer可以抓到发送和接收到的包,应用程序也可收到包。但只要关闭sniffer就完蛋啦!应用程序就收不到包啦。

具体方案和现象如下:我实现的是虚拟网卡,就是没有硬件的,现在再测试收发功能,本来收发要靠irp请求的。

  安装两个网卡(为同样的虚拟网卡),设置通网段ip地址,简称a和b.现在通过a发udp包到一个不存在的c地址。在miniport做好arp欺骗(这样做是因为直接发到b会通过协议栈就转发了不经过miniport),发送数据时,a首先发到c一个arp请求包,在miniport中收到后改为c到b的ARP请求包上指到协议栈,这时会有个b到c应答ARP包,在miniport中收到后改为c到a的应答包,这样a和b就都有了c的mac地址,做好了ARP准备后开始发包。数据包的转发同ARP包。

/*****************************************************
    其实现在的问题(可能)就是为什么在b收到ARP请求包后,没有ARP应答包?我DbgPrint出来的没有ARP应答包的:(,用ARP -a可以看出b已经知道了c的MAC地址啊!
    而启动EtherDetect Packet Sniffer绑定b时ARP应答包就有了,并且正确。
    郁闷啊!这好像和Miniport没关系????????
    2004/04/26
******************************************************/

    不启动sniffer的话或者启动一个的话,发现只有b知道c的mac地址,a不知道,所以一直在发ARP请求包,用DbgPrint打印信息竟然没有ARP应答包。然后启动两个sniffer分别绑定两个网卡的话,数据的收发正常(即应用层可以收发数据,数据流经miniport)。但是如果停止发送网卡的sniffer的话,一切还是正常。只要停止绑定接收网卡的sniffer就收就停止,启动抓包,接受就又正常。
    我被搞晕了,各位费心帮帮忙吧!以下是相关源代码:


[编辑 -  4/26/04 by  flyhobo]
好好过日子
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-22 18:55
//****************************
pTCB->pData为接收到mac包缓冲区

a的ip地址为172.96.38.85(85 = 0x55)
b的ip地址为172.96.38.88(88 = 0x58)
c的ip地址为172.96.38.86(86 = 0x56) mac = 02-50-f2-00-00-88
//****************************

DbgPrint(\"当前版本号:206\\n\");
pChar = pTCB->pData;
if ((pChar[12] == 0x08) && (pChar[13] == 0x06))
{
DbgPrint(\"当前包为ARP包:\");

#if DBG
ARPPacketView(pChar);//dbgprint察看整个ARp包
#endif

//if this is a query ARP
if ((pChar[20] == 0x00) && (pChar[21] == 0x01))
{
//if from 55 to 56
if ((pChar[31] == 0x55) && (pChar[41] == 0x56))
{
//chang ARP to that form 56 to 58
MACAddr_IP55.Add[0] = pChar[6];
MACAddr_IP55.Add[1] = pChar[7];
MACAddr_IP55.Add[2] = pChar[8];
MACAddr_IP55.Add[3] = pChar[9];
MACAddr_IP55.Add[4] = pChar[10];
MACAddr_IP55.Add[5] = pChar[11];

pChar[6] = MACAddr_IP56.Add[0];
pChar[7] = MACAddr_IP56.Add[1];
pChar[8] = MACAddr_IP56.Add[2];
pChar[9] = MACAddr_IP56.Add[3];
pChar[10] = MACAddr_IP56.Add[4];
pChar[11] = MACAddr_IP56.Add[5];

pChar[22] = MACAddr_IP56.Add[0];
pChar[23] = MACAddr_IP56.Add[1];
pChar[24] = MACAddr_IP56.Add[2];
pChar[25] = MACAddr_IP56.Add[3];
pChar[26] = MACAddr_IP56.Add[4];
pChar[27] = MACAddr_IP56.Add[5];

pChar[31] = 0x56;
pChar[41] = 0x58;

DbgPrint(\"Message:当前ARP query包已处理\");
#if DBG
ARPPacketView(pChar);
#endif
}
else
{
DbgPrint(\"Warning:当前ARP query包为非预测包,不予处理\");
}
}
//else if this is a answer ARP
else if ((pChar[20] == 0x00) && (pChar[21] == 0x02))
{
//if from 58 to 56
if ((pChar[31] == 0x58) && (pChar[41] == 0x56))
{
//chang ARP to that form 56 to 55
pChar[0] = MACAddr_IP55.Add[0];
pChar[1] = MACAddr_IP55.Add[1];
pChar[2] = MACAddr_IP55.Add[2];
pChar[3] = MACAddr_IP55.Add[3];
pChar[4] = MACAddr_IP55.Add[4];
pChar[5] = MACAddr_IP55.Add[5];

MACAddr_IP58.Add[0] = pChar[6];
MACAddr_IP58.Add[1] = pChar[7];
MACAddr_IP58.Add[2] = pChar[8];
MACAddr_IP58.Add[3] = pChar[9];
MACAddr_IP58.Add[4] = pChar[10];
MACAddr_IP58.Add[5] = pChar[11];

pChar[6] = MACAddr_IP56.Add[0];
pChar[7] = MACAddr_IP56.Add[1];
pChar[8] = MACAddr_IP56.Add[2];
pChar[9] = MACAddr_IP56.Add[3];
pChar[10] = MACAddr_IP56.Add[4];
pChar[11] = MACAddr_IP56.Add[5];

pChar[22] = MACAddr_IP56.Add[0];
pChar[23] = MACAddr_IP56.Add[1];
pChar[24] = MACAddr_IP56.Add[2];
pChar[25] = MACAddr_IP56.Add[3];
pChar[26] = MACAddr_IP56.Add[4];
pChar[27] = MACAddr_IP56.Add[5];

pChar[31] = 0x56;

pChar[32] = MACAddr_IP55.Add[0];
pChar[33] = MACAddr_IP55.Add[1];
pChar[34] = MACAddr_IP55.Add[2];
pChar[35] = MACAddr_IP55.Add[3];
pChar[36] = MACAddr_IP55.Add[4];
pChar[37] = MACAddr_IP55.Add[5];

pChar[41] = 0x55;

DbgPrint(\"Message:当前ARP answer包已处理\");
#if DBG
ARPPacketView(pChar);
#endif
}
else
{
DbgPrint(\"Warning:当前ARP answer包为非预测包,不予处理\");
}
}
}
else //为数据包
{
//if from 55 to 56
if ((pChar[29] == 0x55)&& (pChar[33] == 0x56))
{
//change from 56 to 58
DbgPrint(\"当前包为发送的数据IP包from 55 to 56:\");
DbgPrint(\"+++++++++++++++++++++++++!\");
DbgPrint(\"Modified MAC IP UDP heard!\");
DbgPrint(\"+++++++++++++++++++++++++!\");

//目的MAC地址
pChar[0] = MACAddr_IP58.Add[0];
pChar[1] = MACAddr_IP58.Add[1];
pChar[2] = MACAddr_IP58.Add[2];
pChar[3] = MACAddr_IP58.Add[3];
pChar[4] = MACAddr_IP58.Add[4];
pChar[5] = MACAddr_IP58.Add[5];

//原MAC地址
pChar[6] = MACAddr_IP56.Add[0];
pChar[7] = MACAddr_IP56.Add[1];
pChar[8] = MACAddr_IP56.Add[2];
pChar[9] = MACAddr_IP56.Add[3];
pChar[10] = MACAddr_IP56.Add[4];
pChar[11] = MACAddr_IP56.Add[5];

//源ip
pChar[29] = 0x56;

                                //目的ip
pChar[33] = 0x58;

//计算IP和UDP包头的校验和
*((unsigned short *)(pChar + 24)) = 0;
*((unsigned short *)(pChar + 24)) = cal_chksum((unsigned short *)(pChar + 14),20);

UdpCheckSum(pChar + 14);

//++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
else
{
DbgPrint(\"还有其他帧类型的MAC包:\");
}
}
好好过日子
zxcasd
驱动牛犊
驱动牛犊
  • 注册日期2001-06-14
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-22 22:24
偶其实也不是很清楚,看了一下你的问题,我大致理解会不会是你的网卡绑定的问题,你用的sniffer是基于什么原理做的?
死了都要爱......
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-23 08:48
很可能是绑定的问题,我怀疑你虚拟网卡没有处理或没有很好的处理PNP,导致SNIFFER写载时不能被上层的PROTOCOL绑定。
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-23 09:00
很可能是绑定的问题,我怀疑你虚拟网卡没有处理或没有很好的处理PNP,导致SNIFFER写载时不能被上层的PROTOCOL绑定。

我这是虚拟网卡啊!并且系统启动时网卡也应该启动了吧?这是不启动sniffer,ARP请求包发送和接收都正常,应为通过ARP -a可以查看到b已经知道了c的mac地址,说明修改后的ARP请求包还是到达了c的。但奇怪的是没有ARP应答包,这是咋回事呢?

处理PNP,我还得看看资料了!我是在2003ddk的虚拟网卡例子NetVMini的基础上修改的,没看到他处理PNP,需要处理吗?指点一下方向和ddk中资料的位置了,我先找找。

[编辑 -  4/23/04 by  flyhobo]
好好过日子
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-23 09:06
偶其实也不是很清楚,看了一下你的问题,我大致理解会不会是你的网卡绑定的问题,你用的sniffer是基于什么原理做的?

>>>你用的sniffer是基于什么原理做的?
惭愧啊!我不清楚的,我用的是EtherDetect Packet Sniffer啦,好像是Politecnico di Torino的产品,看其帮助文档说“Capture IP packets on your LAN with nearly no packets losing. ”应该是工作在IP层的,事实上我也没抓到过ARP包。

[编辑 -  4/26/04 by  flyhobo]
好好过日子
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-23 09:14
因为SNIFFER的启动写载会改变原来的绑定关系,如果你的驱动不处理
PNP,就不能做一些动态加载的工作,来恢复到SNIFFER加载以前的状态。
关于PNP,任何将2000驱动的书上估计都有。能发一个你的程序我看看吗?
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-23 09:21
留下你的Email了 :P
好好过日子
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-23 09:24
因为SNIFFER的启动写载会改变原来的绑定关系,如果你的驱动不处理
PNP,就不能做一些动态加载的工作,来恢复到SNIFFER加载以前的状态。
关于PNP,任何将2000驱动的书上估计都有。能发一个你的程序我看看吗?

 :D看来我还有太多的东西要搞清楚!努力学习,天天向上!!!!
好好过日子
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-23 09:42
asmsys@163.com
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-23 14:10
高手那!
辛苦了,帮俺把把脉啊!俺也好有个方向
我正按asmsys的指点在啃ddk的pnp资料
但我还是担心有其他的遗漏,因为在完全不启动EtherDetect Packet Sniffer时也工作不正常,关键是必须启动EtherDetect Packet Sniffer才可以工作正常。

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
最奇怪为什么ARP请求包收发都正常,而没有ARP应答包内?
这里肯定有问题?收到ARP请求包不回应 ????????
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

停止EtherDetect Packet Sniffer后,数据接收停止,按 asmsys的说法可以这样理解。因为俺确实没有处理PNP,SNIFFER卸载时不能被上层的PROTOCOL绑定了。
好好过日子
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-26 08:49
我顶
好好过日子
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-26 09:57
你把A和B的IP设置为不同的网段,这样就不用做ARP欺骗了,然后再按照你上面的步骤试一下。
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-26 14:21
你把A和B的IP设置为不同的网段,这样就不用做ARP欺骗了,然后再按照你上面的步骤试一下。

我做了实验,但好像不行的,还是要做ARP欺骗的,也就是说还的要第三方的那个c来中转,并且这样一来,还得手工加route。

现在就是为什么在b收到ARP请求包却不发出ARP应答包。我感觉有可能是协议(ARP)和网卡b没有绑定好或者从别的地方走了?

最最恼火的是为什么要做这些没有太大意义的测试,我是身不由己啊!有什么理由能说服老大不做这些测试啊!!!!!主要是测试收发数据的正确性和速率!!
好好过日子
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-04-27 13:43
ding  :mad:
好好过日子
flyhobo
驱动小牛
驱动小牛
  • 注册日期2004-03-05
  • 最后登录2005-05-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-05-11 16:21
问题解决了
散份了
怎么给分的连接不见了啊?

[编辑 -  5/11/04 by  flyhobo]
好好过日子
游客

返回顶部