cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
阅读:1634回复:15

zhaock等高手, 帮我看看这里有错误吗?

楼主#
更多 发布于:2005-06-09 19:15
//备份数据packet
NDIS_STATUS
XF_Packet2Packet(
IN PNDIS_PACKET Packet,
OUT PNDIS_PACKET* pMyPacket
)
{
NDIS_STATUS status = NDIS_STATUS_NOT_COPIED;
PNDIS_PACKET myPacket = *pMyPacket;

PNDIS_BUFFER    FirstBuffer;
    PVOID           FirstBufferVA;
UINT            FirstBufferLength;
    UINT            TotalBufferLength;
UINT            BytesCopied;


          //得到数据包长度
NdisGetFirstBufferFromPacket(
Packet,
&FirstBuffer,
&FirstBufferVA,
&FirstBufferLength,
&TotalBufferLength
);

           //Copy数据
NdisCopyFromPacketToPacket(
myPacket,
            0,
            TotalBufferLength,
            Packet,
            0,
            &BytesCopied
);

if(BytesCopied == TotalBufferLength)
{
                     //copy oob 数据
NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(myPacket),
NDIS_OOB_DATA_FROM_PACKET(Packet),
sizeof(NDIS_PACKET_OOB_DATA));
status = NDIS_STATUS_SUCCESS;
}

return status;
}

