WinDivert学习文档之五-————编程API(七)
5.7 WinDivertSend
BOOL WinDivertSend(__in HANDLE handle,__in const VOID *pPacket,__in UINT packetLen,__out_opt UINT *pSendLen,__in const WINDIVERT_ADDRESS *pAddr ); |
参数
一个由WinDivertOpen()创建的有效的WinDivert句柄。
- handle:包含要注入的包的缓冲区。
- packetLen:包缓冲区的总长度。
- pSendLen:注入的总字节数。如果不需要此信息,则可以为NULL。
- pAddr:注入报文的地址。
返回值
如果数据包注入成功,则为TRUE;如果发生错误,则为FALSE。使用GetLastError()获取错误的原因。
常见错误包括:
Name名称 | Code编码 | Description说明 |
---|---|---|
ERROR_HOST_UNREACHABLE | 1232 | This error occurs when an impostor packet (with the 当注入一个冒名顶替数据包(pAddr-> impostor设置为1)并且ip地址为0时,会发生此错误。TTL或ipv6。hopllimit字段趋近于0。这是最后的防御手段,防止由冒充包引起的无限循环。 |
说明:
将数据包注入网络堆栈。注入的数据包可以是从WinDivertRecv()接收到的数据包,也可以是修改后的版本,或者是一个全新的数据包。注入的数据包可以被其他优先级较低的WinDivert句柄捕获并再次转移。
只有WINDIVERT_LAYER_NETWORK和WINDIVERT_LAYER_NETWORK_FORWARD层支持数据包注入,如下所述:
Layer层 | Inject?注入? |
---|---|
WINDIVERT_LAYER_NETWORK | ✔ |
WINDIVERT_LAYER_NETWORK_FORWARD | ✔ |
WINDIVERT_LAYER_FLOW | |
WINDIVERT_LAYER_SOCKET | |
WINDIVERT_LAYER_REFLECT |
对于WINDIVERT_LAYER_NETWORK层,pAddr->出站值决定了数据包注入的方向。如果pAddr->Outbound字段为1,则数据包将被注入出站路径(即数据包离开本地机器)。否则,如果pAddr->Outbound为0,则数据包被注入入站路径(即到达本地机器的数据包)。注意,只有Outbound字段而不是注入报文中的IP地址决定报文的方向。
对于注入入路径的数据包,pAddr->网络。IfIdx和pAddr->网络。假定SubIfIdx字段包含有效的接口编号。这些可以从WinDivertRecv()(用于数据包修改)或IP Helper API中检索。
对于向外注入的报文,IfIdx和SubIfIdx字段当前被忽略,可能是任意值。在出站路径上注入入站数据包可能有效(对于某些类型的数据包),但是这应该被视为“未记录”的行为,并且可能在将来进行更改。
对于冒名顶替数据包(其中pAddr-> impostor设置为1),WinDivert将自动减少ip。TTL或ipv6。回注前的HopLimit字段。这是为了减轻无限循环,因为WinDivert不能防止冒名顶替的数据包再次被WinDivertRecv()捕获。
注入的数据包必须具有正确的校验和或未设置相应的pAddr->*校验和标志。WinDivertRecv()捕获的数据包/地址对保证满足此条件,因此可以不加修改地重新注入,而无需重新计算校验和。否则,如果需要修改,则可以使用windiverthelpercalcchecksum()函数重新计算校验和。