阅读:1564回复:4
我快被传说中的ip包折磨死了,寻找救命稻草呀!
我用passthru想看ip包的内容,看过以前各位介绍的一些方法,我便试着去做,我在PtReceive()里加入
NdisQueryBufferSafe(headerbuffer, &virtualaddress, &bufLength, 32); 然后用softice在这个函数里下了断点,跳出后,调试指令是: d virtualaddress,然后可以在数据窗口中看见virtualaddress所指的存储区内容,不知我这种方法是否正确?该存储区内容就是数据包的内容吗?但我发现这样做观察到的数据好像并不是ip报的帧格式,即,第13,14字节并不是08,00,也不是08,06;另外,我还发现一个现象: 就是当我在PtReceive()入口处下断点,当窗口弹出后,我用如下的调试语句: d headerbuffer ,就会看到: 0010:8147311c 24 d6 d6 fc 0e 00 00 00-32 d6 d6 fc c8 00 00 00 我发现,0xfcd6d624与0xfcd6d632之间正好差14个字节,那会不会就是 ip包的mac头存放的地址?或者仅是一种巧合?我又试着用 d fcd6d624, 发现存的数据蛮有规律的,不知是何物?并且0e就是mac长,而c8也是我接收到的包的长度(packetsize)? 请问有哪位好心人肯拉兄弟一把?我陷在这里已多时了!定当重谢! |
|
最新喜欢:lsq77 |
沙发#
发布于:2002-05-01 11:03
你的方法是没错;用SoftIce在PtReceive中设置断点完全可以看见以太帧的帧头和以太帧payload的内容。通常,如果你没有其它的上网操作(比如开qq、IE等等),你会发现大部分情况下PacketSize == LookAheadBufferSize。你可以使用dd HeaderBuffer看见以太帧头,即6字节的目的MAC地址+6字节的源MAC地址+2字节的Etype。这个HeaderBuffer就是14字节的以太帧头,不用怀疑。而且LookAheadBuffer也正好与HeaderBufferSize偏移14字节,这个LookAheadBuffer开始的一片内存里存的很可能就是IP、ARP等等的包的内容。由于PtReceive被调用的太频繁,可能你没有发现IP、ARP。如果你只想看IP包或者ARP包,不妨加上这样几句:
PUCHAR p = (PUCHAR)HeaderBuffer; //加在开头 if (*(p + 12) == 0x08 && (*(p + 13) == 0x00 || *(p + 13) == 0x06) { int nouse = 0; //Set breakpoint here. } 在那一句int nouse = 0处设个断点,就会看到封装了IP或者ARP的以太帧。 [编辑 - 5/1/02 作者: falwind] |
|
板凳#
发布于:2002-05-01 22:43
找点RFC的文档看看吧,相信自己看文档比在这里企求别人回答好得多了
:D :D :D |
|
|
地板#
发布于:2002-05-07 19:53
在那有rfc的文档?
|
|
地下室#
发布于:2002-05-08 09:41
http://www.rfc-editor.org/
|
|
|