baijbup
驱动牛犊
驱动牛犊
  • 注册日期2001-08-03
  • 最后登录2003-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4220回复:2

关于im抓包的几个问题

楼主#
更多 发布于:2001-09-06 09:53
有几个问题能给我回答一下吗?:)
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);

最新喜欢:

moqingsongmoqing...
************************ 寻找快乐的人 ************************
baijbup
驱动牛犊
驱动牛犊
  • 注册日期2001-08-03
  • 最后登录2003-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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????
************************ 寻找快乐的人 ************************
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
板凳#
发布于: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要输出这样的函数,不过既然有就可以用。
不过这个函数没有文档,也许兼容性不好。


不再回忆从前,我已经生活在幸福当中。
游客

返回顶部