阅读:4220回复:2
关于im抓包的几个问题
有几个问题能给我回答一下吗?:)
1。请问你在相应read irp时候是怎么把要给上层的数据 送给itp->associated.buffer?是rtlmemorycopy 还是memcpy? 2。 你能告诉我在im层获得的ip包的结构马? 我现在用passthru来抓包。我翻看了tcp/ip的 协议,说的是ip包的前20个字节是包头。其中 后8个是源和目的地址。可是我看前面一些人的 文章想“过滤icmp源码“中提到第12、13字节 是协议内容,这两者好像不一样呀????? 3。还有,我现在在passthru的基础上变成,我想得到 发送出去的包的ip地址,我在mpsend中抓包。 我跟踪过,我的网卡走的是mpsend。可是,现在我的 抓包程序一放上去,我的所有的数据包就不能发送 到网上(连ping都平不通了)。可是为什么呢? 用soft_ice跟踪,发现:NdisQueryPacket(MyPacket, NULL, NULL, &firstBuffer, &totalLength); 中firstbuffer为NULL,请多多指点,谢谢!!!! 我的源程序如下: NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle); if (Status == NDIS_STATUS_SUCCESS) { PNDIS_PACKET_EXTENSION Old, New; //////////////////new adding if(MyPacket!= NULL) { NdisQueryPacket(MyPacket, NULL, NULL, &firstBuffer, &totalLength); if( firstBuffer != NULL) { NdisQueryBuffer(firstBuffer, &virtualAddress, &totalLength); if(!virtualAddress) { } else { RtlCopyMemory(m_Packet[m_buffercount],virtualAddress,READLEN); DBGPRINT ("==>Passthru MPSend and Ready for filter!\n"); memcpy(Packet_data,virtualAddress,totalLength); } } } ///////////////////////new adding Rsvd = (PRSVD)(MyPacket->ProtocolReserved); Rsvd->OriginalPkt = Packet; MyPacket->Private.Flags = Flags; MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK); NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), NDIS_OOB_DATA_FROM_PACKET(Packet), sizeof(NDIS_PACKET_OOB_DATA)); NdisIMCopySendPerPacketInfo(MyPacket, Packet); |
|
最新喜欢:moqing...
|
沙发#
发布于:2001-09-06 15:50
我现在已经知道2、3答案了,感谢Dino大侠。
但是,我现在想把抓到的包传送到上层,我 在mpintialize中用exallocatepool为下面这个变量分配了空间 char *m_Packet[PACKET_BUFFER_MAXLEN]; 然后再mpsend抓到包并得到包的virtualAddress. va=(char*)virtualAddress; 最后,我想把va的置copy到m_Packet, #define READLEN 36 if(totalLength>READLEN) totalLength=READLEN; RtlCopyMemory(m_Packet[m_buffercount],va,totalLength); 但是,我一旦加入RtlCopyMemory(m_Packet[m_buffercount],va,totalLength); 我的驱动就会导致死机,为什么呢?我是不是应该用 ndismovememory???? |
|
|
板凳#
发布于:2001-09-07 00:42
好像你的问题就剩下这么多了,我没有看你的代码,
我现在看到代码就头痛。 基本上这几个函数在x86上是一样的。 最基本的当然就是rtlcopymemroy,ndismovemeory 实际上不过是考虑了9x/nt/2k上的兼容以及平台兼容。 memcpy看起来不能用,但是只要include stdlib.h就 行了,对于应用程序来说,linker把stdlib.lib连接 进去了,那么对于driver来说,这个函数到底在哪里 呢?这个函数在osknrl.exe里面。这个是nt/2k的执行体, 可以用dumpbin或者别的什么工具察看这个exe的输出, 你可以看到多个c标准库输出函数。我不知道为什么 nt/2k要输出这样的函数,不过既然有就可以用。 不过这个函数没有文档,也许兼容性不好。 |
|
|