阅读:1636回复:15
zhaock等高手, 帮我看看这里有错误吗?
//备份数据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,帮助我看看函数和流程对吗?启动时蓝屏重新启动/谢谢了! |
|
|
沙发#
发布于:2005-06-13 13:07
那还是从具体分析哪一个包,在哪一个协议上出错开始吧
|
|
板凳#
发布于:2005-06-13 11:47
大家说说原因可能出在哪里呢?
|
|
|
地板#
发布于: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数据时,不对数据加解密,网络通信正常. 问什么会这样?帮帮忙,分析个原因! |
|
|
地下室#
发布于:2005-06-10 15:45
你现在解决了什么问题,还有什么问题,再总结一下,又不知道你要问什么了?我看了看,hook没有什么问题。
|
|
5楼#
发布于: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)网卡,修改任何数据通信都正常. 为什么会这样呢? |
|
|
6楼#
发布于:2005-06-10 13:03
这样做,对于多网卡有问题。你hook的时候,直接替换DIS_OPEN_BLOCK的函数指针,就不会出现你现在的问题,你是如何
hook的,可以把hook的代码,贴出来,看看 |
|
7楼#
发布于:2005-06-10 12:10
是的一个协议绑定两个网卡或者多个网卡.
现在还不知道如果在一个网卡中改变了发送数据,是否会影响到其他网卡的数据.理论上不会的. |
|
|
8楼#
发布于:2005-06-10 12:05
这样的: 你现在的做法是不是,一个协议绑定两块网卡,就会每个网卡都发送一次呢? |
|
9楼#
发布于: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函数呢?能否说一说? |
|
|
10楼#
发布于:2005-06-10 11:07
我没有太细看你的代码,可能理解有误,你的while(pOpenBlock != NULL)对于两块网卡的情况,是不是要循环两次而导致发送两次呢?
|
|
11楼#
发布于: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] |
|
|
12楼#
发布于:2005-06-10 09:38
你hook的方法可能存在问题,你根据ProtocolBlock来hook,如果多网卡,自然就无法区分哪个网卡了,而你的处理是每块网卡都发送一次,显然是不对的,ip层路由的时候,已经确定了哪块网卡。
|
|
13楼#
发布于:2005-06-10 09:06
感觉该hook有些不妥,修改修改!
[编辑 - 6/10/05 by cyliu] |
|
|
14楼#
发布于: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] |
|
|
15楼#
发布于:2005-06-09 20:58
我没有用过NdisCopyFromPacketToPacket,但你这样用肯定不对
Destination Packet先要自己分配好,你先把这个改正过来, |
|