阅读:1896回复:8
购买HOOK方式修改数据报的代码(已经自行解决)
以下问题已经自行解决,此帖取消,至于2楼说的以下代码处处是BUG,我检查了一下,发现tempBuL = CurrentBufferLength;为错误,修改为tempBuL += CurrentBufferLength;其他问题没发现,现在完整代码已经自行解决并通过测试,确实HOOK NDIS.SYS的加密与解密与直接的IMD驱动方式不一样,其余部分代码恕不公布,谢谢各位.
查了不少修改数据报的资料, 都是IMD的, 移植到HOOK NDIS方式总不断蓝屏, 即使看了本论坛里面对IMD修改数据报的解答也总是非常简单, 提问的人只希望得到别人的解答,解决了的人也不愿意提供分享 所以我决定放弃自己的盲目努力, 希望通过购买了获得学习的机会, 以下为详细要求, 以下为ndishook.c中的相关代码, 在未使用MyPacket前驱动正常运行 现在要求根据以下代码修改和补充(包括补充ndishook.h等文件中的增加部分), 将MPSendPacket(HookSendPacket)发送的Packet读入到pPacketContent(修改用), 重新构造成MyPacket, 将MyPacket发送 将PtReceivePacket(HookReceivePacket)接收的Packet读入到pPacketContent(修改用), 重新构造成MyPacket, 将MyPacket上指, 完成各类资源释放 将PtReceive(HookReceive)接收的数据读入到pPacketContent(修改用), 重新构造成MyPacket, 将MyPacket上指, 完成各类资源释放 NDIS_HANDLE m_hTcpipHandle = NULL; PNDIS_SEND m_pNdisSend = NULL; NDIS_REGISTER_PROTOCOL m_pNdisRegisterProtocol = NULL; RECEIVE_HANDLER m_pNdisReceive = NULL; NDIS_OPEN_ADAPTER m_pNdisOpenAdapter = NULL; OPEN_ADAPTER_COMPLETE_HANDLER m_pOpenAdapterComplete = NULL; TRANSFER_DATA_HANDLER m_pTransferDataHandler = NULL; NDIS_DEREGISTER_PROTOCOL m_pNdisDeregisterProtocol = NULL; BIND_HANDLER m_pBindAdapter = NULL; NDIS_HANDLE m_hTcpIpWanHandle = NULL; RECEIVE_PACKET_HANDLER m_pWanReceivePacket = NULL; SEND_PACKETS_HANDLER m_pWanSendPackets = NULL; OPEN_ADAPTER_COMPLETE_HANDLER m_pWanOpenAdapterComplete = NULL; SEND_HANDLER m_pSendHandler = NULL; RECEIVE_PACKET_HANDLER m_pReceivePacket = NULL; NDIS_STATUS NDIS_API HookReceive( IN NDIS_HANDLE NdisBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize ) { NDIS_STATUS status; // 补充代码, 构造新MyPacket, 将MyPacket发送 return NDIS_STATUS_SUCCESS; } VOID HookLocalSend() { if(m_hTcpipHandle == NULL) return; HookSendFunction(m_hTcpipHandle, HookSendPacket, (PVOID*)&m_pSendHandler, HOOK_SEND); HookTransferDataFunction(m_hTcpipHandle,HookTransferData,(PVOID*)&m_pTransferDataHandler); } NDIS_STATUS NDIS_API HookSendPacket( IN NDIS_HANDLE MacBindingHandle, IN PNDIS_PACKET Packet ) { PNDIS_PACKET MyPacket = NULL; PNDIS_BUFFER MyBuffer = NULL; PUCHAR pPacketContent = NULL; PRECV_RSVD RecvRsvd; PUCHAR pBuf; UINT BufLength; ULONG PacketLength = 0; ULONG BufferCount = 0; PNDIS_BUFFER CurrentBuffer; ULONG tempBuL = 0; ULONG CurrentBufferLength; PVOID CurrentBufferVA = NULL; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; NdisQueryPacket(Packet,NULL,&BufferCount,&CurrentBuffer,&PacketLength); if(!BufferCount) return NDIS_STATUS_SUCCESS; // 分配缓冲区pPacketContent Status = NdisAllocateMemoryWithTag((PVOID *)&pPacketContent, PacketLength, 'maDN'); if (Status!=NDIS_STATUS_SUCCESS ) return NDIS_STATUS_SUCCESS; // 读取所有数据到pPacketContent NdisZeroMemory (pPacketContent, PacketLength); NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength); while(CurrentBuffer != NULL) { NdisMoveMemory(pPacketContent+tempBuL, CurrentBufferVA, CurrentBufferLength); tempBuL += CurrentBufferLength; NdisGetNextBuffer(CurrentBuffer, &CurrentBuffer); if(CurrentBuffer == NULL) break; NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength); } // 以下由pPacketContent组报由m_pSendHandler发送 .......................................... } INT NDIS_API HookReceivePacket( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet ) { PNDIS_PACKET MyPacket = NULL; PNDIS_BUFFER MyBuffer = NULL; PUCHAR pPacketContent = NULL; PRECV_RSVD RecvRsvd; PUCHAR pBuf; UINT BufLength; ULONG PacketLength = 0; ULONG BufferCount = 0; PNDIS_BUFFER CurrentBuffer; ULONG tempBuL = 0; ULONG CurrentBufferLength; PVOID CurrentBufferVA = NULL; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; NdisQueryPacket(Packet,NULL,&BufferCount,&CurrentBuffer,&PacketLength); if(!BufferCount) return NDIS_STATUS_SUCCESS; // 分配缓冲区pPacketContent Status = NdisAllocateMemoryWithTag((PVOID *)&pPacketContent, PacketLength, 'maDN'); if (Status!=NDIS_STATUS_SUCCESS ) return NDIS_STATUS_SUCCESS; // 读取所有数据到pPacketContent NdisZeroMemory (pPacketContent, PacketLength); NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength); while(CurrentBuffer != NULL) { NdisMoveMemory(pPacketContent+tempBuL, CurrentBufferVA, CurrentBufferLength); tempBuL += CurrentBufferLength; NdisGetNextBuffer(CurrentBuffer, &CurrentBuffer); if(CurrentBuffer == NULL) break; NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength); } // 以下由pPacketContent组报由m_pReceivePacket上指 .......................................... } VOID NDIS_API HookNdisRegisterProtocol( OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE NdisProtocolHandle, IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, IN UINT CharacteristicsLength ) { BOOLEAN bHookedTcp = FALSE; BOOLEAN bHookedWan = FALSE; UNICODE_STRING usTcpName = UNICODE_STRING_CONST("TCPIP"); UNICODE_STRING usTcpIpWanName = UNICODE_STRING_CONST("TCPIP_WANARP"); if(m_pNdisRegisterProtocol == NULL) return; // // 判断是否是TCP/IP协议 // if(usTcpName.Length == ProtocolCharacteristics->Name.Length && memcmp(ProtocolCharacteristics->Name.Buffer, usTcpName.Buffer, usTcpName.Length) == 0) { bHookedTcp = TRUE; m_pOpenAdapterComplete = ProtocolCharacteristics->OpenAdapterCompleteHandler; ProtocolCharacteristics->OpenAdapterCompleteHandler = HookOpenAdapterComplete; // if(ProtocolCharacteristics->MajorNdisVersion >= 3 && ProtocolCharacteristics->ReceiveHandler != NULL) { m_pNdisReceive = ProtocolCharacteristics->ReceiveHandler; ProtocolCharacteristics->ReceiveHandler = HookReceive; } if(ProtocolCharacteristics->MajorNdisVersion >= 4 && ProtocolCharacteristics->ReceivePacketHandler != NULL) { m_pReceivePacket = ProtocolCharacteristics->ReceivePacketHandler; ProtocolCharacteristics->ReceivePacketHandler = HookReceivePacket; } } // m_pNdisRegisterProtocol( Status, NdisProtocolHandle, ProtocolCharacteristics, CharacteristicsLength ); if(bHookedTcp) m_hTcpipHandle = *NdisProtocolHandle; } |
|
沙发#
发布于:2008-05-04 11:16
这代码处处都是bug,还不如某些公开的ndis hook代码。
建议还是从passthru中间层 |
|
板凳#
发布于:2008-05-04 15:50
引用第1楼zhanSL于2008-05-04 11:16发表的 : 谢谢回答, 能和我联系吗? QQ6886603 |
|
地板#
发布于:2008-05-10 13:53
想在这个论坛学点东西可真难, 我从第一页开始到50页,再从最后一页到第90页,差不多每个帖子都看了,真的没看到一个帖子是在帮提问的人真正解决问题的
虽然说没有义务帮助别人, 但作为一个技术论坛, 这样似乎很悲哀 我倒觉得不如解答问题采用明码标价来得痛快,如果提问者愿意,就当交学费学技术也比解决不;了问题强 哈哈! |
|
地下室#
发布于:2008-05-11 20:43
是这样的拉。这世道。呵呵
|
|
5楼#
发布于:2008-05-21 17:04
似乎没有必要如此悲观,
估计现在研究ndis hook的人很少了吧, 大概3,4年前研究这个的人很多,那个时候论坛上解答问题的人也很多。 高手靠的是不断学习和进步来拉开与别人的距离,而不是靠闭嘴。 |
|
6楼#
发布于:2008-05-22 07:55
同情楼主,呵呵!不过还是赞一个,我也是自己研究的,本想公布的,但是由于代码是给公司做的,出于职业道德不公布。
|
|
7楼#
发布于:2008-05-22 09:46
我有很完整很稳定的HOOK方法代码等..可以讨论下吗?
|
|
|
8楼#
发布于:2008-05-22 12:29
一直在linux模块游荡,好久没有到ndis模块来了。真的感觉现在论坛没有以前的热闹了。
ndis hook有两种方式:一种直接hook Ndis库, 一种添加伪协议。 我曾经做的是直接Hook ndis库,并用流算法加密。还算稳定。只是后来和卡巴的高版本有些冲突。 如果技术相同,有时间可以讨论问题。 研究问题真的很枯燥,当时我是从头到尾看遍了每个帖子阿,一个字累。 所以现在喜欢开源的。因为感觉开源的思想比较好,就是大家努力解决新的问题,新的技术,新的内容。 而不是像这样跟着ms屁股跑,都是研究些他的技术,可是他的技术已经有了,人家已经开始研究新的技术了,而我们刚开始研究它已有的技术,it怎么发展起来啊?在已有基础上不断hook,hook的,想想这样对创新技术感觉不到太大的意义,很没成就感。 唉,就在大家还对技术藏着掖着的时候,还是去开源吧。 |
|
|