zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3296回复:8

关于ndis_packet的结构问题,各位大侠给讲解一下吧

楼主#
更多 发布于:2003-04-16 11:49
我用passthru改编程序,截获数据包的时候是用一个pndis_packet格式的指针存起来的,而在DDK文档里面可以看到pndis_packet是定义成ndis_packet结构的指针的,那就是说ndis_packet是用来放数据包的了。可是一般包上有ip头,mac头,(是不是还有ndis定义的头我不太懂),还有数据字段,而DDK里面给出的那个ndis_packet的结构定义看不出有这些字段呀,而是一些reserved什么的:

typedef struct _NDIS_PACKET {
    NDIS_PACKET_PRIVATE  Private;
    union {
        struct {
             UCHAR       MiniportReserved[2*sizeof(PVOID)];
             UCHAR       WrapperReserved[2*sizeof(PVOID)];
        };
        struct {
             UCHAR       MiniportReservedEx[3*sizeof(PVOID)];
             UCHAR       WrapperReservedEx[sizeof(PVOID)];
        };
        struct {
             UCHAR       MacReserved[4*sizeof(PVOID)];
        };
    };
    ULONG_PTR            Reserved[2];
    UCHAR                ProtocolReserved[1];
} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;

这到底是怎么一个关系,我搞的头都大了,翻了以前的文章,好象也没见到讲的很清楚的(难道我看的太不仔细了?),我的工作是要截获包修改mac头然后转发出去,现在已经可以截获下来保存到一个pndis_packet里面了,但是就不知道怎么去找对应的mac头字段的位置了,也就没有办法修改了 :(,导师催的又急,各位大侠指点迷津呀!!!!!!!!!!

最新喜欢:

baoyibao99baoyib... TickKingTickKi...
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-16 13:28
以前有帖子讲这个,你去搜搜吧!
好运!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2003-04-16 13:43
到DDK 帮助
Network Drivers->Design Guide->Part1 Network Drivers->3.0 Network Drivers Programming Considerations->3.5 Packet Structure。
看完了这篇文章,你要是还不知道怎么办,我也没办法了。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-04-16 14:02
既然你已经看到这个结构了,你为什么没有再看一看private的结构呢?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
david99
驱动牛犊
驱动牛犊
  • 注册日期2001-06-02
  • 最后登录2010-12-03
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-16 15:21
typedef struct _NDIS_PACKET_PRIVATE {
    UINT PhysicalCount; // number of physical pages in packet.
    UINT TotalLength; // Total amount of data in the packet.
    PNDIS_BUFFER Head; // first buffer in the chain
    PNDIS_BUFFER Tail; // last buffer in the chain

    PNDIS_PACKET_POOL Pool; // so we know where to free it back to
    UINT Count;
    ULONG Flags;
    UCHAR Reserved[8]; // for future expansion
} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;

NDIS_BUFFER 定义:

typedef struct _NDIS_BUFFER {
    struct _NDIS_BUFFER *Next;
    PVOID VirtualAddress;
    PNDIS_BUFFER_POOL Pool;
    UINT Length;
    UINT Signature;
} NDIS_BUFFER, * PNDIS_BUFFER;

NDIS_PACKET是一个 NDIS_BUFFER 结构的链表。数据包是用 NDIS_BUFFER来表示,VirtualAddress 是数据包的缓冲区指针,Length是VirtualAddress 的长度,Next指向下一个数据包缓冲区。通过这个链表可以得到一个完整的网络数据包。
zuozi
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2004-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-16 15:48
感谢各位的答复!!!!!不过我还是有些不大明白,看来我比较苯吧 :mad:

to mikeluo大侠:private的结构在哪里找呀,我搜索了一下NDIS_PACKET_PRIVATE,没有搜出什么结果呀,还有PVOID是指一个普通指针的长度么?

to fracker斑竹:十分感谢您的提醒,这篇文章一开始看DDK的时候还看过,竟然忘记了(我真是。。。sigh),这个东东确实是用来解析packet包的,您看对于如下这段代码我的解释有什么问题:

NdisZeroMemory(pPacketContent, 2000);
NdisMoveMemory(pPacketContent, HeaderBuffer, HeaderBufferSize);
NdisMoveMemory(pPacketContent+ HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize);
PacketLen = PacketSize+HeaderBufferSize;
//将数据包的内容拷贝到pPacketContent里面去,这里的包应该是实际在网络中传输的部分 :cool:

NdisDprAllocatePacket(&Status,&MyPacket,pAdapt->RecvPacketPoolHandle);
//分配一个自己定义的packet头

if(Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketLen);
//分配一段?一个?buffer,buffer指向的是我们实际的包的内容,包括数据还有mac头,ip头,tcp头。这些东西事先拷贝到我们所分配的memory就是pPacketContent里面。

NdisChainBufferAtFront( MyPacket, PacketBuffer);
//把packet和buffer链起来

MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
Resvd =(PRSVD)(MyPacket->MiniportReserved);
Resvd->OriginalPkt = NULL;
NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize );
//这些就是给ndis_packet的头的一些参数赋值了

NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);

如果我要修改包的话,就可以在:cool:的地方,对pPacketContent对应的位直接修改,这样理解对么?



还有,这是我理解的mac头和ip头格式,各位大侠看看对么?多谢!
// Ethernet
unsigned char  targ_hw_addr[6]; // 目的地址,6字节。
unsigned char  src_hw_addr[6]; // 源地址,6字节。
unsigned char  H_frame_type;
unsigned char  L_frame_type;
// IP
unsigned char h_verlen;           //4位首部长度,4位IP版本号
unsigned char tos;                //8位服务类型TOS
unsigned short total_len;         //16位总长度(字节)
unsigned short ident;             //16位标识
unsigned short frag_and_flags;    //3位标志位和13位偏移
unsigned char  ttl;               //8位生存时间 TTL
unsigned char proto;              //8位协议 (1->ICMP, 2->IGMP, 6->TCP, 17->UDP)
unsigned short checksum;          //16位IP首部校验和
unsigned int sourceIP;            //32位源IP地址
unsigned int destIP;              //32位目的IP地址


