阅读:2309回复:18
请问在passthru怎么样得到ip地址
我是一个新手,我想知道怎么样在ptreceive函数中得到原ip地址,以及ip报头的格式,及ip报头的效验和算法
|
|
沙发#
发布于:2004-01-10 16:56
最好能有原代码
|
|
板凳#
发布于:2004-01-10 22:07
Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
if(Packet != NULL) { NdisQueryPacket(Packet, NULL, NULL,NULL, &CurRecvPktLen); BytesCopied=CopyPacketToBuffer( CurRecvBuffer, Packet, 0, MAC_HEADER_LEN +IP_HEADER_LEN+4 ); } |
|
地板#
发布于:2004-01-10 22:09
关于IP报头的校验和算法,改天再给你吧!
或者你可以参考一下关于TCP/IP协议的书,上面有详细的计算方法的,你自己都可以写出来哈 |
|
地下室#
发布于:2004-01-11 10:43
bobo_lei老兄:
可不可以解释一下你的代码,尤其是参数的数据类型定义,以及ip地址和mac地址存放的具体位置 Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); if(Packet != NULL) { NdisQueryPacket(Packet, NULL, NULL,NULL, &CurRecvPktLen); BytesCopied=CopyPacketToBuffer( CurRecvBuffer, Packet, 0, MAC_HEADER_LEN +IP_HEADER_LEN+4 ); } |
|
5楼#
发布于:2004-01-11 10:53
兄弟对ptreceive中的参数LookAheadBufferPointer用如下语句进行打印,发现
int jyb_number; jyb_number=LookAheadBufferSize; DbgPrint(\" HeaderBufferPointer: %u\\n\", HeaderBuffer); DbgPrint(\" LookAheadBufferPointer: %u\\n\", LookAheadBuffer); DbgPrint(\" HeaderBufferSize: %u\\n\", HeaderBufferSize); DbgPrint(\" LookAheadBufferSize: %u\\n\", LookAheadBufferSize); while (jyb_number) { DbgPrint(\"%u\", ((unsigned char *)LookAheadBuffer)[LookAheadBufferSize-jyb_number]); jyb_number--; } 发现ip报文的格式在某些情况下和书上写的一样,原ip地址位于第13个字节处即偏移12处(十进制),而在某些情况下会位于偏移14或15处(均为十进制),兄弟想知道这例外的情况有哪些,其报文格式是怎么样的! |
|
6楼#
发布于:2004-01-11 12:45
IP地址位于Ip报文的固定位置,这个是肯定的!不容质疑!!
你可以用softice跟踪调试,就可以知道的更清楚的 |
|
7楼#
发布于:2004-01-11 12:59
上面那段代码参数说明如下:
PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET Packet=NULL; PUCHAR CurRecvBuffer=NULL; unsigned int CurRecvPktLen; |
|
8楼#
发布于:2004-01-11 19:54
bobo_lei老兄是真的有不同,我拦截ip地址会出错
|
|
论坛版主
|
9楼#
发布于:2004-01-12 17:49
:)兄弟,你再抓包的时候先判断试不是TCP/IP的包,否则IP位置就不对了,比如还有IPX和其他协议的包(NDIS好像不认识的都写成DEFAULT)。
|
|
10楼#
发布于:2004-01-12 20:43
呵呵,上面这位老兄说得对,要先判断是不是TCP/IP的包^_^
|
|
11楼#
发布于:2004-01-13 14:43
老兄我察看了是ip包,HeaderBuffer[12]=0x08,HeaderBuffer[13]=0x00,可ip头仍然不对,麻烦兄弟帮我看看
|
|
12楼#
发布于:2004-01-13 20:22
可以把你的代码发给我看看吗?
我的邮箱是bobo_lei@163.com |
|
13楼#
发布于:2004-01-14 12:45
我就修改了这个函数
NDIS_STATUS PtReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket, Packet; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; //jyb++ begin int jyb_number;//循环记数器 DbgPrint(\" HeaderBufferPointer: %u\\n\", HeaderBuffer); DbgPrint(\" LookAheadBufferPointer: %u\\n\", LookAheadBuffer); DbgPrint(\" HeaderBufferSize: %u\\n\", HeaderBufferSize); DbgPrint(\" LookAheadBufferSize: %u\\n\", LookAheadBufferSize); DbgPrint(\" HeaderBuffer[12,13]: %u %u\", ((unsigned char *)HeaderBuffer)[12],((unsigned char *)HeaderBuffer)[13]); jyb_number=LookAheadBufferSize; while (jyb_number) { DbgPrint(\" LookAheadBuffer: %u\\n\", ((unsigned char *)LookAheadBuffer)[LookAheadBufferSize-jyb_number]); jyb_number--; } //jyb++ end 其它部分没有更改,仍然是微软的passthru示范代码 在上网时,发现就是标志为08,00是使用的ip协议的数据报,也会有ip地址不在偏移12处,不上网时,有时也有,不过大多数情况下会在偏移12处,以上标示了jyb++的为我加入的代码 |
|
14楼#
发布于:2004-01-15 14:12
bobo_lei老兄,帮我看看好吗?
|
|
15楼#
发布于:2004-01-16 00:05
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKET Packet=NULL; PUCHAR CurRecvBuffer=NULL; unsigned int CurRecvPktLen; PIP_HEADER SendIPHeader; //IP头结构得指针 Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext); if(Packet != NULL) { NdisQueryPacket(Packet, NULL, NULL,NULL, &CurRecvPktLen); BytesCopied=CopyPacketToBuffer( CurRecvBuffer, Packet, 0, CurRecvPktLen); } SendIPHeader = (PIP_HEADER)(CurRecvBuffer+MAC_HEADER_LEN); if (SendIPHeader->protocol == IP_PROTOCOL) { //这里加入对IP包处理得语句 } else { //非IP包,直接发送 } 看看这个代码吧,^_^,昨天没有上网哈 [编辑 - 1/16/04 by bobo_lei] |
|
16楼#
发布于:2004-01-16 00:06
楼上的兄弟,你没有对数据包的类型进行判断,所以可能出错啊
|
|
17楼#
发布于:2004-01-16 11:31
我此时,没有对得到的数据包进行任何处理啊,只是看看包结构,看见包标示为0x8,0时,即ip包时,也有ip原地址不位于偏移12处啊
|
|
18楼#
发布于:2004-01-17 23:22
兄弟,动手实践一下吧!^_^
试试就知道啦!!! |
|