Windows 在WFP的数据报\数据层重写数据包时出现蓝屏

Windows 在WFP的数据报\数据层重写数据包时出现蓝屏,windows,winapi,windows-firewall,wfp,Windows,Winapi,Windows Firewall,Wfp,我一直试图通过WFP中的DATAGRAM\u DATA层修改传出DNS数据包,但是在传出数据包中重写目标ip时,我遇到蓝屏错误。我做错了什么 我承认,我发现FwpsInjectTransportSendAsync的参数有点混乱,并且不确定sendParams arg的确切输入值-尽管我认为我的设置看起来是正确的 RTLIPV4StringToAddressXw( L“1.1.1.1”//现在对新的(重写的)dns服务器进行硬编码 假,, &sin4.sin_地址:, &sin4.sin_港);

我一直试图通过WFP中的
DATAGRAM\u DATA
层修改传出DNS数据包,但是在传出数据包中重写目标ip时,我遇到蓝屏错误。我做错了什么

我承认,我发现
FwpsInjectTransportSendAsync
的参数有点混乱,并且不确定sendParams arg的确切输入值-尽管我认为我的设置看起来是正确的

RTLIPV4StringToAddressXw(
L“1.1.1.1”//现在对新的(重写的)dns服务器进行硬编码
假,,
&sin4.sin_地址:,
&sin4.sin_港);
RTLIPV4StringToAddressXW(
L“8.8.8.8”,//现在对原始dns服务器进行硬编码
假,,
&原文4.sinu addr,
&原件4.sin_港);
if((Direction==FWP\u Direction\u OUTBOUND)&&(PacketInjectionState==FWPS\u PACKET\u NOT\u INJECTED)&&(RemotePort==53)&(RemoteAddress==origSin4.sin\u addr.S\u un.S\u addr))
{
UINT32 IpHeaderSize=inMetaValues->IpHeaderSize;
UINT32 TransportHeaderSize=inMetaValues->TransportHeaderSize;
UINT64 endpointHandle=inMetaValues->transportEndpointHandle;
PNET_BUFFER NetBuffer=NET_BUFFER_LIST_FIRST_NB((PNET_BUFFER_LIST)layerData);
NDISRETREATENetBufferDataStart(NetBuffer,IpHeaderSize+TransportHeaderSize,0,NULL);
PNET_BUFFER_LIST NetBufferList=NULL;
NTSTATUS Status=FwpsAllocateCloneNetBufferList(layerData、NULL、NULL、0和NetBufferList);
如果(!NT_成功(状态))
{
返回;
}
NdisAdvanceNetBufferDataStart(NetBuffer、iPhonederSize+TransportHeaderSize、FALSE、NULL);
如果(!NetBufferList)
{
返回;
}
NetBuffer=NET\u BUFFER\u LIST\u FIRST\u NB(NetBufferList);
PIPV4_头IpHeader=NdisGetDataBuffer(NetBuffer,sizeof(IPV4_头),NULL,1,0);
//重写dest ip
IpHeader->DestinationAddress=sin4.sin\u addr.S\u un.S\u addr;
//更新IP校验和
更新ipv4headerchecksum(IpHeader,sizeof(IPV4_头));
//无法100%确定sendParams参数设置是否正确,文档有点不清楚
FWPS_传输_发送_参数sendParams={
.remoteAddress=(UCHAR*)IpHeader->DestinationAddress,
.remoteScopeId=inMetaValues->remoteScopeId,
.controlData=inMetaValues->controlData,
.controlDataLength=inMetaValues->controlDataLength,
.headerIncludeHeader=inMetaValues->headerIncludeHeader,
.headerIncludeHeaderLength=inMetaValues->headerIncludeHeaderLength
};
Status=FwpsInjectTransportSendAsync(g_InjectionHandle,NULL,endpointHandle,0,&sendParams,AF_INET,inMetaValues->隔间ID,NetBufferList,DriverDatagramDataInjectComplete,NULL);
如果(!NT_成功(状态))
{
FwpsFreeCloneNetBufferList(NetBufferList,0);
}
classifyOut->actionType=FWP\U动作块;
classifyOut->rights&=~FWPS\u RIGHT\u ACTION\u WRITE;
classifyOut->flags |=FWPS_CLASSIFY_OUT_FLAG_Absort;
}

两件事对我来说很突出,都在
sendParams

首先,
remoteAddress
不正确。它需要指向地址的指针,因此它应该是
(UCHAR*)&IpHeader->DestinationAddress


其次,
FwpsInjectTransportSendAsync()
是异步的,因此传递给它的任何参数都需要保持有效,直到它完成为止,这可能是在调用函数返回之后。通常,您会分配一些上下文结构,其中包含
sendParams
和相关成员的深度副本(
remoteAddress
controlData
)。您可以将其作为上下文传递给完成例程,在该例程中释放它。

首先需要做的是-look memory.dmp。什么是错误代码,在哪里,调用堆栈。可能您只是在代码中查看导致错误的指令。在任意上下文中可能存在(例如池(堆)损坏)错误。bug是否稳定且可重复(总是在同一个地方)或在随机的地点/时间。这需要讨论,但不仅仅是蓝色screen@RbMm哦,这是如此简单/小的代码,我认为这个问题对于有WFP经验的人来说可能是显而易见的。如何查找和查看memory.dmp?不,它总是有用的,并且使任务更简单。另外-在系统重新启动之前-位于pagefile.sys内的转储-如果您在虚拟机上发生崩溃-您只需在崩溃后和重新启动之前在windbg内打开pagefile.sys即可。谢谢,这是非常好的信息。出于兴趣,哪些层支持数据流?我试图在CONNECT_重定向层中关联一个流上下文,并在DATAGRAM_数据层中访问它,但在CONNECT_重定向层中似乎无法获得流句柄……CONNECT_重定向的问题是,它在创建流之前被调用。您必须将您的上下文与AUTH_CONNECT或AUTH_flow_中建立的流相关联。非常感谢!请问你是怎么知道这些的?我在文档中根本找不到这些信息,您是否有其他可以链接到的资源?文档、示例代码、论坛帖子和经验的组合。很多东西实际上都在文档中,但不是组织得不好就是不够明确。不,我是全职员工,在过去一年左右的时间里才开始从事WFP司机的工作。如果我知道答案,我可以回答任何这样的问题。