不过,fracker老大,这个虽然解决了我面对的实际问题(我觉得解决了,如果我上面的分析基本正确的话呵呵),我还是对_NDIS_PACKET的结构定义不太理解,您所说的那篇文章所提到的Flags,PhysicalPageCount,FirstBuffer都放在什么地方了呀?还望各位大侠点拨一下!!!

to monkeyy大侠:我正在搜索以前的帖子,多谢!
 

[编辑 -  4/16/03 by  zuozi]
juanjuanloveran
驱动牛犊
驱动牛犊
  • 注册日期2011-03-25
  • 最后登录2011-03-28
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2011-03-25 09:57
回 4楼(david99) 的帖子
能不能留下QQ啊,有很多问题,不懂~~关于ndis驱动改造的
台灯下的光
驱动牛犊
驱动牛犊
  • 注册日期2011-03-30
  • 最后登录2011-06-05
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2011-05-26 09:37
// 以太头
typedef struct _ETH {
UCHAR eth_dest[6]; // 目标MAC地址
UCHAR eth_src[6]; // 源MAC地址
union {
USHORT eth_type; // Ethernet type field.
USHORT eth_len; // 802.3 length field.
};
} ETH, *PETH;

//IP头
typedef struct IP_HEADER
{
UCHAR iph_verlen; // 版本 (4 bits) + 首部长度 (4 bits)
UCHAR iph_tos; // 8位服务类型(Type of service)
USHORT iph_length; // 16位总长(Total length)
USHORT iph_id; // 16位标识(Identification)
USHORT iph_offset; // 3位标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)
UCHAR iph_ttl; // 8位存活时间(Time to live)
UCHAR iph_protocol; // 8位协议(Protocol)
USHORT iph_xsum; // 16位首部校验和(Header checksum)
UCHAR iph_src[4]; // 32位源地址(Source address)
UCHAR iph_dest[4]; // 32位目的地址(Destination address)
} IP_HEADER, *PIP_HEADER;

//UDP头
typedef struct UDP_HEADER{
USHORT sport; // 源端口(Source port)
USHORT dport; // 目的端口(Destination port)
USHORT len; // UDP数据包长度(Datagram length)
USHORT crc; // 校验和(Checksum)
}UDP_HEADER,*PUDP_HEADER;
  //TCP头部
struct TCP_HEADER      
 {
    USHORT sport;
    USHORT dport;
   UCHAR m_seq[4];
   USHORT m_ack[4];  
    char m_hlen_res4;              //4位tcp头部长,6位保留的前4位
    char m_res2_flag;              //6位保留的后2位,6位标志
    USHORT m_win;
    USHORT m_cksum;
    USHORT m_urp;
} TCP_HEADER,*PTCP_HEADER;
// 以太头
typedef struct _ETH {
UCHAR eth_dest[6]; // 目标MAC地址
UCHAR eth_src[6]; // 源MAC地址
union {
USHORT eth_type; // Ethernet type field.
USHORT eth_len; // 802.3 length field.
};
} ETH, *PETH;
台灯下的光
驱动牛犊
驱动牛犊
  • 注册日期2011-03-30
  • 最后登录2011-06-05
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2011-05-26 09:37
// 以太头
typedef struct _ETH {
UCHAR eth_dest[6]; // 目标MAC地址
UCHAR eth_src[6]; // 源MAC地址
union {
USHORT eth_type; // Ethernet type field.
USHORT eth_len; // 802.3 length field.
};
} ETH, *PETH;

//IP头
typedef struct IP_HEADER
{
UCHAR iph_verlen; // 版本 (4 bits) + 首部长度 (4 bits)
UCHAR iph_tos; // 8位服务类型(Type of service)
USHORT iph_length; // 16位总长(Total length)
USHORT iph_id; // 16位标识(Identification)
USHORT iph_offset; // 3位标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)
UCHAR iph_ttl; // 8位存活时间(Time to live)
UCHAR iph_protocol; // 8位协议(Protocol)
USHORT iph_xsum; // 16位首部校验和(Header checksum)
UCHAR iph_src[4]; // 32位源地址(Source address)
UCHAR iph_dest[4]; // 32位目的地址(Destination address)
} IP_HEADER, *PIP_HEADER;

//UDP头
typedef struct UDP_HEADER{
USHORT sport; // 源端口(Source port)
USHORT dport; // 目的端口(Destination port)
USHORT len; // UDP数据包长度(Datagram length)
USHORT crc; // 校验和(Checksum)
}UDP_HEADER,*PUDP_HEADER;
  //TCP头部
struct TCP_HEADER      
 {
    USHORT sport;
    USHORT dport;
   UCHAR m_seq[4];
   USHORT m_ack[4];  
    char m_hlen_res4;              //4位tcp头部长,6位保留的前4位
    char m_res2_flag;              //6位保留的后2位,6位标志
    USHORT m_win;
    USHORT m_cksum;
    USHORT m_urp;
} TCP_HEADER,*PTCP_HEADER;
// 以太头
typedef struct _ETH {
UCHAR eth_dest[6]; // 目标MAC地址
UCHAR eth_src[6]; // 源MAC地址
union {
USHORT eth_type; // Ethernet type field.
USHORT eth_len; // 802.3 length field.
};
} ETH, *PETH;
游客

返回顶部