//发送
NDIS_STATUS NDIS_API
XF_TcpipSendHandler(
IN  PTCPIP_FUNCTION_MAP FunctionMap,
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_PACKET Packet
)
{
NDIS_STATUS status;
PNDIS_PACKET myPacket;

dprintf((\"XF_TcpipSendHandler\\n\"));

           //拷贝数据
status = XF_Packet2Packet(Packet,&myPacket);
FunctionMap -> old_Packet = Packet;//备份旧数据包

           //发送数据
status = FunctionMap -> old_SendHandler(MacBindingHandle, myPacket);

if(status != NDIS_STATUS_PENDING)
{
                //释放空间
NdisIMCopySendCompletePerPacketInfo(Packet,myPacket);
NdisFreePacket(myPacket);
}

return (status);
}

VOID NDIS_API
XF_TcpipSendPacketsHandler(
IN PTCPIP_FUNCTION_MAP FunctionMap,
IN NDIS_HANDLE NdisBindingHandle,
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets
)
{
UINT i = 0;
PPNDIS_PACKET myPacketArray = NULL;;

dprintf((\"XF_TcpipSendPacketsHandler\\n\"));

myPacketArray = (PPNDIS_PACKET)malloc_np(sizeof(PPNDIS_PACKET) * NumberOfPackets);

for(i = 0; i < NumberOfPackets; i++)
{
                     //拷贝数据
XF_Packet2Packet(PacketArray,&myPacketArray);

}
          //发送数据
FunctionMap -> old_SendPacketsHandler(NdisBindingHandle, myPacketArray, NumberOfPackets);

for(i = 0; i < NumberOfPackets; i++)
{
                    //释放空间
NdisFreePacket(myPacketArray);
}
free(myPacketArray);
}

VOID NDIS_API
XF_TcpipSendCompleteHandler(
IN PTCPIP_FUNCTION_MAP FunctionMap,
    IN NDIS_HANDLE ProtocolBindingContext,
    IN PNDIS_PACKET Packet,
    IN NDIS_STATUS Status
)
{
          //释放空间
PNDIS_PACKET   Pkt = FunctionMap -> old_Packet;
NdisIMCopySendCompletePerPacketInfo(Pkt,Packet);
NdisDprFreePacket(Packet);

FunctionMap -> old_SendCompleteHandler(ProtocolBindingContext,Pkt,Status);
}

zhaock,帮助我看看函数和流程对吗?启动时蓝屏重新启动/谢谢了!
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-09 20:58
我没有用过NdisCopyFromPacketToPacket,但你这样用肯定不对
Destination Packet先要自己分配好,你先把这个改正过来,
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
板凳#
发布于:2005-06-10 08:56
忽略了.

zhaock:

我在装有双网卡的机器上,发送函数调用了两次:

//第一次调用
XF_TcpipSendHandler
00000819 7.84666826    Id: 109

//why? 第二次调用
00000828 7.84669622 XF_TcpipSendHandler
00000840 7.84673729    Id: 109

数据id都是109,说明是同一数据.

[编辑 -  6/10/05 by  cyliu]

[编辑 -  6/10/05 by  cyliu]
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地板#
发布于:2005-06-10 09:06
感觉该hook有些不妥,修改修改!



[编辑 -  6/10/05 by  cyliu]
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-06-10 09:38
你hook的方法可能存在问题,你根据ProtocolBlock来hook,如果多网卡,自然就无法区分哪个网卡了,而你的处理是每块网卡都发送一次,显然是不对的,ip层路由的时候,已经确定了哪块网卡。

cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
5楼#
发布于:2005-06-10 10:50
是根据ProtocolBlock来hook的.这里的ProtocolBlock仅是Tcpip协议的.同时协议中的一个NDIS_OPEN_BLOCK对应一个网卡,两个网卡就含有两个NDIS_OPEN_BLOCK.

区分网卡是由tcpip.sys来做的,就是你说的ip层路由的时候,已经确定了哪块网卡,那么就应该调用tcpip协议中相应NDIS_OPEN_BLOCK内部函数.

为何说\"如果多网卡,自然就无法区分哪个网卡了,而你的处理是每块网卡都发送一次\"?

[编辑 -  6/10/05 by  cyliu]
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-06-10 11:07
我没有太细看你的代码,可能理解有误,你的while(pOpenBlock != NULL)对于两块网卡的情况,是不是要循环两次而导致发送两次呢?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
7楼#
发布于:2005-06-10 11:23
这样的:

每个协议(如TCPIP)维护一个NDIS_OPEN_BLOCK链表,每一个NDIS_OPEN_BLOCK对应一个网卡的MINIPORT.

在发送数据时候,TCPIP协议根据网络地址选择网卡相对应的NDIS_OPEN_BLOCK中的发送函数,以便正确发送数据到网卡.

while(pOpenBlock != NULL)是HOOK每个网卡对应的NDIS_OPEN_BLOCK中的函数,以便对所有网卡数据都进行处理.

你有好的HOOK办法吗,以便区分不同的网卡发送函数呢?你是如何做HOOK函数呢?能否说一说?
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-06-10 12:05
这样的:

每个协议(如TCPIP)维护一个NDIS_OPEN_BLOCK链表,每一个NDIS_OPEN_BLOCK对应一个网卡的MINIPORT.

在发送数据时候,TCPIP协议根据网络地址选择网卡相对应的NDIS_OPEN_BLOCK中的发送函数,以便正确发送数据到网卡.

while(pOpenBlock != NULL)是HOOK每个网卡对应的NDIS_OPEN_BLOCK中的函数,以便对所有网卡数据都进行处理.

你有好的HOOK办法吗,以便区分不同的网卡发送函数呢?你是如何做HOOK函数呢?能否说一说?  

你现在的做法是不是,一个协议绑定两块网卡,就会每个网卡都发送一次呢?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
9楼#
发布于:2005-06-10 12:10
是的一个协议绑定两个网卡或者多个网卡.

现在还不知道如果在一个网卡中改变了发送数据,是否会影响到其他网卡的数据.理论上不会的.
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2005-06-10 13:03
这样做,对于多网卡有问题。你hook的时候,直接替换DIS_OPEN_BLOCK的函数指针,就不会出现你现在的问题,你是如何
hook的,可以把hook的代码,贴出来,看看
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
11楼#
发布于:2005-06-10 15:08
就是替换NDIS_OPEN_BLOCKL里面的函数啊
VOID NDIS_API
XF_HookTcpipFunction(
IN NDIS_HANDLE ProtocolBlock
)
{
dprintf((\"XF_HookTcpipFunction\\n\"));

if(ProtocolBlock != NULL)
{
PNDIS_PROTOCOL_BLOCK pProtocol = NULL;
PNDIS_OPEN_BLOCK pOpenBlock = NULL;
PTCPIP_FUNCTION_MAP functionMap = NULL;

pProtocol = (PNDIS_PROTOCOL_BLOCK)ProtocolBlock;
pOpenBlock = pProtocol->OpenQueue;

while(pOpenBlock != NULL)
{
functionMap = XF_IsHookOpenBlock(pOpenBlock);
if(functionMap != NULL)
{
pOpenBlock = pOpenBlock -> ProtocolNextOpen;
continue;
}

functionMap = (PTCPIP_FUNCTION_MAP)malloc_np(sizeof(TCPIP_FUNCTION_MAP));
if(functionMap == NULL)
KeBugCheckEx(DRIVER_NOPAGE_MEMORY_ALLOCATE_ERROR,
NDISEX_NTHOOK_MODULE,NDISEX_NTHOOK_FUNCTION,0x00000000,0x00000002);

memset(functionMap, 0, sizeof(TCPIP_FUNCTION_MAP));
functionMap -> next = m_pTcpipMapHeader;
m_pTcpipMapHeader =  functionMap;

//替换SendHandler
functionMap -> old_SendHandler = pOpenBlock->SendHandler;
GENERATE_ASM_TCPIP_STUB(functionMap,SendHandler);
            pOpenBlock->SendHandler = (SEND_HANDLER)functionMap -> asm_SendHandler;

//替换SendPacketsHandler
functionMap -> old_SendPacketsHandler = pOpenBlock->SendPacketsHandler;
GENERATE_ASM_TCPIP_STUB(functionMap,SendPacketsHandler);
            pOpenBlock->SendPacketsHandler = (SEND_PACKETS_HANDLER)functionMap -> asm_SendPacketsHandler;

functionMap -> hook_Openblock = pOpenBlock;

pOpenBlock = pOpenBlock -> ProtocolNextOpen;
}
}
}

气死我了,现在问题又跑回去了。

对Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller 华硕主板集成网卡和Realtek RTL8139 Family PCI Fast Ethernet NIC集成网卡之间通信时,只有修改tcp数据tcp通信就会失败!而udp等通信都正常。

具体是这样:
我仅修改了ip包有效载荷数据.如果是TCP数据,通信就失败,其他格式数据通信都没有问题.
在同一台计算机上把Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller 华硕主板集成网卡改为D-Link DFE-530TX PCI Fast Ethernet Adapter (rev.C)网卡,修改任何数据通信都正常.

为什么会这样呢?
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2005-06-10 15:45
你现在解决了什么问题,还有什么问题,再总结一下,又不知道你要问什么了?我看了看,hook没有什么问题。
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
13楼#
发布于:2005-06-10 15:58
问题描述
1, 安装Realtek RTL8139 Family PCI Fast Ethernet NIC集成网卡,操作系统为分别Win2K,WinXP,Win2003的九种组合网络通信完全正常。
2, 一台计算机安装Realtek RTL8139 Family PCI Fast Ethernet NIC集成网卡,另一台计算机安装了D-Link DFE-530TX PCI Fast Ethernet Adapter (rev.C)网卡,操作系统为分别Win2K,WinXP,Win2003的九种组合网络通信完全正常。
3, 一台笔记本计算机安装了Intel(R) PRO/100+ MiniPCI集成网卡,另一台计算机安装了Realtek RTL8139 Family PCI Fast Ethernet NIC集成网卡,操作系统为分别Win2K 《=》WinXP网络通信完全正常。
4, 一台计算机安装Realtek RTL8139 Family PCI Fast Ethernet NIC集成网卡,另一台计算机安装了Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller 华硕主板集成网卡,网络通信完全不正常。(Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller 华硕主板集成网卡与D-Link DFE-530TX PCI Fast Ethernet Adapter (rev.C)网卡安装在同一台计算机中)

对Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller 华硕主板集成网卡网络通信不正常描述:
1 如果ip有效载荷数据是icmp,udp数据时,数据加解密,网络通信正常
2 如果ip 有效载荷数据是tcp数据时,数据加解密,网络通信不正常。无论修改tcp任意位置的数据网络通信都不正常。
3 如果ip有效载荷数据是tcp数据时,加密前的数据与解密后的数据完全一样.
4 如果ip有效载荷数据是tcp数据时,不对数据加解密,网络通信正常.

问什么会这样?帮帮忙,分析个原因!
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
14楼#
发布于:2005-06-13 11:47
大家说说原因可能出在哪里呢?
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2005-06-13 13:07
那还是从具体分析哪一个包,在哪一个协议上出错开始吧
游客

返回顶部