阅读:2165回复:16
请问ndis hook中如何实现自己构造包给上层
用ndis hook(注册假协议的方式)如何在ProtocolReceive中自己构造一个包提交给上层?我是用gjpland大侠的框架
|
|
|
沙发#
发布于:2004-04-15 22:09
还没听明白你的意思。。 你是不处理包就向上传,还是修改包才向上传 ;)
|
|
|
板凳#
发布于:2004-04-16 08:42
还没听明白你的意思。。 你是不处理包就向上传,还是修改包才向上传 ;) 我是想自己构造一个包(可以理解为修改)再向上传,另外我还想在ProtocolReceive中用ndissend对外发出一个我构造的包,不知道能不能实现?怎么实现? |
|
|
地板#
发布于:2004-04-18 17:58
可以实现。。
|
|
|
地下室#
发布于:2004-04-18 18:18
[quote]还没听明白你的意思。。 你是不处理包就向上传,还是修改包才向上传 ;) 我是想自己构造一个包(可以理解为修改)再向上传,另外我还想在ProtocolReceive中用ndissend对外发出一个我构造的包,不知道能不能实现?怎么实现? [/quote] 啊哦,你的答复好简单哦,怎么做啊,偶都蓝了n多回屏了 |
|
|
5楼#
发布于:2004-04-18 18:34
你调用NdisSend发包。。 ;)
|
|
|
6楼#
发布于:2004-04-18 19:40
你调用NdisSend发包。。 ;) 偶这几天碰到的问题太多,ProtocolReceive中用NdisMIndicateReceivePacket提交包总是蓝屏(是不是gjp的框架里不能用NdisMIndicateReceivePacket提交上层),计算tcp的校验和也不对(计算ip的没问题,可是计算tcp的就是不对),真实郁闷死了..... :( :mad: |
|
|
7楼#
发布于:2004-04-18 21:20
是你代码有问题吧。贴出来看看。你老这么点点说。谁能明白呀
|
|
|
8楼#
发布于:2004-04-18 21:56
是你代码有问题吧。贴出来看看。你老这么点点说。谁能明白呀 INT HookProtocolReceivePacket( IN HOOK_CONTEXT_STRUCT *pOurContext, IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet ) { NTSTATUS status = NDIS_STATUS_SUCCESS; PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET MyPacket; if(!pAdapt->MiniportHandle) { DbgPrint(\"pAdapt->MiniportHandle Faild! \\n\"); } if( pOurContext ) { CheckSendHandle(pOurContext); NdisDprAllocatePacket(&status, &MyPacket, m_ourPacketPoolHandle); if(status == NDIS_STATUS_SUCCESS) { MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; // // Get the original packet(it could be the same packet as one received or a different one // based on # of layered MPs) and set it on the indicated packet so the OOB stuff is visible // correctly at the top. // NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet)); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, NDIS_GET_PACKET_HEADER_SIZE(Packet)); // // Set Packet Flags // NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); // // Make sure the status is set to NDIS_STATUS_RESOURCES. // NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); //执行到这里蓝屏 //ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES); NdisDprFreePacket(MyPacket); //return status; } if( HookFilterPacket(pOurContext,Packet,FALSE) ) { status = ((RECEIVE_PACKET_HANDLER)pOurContext->m_pOriginalProc)( ProtocolBindingContext, Packet); } else status = NDIS_STATUS_NOT_ACCEPTED; } return status; } btw,计算tcp校验和已经搞定了... |
|
|
9楼#
发布于:2004-04-18 22:02
你检察MiniportHandle。%90是他错误。
|
|
|
10楼#
发布于:2004-04-18 22:35
你检察MiniportHandle。%90是他错误。 能不能具体一点呢,我也怀疑过MiniportHandle的问题,可是又觉得不是,ProtocolBindingContext肯定没问题的啊,怎么才能判断MiniportHandle有没有问题呢? |
|
|
11楼#
发布于:2004-04-19 12:50
直接就把PASSTHRU的代码搬过来了!
PADAPT pAdapt =(PADAPT)ProtocolBindingContext; IMD才能这样用,HOOK不行。 在PASSTHRU中ProtocolBindingContext是你初始化过的东西,HOOK中你没有机会初始化。也就是说pAdapt->MiniportHandle是空或别的地址。 |
|
12楼#
发布于:2004-04-19 13:20
PASSTHRU 在初始化时候把句丙保存到pAdapt->MiniportHandle
所以用ProtocolBindingContext可以得到这个句丙。 HOOK 没有把句丙放到pAdapt->MiniportHandle 你使用pAdapt->MiniportHandle会产生叶故障。 因此pAdapt->MiniportHandle 应该等于NULL 或无效地址! 你在HOOK中定义个全局变量 获得MiniportHandle句丙 保存这个句丙到全局变量中就可以用了 ;) |
|
|
13楼#
发布于:2004-04-19 13:21
你这家伙抄东西也太厉害了吧。什么都抄。都没经过大脑 ;)
|
|
|
14楼#
发布于:2004-04-19 14:00
说话别那么难听
|
|
15楼#
发布于:2004-04-19 14:31
多谢两位啦,偶检讨hoho,放分 :P
|
|
|
16楼#
发布于:2004-04-19 21:30
哎,偶发觉偶还是得不到MiniportHandle,怎么办啊,我看到在HOOK_CONTEXT_STRUCT里有个m_pBindAdaptHandle,请问我下面这样做对不对
PNDIS_OPEN_BLOCK pNdisOpenBlock; pNdisOpenBlock = (PNDIS_OPEN_BLOCK)pOurContext->m_pBindAdaptHandle; MiniportHandle是不是就是((PADAPT)pNdisOpenBlock->ProtocolBindingContext)->MiniportHandle? |
|
|