Добрый день, у меня таже проблема.
Суть такова tcp траффик перенаправляется на 127.0.0.1:7879
— Syn к серверу доходит нормально
— сервер отправляет syn-ack он детектится у меня на уровне INBOUND_TARNSPORT_DISCARD c discard reason InetDiscardEndpointNotFound
— дальше я этот пакет опять инжектирую, изменив srcIp:srcPort на remoteIp:remotePort при outbound , и destIp:destPort соотв на localIp:loaclPort при outbound т.е. на оригинальные
Далее этот просто пропадает.
Никаких ошибок FwpsConstructIpHeaderForTransportPacket0, FwpsInjectTransportReceiveAsync0 а также netBufferList->Status в completionFn не выдает.
Код:
NTSTATUS WfpRedirectCloneModifyReinjectInBound(PPACKET_INJECT_DATA pd)
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
NET_BUFFER_LIST *clonedNetBufferList = NULL;
NET_BUFFER *netBuffer = NULL;
TCP_HEADER *tcpHeader = NULL;
ULONG nblOffset;
UINT32 remoteIpSw, localIpSw;
CHAR layerIdStr[20];
if(pd->layerId == FWPS_LAYER_INBOUND_TRANSPORT_V4){
RtlCopyMemory(layerIdStr, "TRANSPORT_IN ",4);
} else {
RtlCopyMemory(layerIdStr, "TRANSPORT_IN_DISCARD",4);
}
debugp("REINJECT %s: 0x%X:0x%X -> 0x%X:0x%X ",layerIdStr, pd->context->localIp, pd->context->localPort,
pd->context->remoteIp, pd->context->remotePort);
netBuffer = NET_BUFFER_LIST_FIRST_NB(pd->netBufferList);
nblOffset = NET_BUFFER_DATA_OFFSET(netBuffer);
if (nblOffset != pd->nblOffset)
{
ASSERT(pd->nblOffset - nblOffset == pd->transportHeaderSize);
pd->transportHeaderSize = 0;
}
//
// Adjust the net buffer list offset to the start of the IP header.
//
status = NdisRetreatNetBufferDataStart(
netBuffer,
pd->ipHeaderSize + pd->transportHeaderSize,
0,
NULL
);
dcheck(status);
//
// Note that the clone will inherit the original net buffer list's offset.
//
status = FwpsAllocateCloneNetBufferList0(
pd->netBufferList,
NULL,
NULL,
0,
&clonedNetBufferList
);
//
// Undo the adjustment on the original net buffer list.
//
NdisAdvanceNetBufferDataStart(
netBuffer,
pd->ipHeaderSize + pd->transportHeaderSize,
FALSE,
NULL
);
if (!NT_SUCCESS(status))
{
goto Exit;
}
netBuffer = NET_BUFFER_LIST_FIRST_NB(clonedNetBufferList);
//
// Advance to the beginning of the transport header (i.e. TCP header). бля!
//
NdisAdvanceNetBufferDataStart(
netBuffer,
pd->ipHeaderSize,
FALSE,
NULL
);
//
// Changing remote port
//
tcpHeader = NdisGetDataBuffer(
netBuffer,
sizeof(TCP_HEADER),
NULL,
sizeof(UINT16),
0
);
ASSERT(tcpHeader != NULL);
// TODO sync context using
tcpHeader->destPort = RtlUshortByteSwap(pd->context->remotePort);
// This is our new source port -- or
// the destination port of the original
// outbound traffic.
tcpHeader->sourcePort = RtlUshortByteSwap(pd->context->localPort);
// This is our new dest port -- or
// the source port of the original
// outbound traffic.
tcpHeader->checkSum = 0;
//
// Undo the advance. Net buffer list needs to be positioned at the
// beginning of IP header for address modification and/or receive-
// injection.
//
NdisRetreatNetBufferDataStart(
netBuffer,
pd->ipHeaderSize,
0,
NULL
);
//
// Changing remote ip
//
// TODO sync context using
#if (NTDDI_VERSION >= NTDDI_WIN6SP1)
remoteIpSw = RtlUlongByteSwap(pd->context->remoteIp);
localIpSw = RtlUlongByteSwap(pd->context->localIp);
debugp("REDIR: 0x%X:0x%X <- 0x%X:0x%X FL: 0x%X ",localIpSw, tcpHeader->sourcePort, remoteIpSw, tcpHeader->destPort, tcpHeader->flags);
debugp("II: %i,%i\n",pd->interfaceIndex, pd->subInterfaceIndex);
status = FwpsConstructIpHeaderForTransportPacket0(
clonedNetBufferList,
pd->ipHeaderSize,
AF_INET,
(UINT8*)&remoteIpSw,
// This is our new source address --
// or the destination address of the
// original outbound traffic.
(UINT8*)&localIpSw,
// This is the destination address of
// the clone -- or the source of the
// original outbound traffic.
pd->context->protocol,
0,
NULL,
0,
0,
NULL,
0,
0
);
#else
ASSERT(FALSE); // prior to Vista SP1, IP address needs to be modified
// manually (including updating IP checksum).
status = STATUS_NOT_IMPLEMENTED;
#endif
dcheck(status);
if (!NT_SUCCESS(status))
{
goto Exit;
}
status = FwpsInjectTransportReceiveAsync0(
gInjectionHandle,
NULL,
NULL,
0,
AF_INET,
pd->compartmentId,
pd->interfaceIndex,
pd->subInterfaceIndex,
clonedNetBufferList,
WfpInjectComplete,
pd
);
dcheck(status);
if (!NT_SUCCESS(status))
{
goto Exit;
}
//
// ownership transferred to the completion function.
//
clonedNetBufferList = NULL;
Exit:
debugp("\n");
if (clonedNetBufferList != NULL)
{
FwpsFreeCloneNetBufferList0(clonedNetBufferList, 0);
}
return status;
}
Лог:
ALE_AUTH: 0xC0A80175:0x411 -> 0x4A7D5768:0x50 3508 Protocol : 6 CTX ins 0x9BE32260
TRANSPORT_OUT 0xC0A80175:0x411 -> 0x4A7D5768:0x50 Protocol 6 ctx = 0x9BE32260 Creating pd 0x97307690 Inserted to Q
REINJECT TRANSPORT_OUT: 0xC0A80175:0x411 -> 0x4A7D5768:0x50 FL: 0x2 to remote 0x0100007F:0xC71E
ALE_AUTH: 0x7F000001:0x411 -> 0x7F000001:0x1EC7 3508 AI
TRANSPORT_OUT: 0x7F000001:0x411 -> 0x7F000001:0x1EC7 Protocol 6 ctx = 0x0
TRANSPORT_IN 0x7F000001:0x1EC7 -> 0x7F000001:0x411 Protocol 6 ctx = 0x9BE32260 AI
TRANSPORT_OUT: 0x7F000001:0x1EC7 -> 0x7F000001:0x411 Protocol 6 ctx = 0x0
INJ COMPL TRANSPORT_OUT: 0xC0A80175:0x411 -> 0x4A7D5768:0x50 LIST_STATUS 0x0
TRANSPORT_IN_DISCARD 0x7F000001:0x411 -> 0x7F000001:0x1EC7 Protocol 6 ctx = 0x9BE32260 Creating pd 0x97307690 No CompramentID! II: 1,0 Inserted to Q
REINJECT TRANSPORT_IN_DISCARD: 0xC0A80175:0x411 -> 0x4A7D5768:0x50 REDIRECT: 0x7501A8C0:0x1104 <- 0x68577D4A:0x5000 FL: 0x12 II: 1,0
INJ COMPL TRANSPORT_IN_DISCARD: 0xC0A80175:0x411 -> 0x4A7D5768:0x50 LIST_STATUS 0x0
В чем может быть проблема?
Спасибо.
По теме ничего не скажу, но стиль комментов в коде, а также оформление вызовов функций и некоторых других элементов, приятно порадовал. Похоже на мой. Однако. Батя грит малаца, хорошо сделал.
Здравствуйте, x64, Вы писали:
x64>По теме ничего не скажу, но стиль комментов в коде, а также оформление вызовов функций и некоторых других элементов, приятно порадовал. Похоже на мой. Однако. Батя грит малаца, хорошо сделал.
стиль перенялся както после ковыряния этого
http://www.everfall.com/paste/id.php?j1hkf3xywp6u
так что таки батя))))
Вобщем чтобы олл поменьше наступал на подобные грабли:
FwpsInjectTransportReceiveAsync0 принимает в качестве 7-8 параметров interface id & subInterfaceId
Так вот на уровне TRANSPORT_OUTBOUND эти индексы одни
а на уровне TRANSPORT_INBOUND_DISCARD другие — и в том месте где я вызываю FwpsInjectTransportReceiveAsync0 не подходят.
Поэтому надо эти индексы сохранить в кллауте TRANSPORT_OUTBOUND и потом при инжектирования пакета с уровня TRANSPORT_INBOUND_DISCARD подставить их.