阅读:1479回复:9
monkeyy等高手请进!!!(150分请教)
monkeyy以及进来的诸位高手:您们好!
我在该版面上看了很多你写的关于在wince下实现NDIS的帖子。我是一个新手,看NDIS有半个月了吧。在NDIS版掘金之后已经能够让passhtru在win2k下显示网卡截包的信息。 由于我最终是要将passthru移植到wince下,加之之间紧迫,需要对此有一个基本了解。自己查看资料和动手做试验是必须的,不过先到论坛上问问老大也是加速进度的好办法:) 所以在此请教monkeyy一些问题。 1、关于开发环境。 现有的设备:Pocket PC(wince3.0)、Lucent silverCard 开发工具:Platform Builder4.0 除了这些还需要什么东西吗? 是否需要EMC?还有PPC SDK? 2、passthru能够捕获安装在win2k上的无线网卡发送和接受的数据包。不过没有枚举无线媒介(NdisMediumWirelessWan),不知道这对passthru最终的运行会不会有影响。 3、是一个基本概念问题。 在windows下IMD捕获的包都包含了以太网头部。我所作的工作需要修改IP头部,因此我也不得不去修改对应的MAC头部。我想问一下,有没有可以直接捕获IP包的技术,同时需要能够像IMD那样能够对捕获的包进行缓存以及根据需要进行修改和发送。 先想到这些,这段时间努力学习wince下的驱动开发。还有问题继续发问。 请高手们不吝赐教。小弟多多谢过,分数多多奉上。 |
|
沙发#
发布于:2004-08-27 11:20
附上我的联系方式:
E-mail:yiyang2000@eyou.com 请高手们多多执教。 [编辑 - 5/25/05 by darkme] |
|
板凳#
发布于:2004-08-27 11:26
还有一个很重要的问题:
passthru移植到wince下,要做的修改大吗? 我知道这个问题提得很笼统,原因是我对此一无所知。不过我想做过这方面得高手们应该会有一些自己的感受。小弟在此恭听。 |
|
论坛版主
|
地板#
发布于:2004-08-27 13:11
"
在windows下IMD捕获的包都包含了以太网头部。我所作的工作需要修改IP头部,因此我也不得不去修改对应的MAC头部。我想问一下,有没有可以直接捕获IP包的技术,同时需要能够像IMD那样能够对捕获的包进行缓存以及根据需要进行修改和发送。 " 2k下Ndis还作过些,直接捕获ip包?在Imd里面捕获的包除了14个字节的Mac头部以外就是ip包啊,你可以直接用,mac头除了6字节源,6字节目地址外是2字节上层包类型字段,整个mac头没有更多的动作要做,你提取出ip包处理后直接把mac头加回去就可以了。对了,你需要先了解那几个数据结构来找到Mac帧在哪里。 |
|
地下室#
发布于:2004-08-27 14:22
" 可能是我说得不太清楚吧。 我现在已经能够获得整个数据包的信息(包括你说的以太网头部以及IP部分)。 下面以一个例子来说吧: 拓扑图: A --> B --> C 其中A、B、C为AD HOC网络中的节点。节点A要发送消息给C,根据从C返回的路由表,节点A要先将消息发送给B,然后由B转发给C。 这样由A发送的消息,其在TCP(或者UDP层),其目的节点里填写的是C的IP。但到了IP层(即在IP包头部)其目的地址填写的是节点B的IP,此时MAC头部的目的地址也要修改成节点B的MAC。也就是说节点B起到了一个路由器的作用。 当节点B收到节点A的信息之后,查看IP头部后面携带的路由表发现数据包是要转发给节点C的,于是它就修改目的IP和目的MAC,然后将整个数据包转发给节点C。 这样就完成了从节点A发送数据包到节点C的全部过程。 从上面的例子我们可以看到: 如果我们截获的只是IP包,即对于底下的MAC层是透明的,那么当我们转发包的时候,由系统自动查找目的IP所对应的MAC,然后进行转发。 而如果像IMD那样不但截获IP包,还截获了MAC信息,在发送的时候需要自己构造一个MAC包头(在单跳情况下可以直接使用原始包的MAC信息,但多跳情况下就得动手修改MAC了)。 因此,我想了解的是有没有只获得IP包的方法。 如果没有,那么在IMD中修改MAC,是否可行? 多谢您的答复!!! |
|
5楼#
发布于:2004-08-27 14:32
这里写错了:
这样由A发送的消息,其在TCP(或者UDP层),其目的节点里填写的是C的IP。 应该是“在TCP或者UDP层,其目的端口填写的是C的端口。” 实际上中间节点的包并不会处理TCP或者UDP的数据。 |
|
论坛版主
|
6楼#
发布于:2004-08-27 15:45
我还是不太明白,你的b节点就是一个路由器,按你的描述,如果是源选径路由,a->c的包为mac(b)ip(b),发给b后,b根据源选径路有扩展头知道需要转发给c,那么在ip层就会arp得到c的mac,然后在imd截获这个包之前就变成mac(c)ip(c)。如果不是源选径路由,a->c的包第一跳是b,则mac(b)ip(c),在b收到后看到目的ip是c,也会通过arp得到c的mac地址,然后包变成mac(c)ip(c),也就是说,在imd层得到的包是经过ip层充分处理的包,不需要你自己进行arp处理,至于专门的需要你可以在imd将mac替换成任意你希望的值从而实现任意路由。这里不存在是否需要只获得ip包的问题啊
|
|
7楼#
发布于:2004-08-27 16:13
我还是不太明白,你的b节点就是一个路由器,按你的描述,如果是源选径路由,a->c的包为mac(b)ip(b),发给b后,b根据源选径路有扩展头知道需要转发给c,那么在ip层就会arp得到c的mac,然后在imd截获这个包之前就变成mac(c)ip(c)。如果不是源选径路由,a->c的包第一跳是b,则mac(b)ip(c),在b收到后看到目的ip是c,也会通过arp得到c的mac地址,然后包变成mac(c)ip(c),也就是说,在imd层得到的包是经过ip层充分处理的包,不需要你自己进行arp处理,至于专门的需要你可以在imd将mac替换成任意你希望的值从而实现任意路由。这里不存在是否需要只获得ip包的问题啊 哦?是这样吗? 如果是的话就太好了。^_^ 需要说明的是,在AD HOC网络中并没有专门的路由器概念。每个节点既作为终端节点又作为路由器。路由的实现是通过我们将网卡设置成混杂模式,然后拦截所有的包,从中获得所需的信息然后修改数据包而完成的。 “a->c的包第一跳是b,则mac(b)ip(c),在b收到后看到目的ip是c,也会通过arp得到c的mac地址,然后包变成mac(c)ip(c)。” 这个我拿程序做一下测试。不过不晓得时间能不能安排过来。快忙死了~~~~sigh~~~~~~~~ 对了,wxl,可以通过MSN交流吗?我想向你多多请教:) |
|
8楼#
发布于:2004-08-27 16:23
我的一点看法,可能会有错误:
IMD工作在MAC之上,在IP层之下。 我们可以修改IP包,但这里我们无法替IP层完成查找与IP对应的MAC的工作。 我们修改了IP包头中的目的地址,IP层并不知道!! 修改后的数据包将被MPSend或者MPSendPacket发送出去。 而在此之前,为了保证目的IP与MAC的对应,我们必须自己修改MAC地址。 不知道这么理解是否有错。请多多执教。 |
|
论坛版主
|
9楼#
发布于:2004-08-27 16:57
你是说你要自己换一个ip,然后再将这个IP的mac也换掉?这样做也是可以的,总之你得到了MAC帧,所有的控制权都在你,你可以对包进行任意修改,在这层你甚至可以实现重路由功能,甚至可以把包发给任意不是网卡的设备,
我不怎么用msn,上班了,不方便用,我们可以用mail讨论:) wxl_50685330@163.com |
|