bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1692回复:17

怎样从packet包信息得到IP地址?(fracker版主请进...)

楼主#
更多 发布于:2002-11-05 10:30
封包packet定义为PNDIS_PACKET结构。
我现在想从此包中得到源IP地址和目标IP地址,能实现吗?怎样实现?
小弟急用,请那位大侠帮帮忙!!

[编辑 -  11/5/02 by  bhjinhou]

[编辑 -  11/17/02 by  bhjinhou]

最新喜欢:

goodbillgoodbi...
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-05 11:10
关注!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2002-11-05 11:14
拷贝一段程序给你吧,把Packet里面的数据Dump出来:
UINT
CopyPacketData(
PNDIS_PACKET pPacket,
PCHAR pData,
UINT iSize
)
{
UINT iLength;
UINT iPos;
PNDIS_BUFFER pNextBuffer;
PCHAR pBuffer;

iPos = 0;
NdisQueryPacket( pPacket, NULL, NULL, &pNextBuffer, &iLength );
if( iLength > iSize ) return iPos;
while( pNextBuffer ) {
NdisQueryBuffer( pNextBuffer, &pBuffer, &iLength );
if( iLength > iSize - iPos || !pBuffer ) break;
NdisMoveMemory( pData + iPos, pBuffer, iLength );
NdisGetNextBuffer( pNextBuffer, &pNextBuffer );
iPos += iLength;
}

return iPos;
}
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2002-11-05 11:22
typedef struct _EthHead
{
EthAddr DestAddr;
EthAddr SourAddr;
unsigned short SrvType;

} EthHead, * PEthHead;  

typedef struct _IpHead
{
unsigned char HeaderLength_Version;
unsigned char TypeOfService; // Type of service
unsigned short TotalLength; // total length of the packet
unsigned short Identification; // unique identifier
unsigned short FragmentationFlags; // flags
unsigned char TTL; // Time To Live
unsigned char Protocol;           // protocol (TCP, UDP etc)
unsigned short CheckSum; // IP Header checksum
unsigned int sourceIPAddress; // Source address
unsigned int destIPAddress; // Destination Address

} IpHead, *PIpHead;


u_long GetSrcIpFromPacket( PNDIS_PACKET pPacket ) {
    PCHAR pData;
    UINT iTotal;
    PEthHead pEthHdr;
    PIpHead pIpHdr;
    
    NdisQueryPacket( pPacket, NULL, NULL, NULL, &iTotal );
    pData = ExAllocatePool( NonPagedPool, iTotal );
    CopyPacketData( pPacket, pData, iTotal );
    
    pEthHdr = ( PEthHead )pData;
    pIpHdr = ( PIpHead )( pData + sizeof( EthHead ) );
    
    return pIpHdr->sourceIPAddress;
    
}
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地下室#
发布于:2002-11-05 11:23
同理,你要取目标地址也一样,注意判断这个包是否是IP包,注意边界检查。
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-05 11:28
拷贝一段程序给你吧,把Packet里面的数据Dump出来:
UINT
CopyPacketData(
PNDIS_PACKET pPacket,
PCHAR pData,
UINT iSize
)
{
UINT iLength;
UINT iPos;
PNDIS_BUFFER pNextBuffer;
PCHAR pBuffer;

iPos = 0;
NdisQueryPacket( pPacket, NULL, NULL, &pNextBuffer, &iLength );
if( iLength > iSize ) return iPos;
while( pNextBuffer ) {
NdisQueryBuffer( pNextBuffer, &pBuffer, &iLength );
if( iLength > iSize - iPos || !pBuffer ) break;
NdisMoveMemory( pData + iPos, pBuffer, iLength );
NdisGetNextBuffer( pNextBuffer, &pNextBuffer );
iPos += iLength;
}

return iPos;
}
 

谢谢版主,我是个新手,还有些不明白,
pData,iSize这两个参数应具体传递那个值??

fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
6楼#
发布于:2002-11-05 12:51
在GetSrcIpFromPacket这个函数里面已经给你演示了阿。
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-05 14:54
在GetSrcIpFromPacket这个函数里面已经给你演示了阿。

[br]
我明白了,多谢!
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-05 17:15
在GetSrcIpFromPacket这个函数里面已经给你演示了阿。

多谢.
我编译了一下,下面的两个结构找不到,它们应该包含在那个头文件
EthAddr ,EthAddr
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-05 17:17
请关注!!!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
10楼#
发布于:2002-11-05 19:22
哦,Sorry,还有个定义没有给你。
typedef struct _EthAddr
{
unsigned char AddrByte[6];

}EthAddr, * PEthAddr;
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-05 19:28
哦,Sorry,还有个定义没有给你。
typedef struct _EthAddr
{
unsigned char AddrByte[6];

}EthAddr, * PEthAddr;
 


多谢!多谢!
但 ExAllocatePool(NonPagedPool, iTotal)
函数编译不通过!!没定义!!
怎么办?


[编辑 -  11/5/02 by  bhjinhou]

[编辑 -  11/5/02 by  bhjinhou]
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-05 19:51
在线等候........
yiduz
驱动小牛
驱动小牛
  • 注册日期2001-04-28
  • 最后登录2003-10-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-16 11:28
编译时有没有加入
-DNDIS_WDM=1
的选项呢?
sources文件里加。
ydzhang
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
14楼#
发布于:2002-11-16 18:37
好象是你已经搞定了吧?
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-17 08:59
多谢各位了!!
偶已经搞定了
wangsj47
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2012-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-05-09 09:52
to:bhjinhou
你这个程序的源代码还在吗?我想能不能发给我看看,我刚学,无从下手啊,请帮帮我,好吗?

wangsj47@sina.com
~~~~~~~~~~~~~~~~~~~~~~~~~~~ 初来乍道,一头雾水~~~~ E-Mail:wangsj47@sina.com
raul.wang
驱动小牛
驱动小牛
  • 注册日期2002-07-30
  • 最后登录2004-11-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-05-22 15:12
发给我吧。wzxyilove@163.net
同饮一壶酒
游客

返回顶部