WFP прокси
От: Аноним  
Дата: 03.09.10 13:34
Оценка:
Привет всем форумчанам!

В WDK есть пример 7600.16385.1\src\network\trans\ddproxy — перенаправляет UDP пакеты по определённым правилам.

Может кто-нибудь помочь? Не бесплатно конечно!

Нужно в общем переделать его чтобы делал тоже самое — но с TCP сеансами.

Я который день вожусь — терпения не хватает.

Дмитрий
Re: WFP прокси
От: Аноним  
Дата: 11.11.10 17:11
Оценка:
Добрый день, у меня таже проблема.
Суть такова 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


В чем может быть проблема?
Спасибо.
wpf tcp proxy
Re[2]: WFP прокси
От: x64 Россия  
Дата: 11.11.10 19:15
Оценка:
По теме ничего не скажу, но стиль комментов в коде, а также оформление вызовов функций и некоторых других элементов, приятно порадовал. Похоже на мой. Однако. Батя грит малаца, хорошо сделал.
Re[3]: WFP прокси
От: seregikk  
Дата: 11.11.10 19:21
Оценка:
Здравствуйте, x64, Вы писали:

x64>По теме ничего не скажу, но стиль комментов в коде, а также оформление вызовов функций и некоторых других элементов, приятно порадовал. Похоже на мой. Однако. Батя грит малаца, хорошо сделал.


стиль перенялся както после ковыряния этого
http://www.everfall.com/paste/id.php?j1hkf3xywp6u
так что таки батя))))
Re[2]: WFP прокси
От: seregikk  
Дата: 24.11.10 16:39
Оценка:
Вобщем чтобы олл поменьше наступал на подобные грабли:
FwpsInjectTransportReceiveAsync0 принимает в качестве 7-8 параметров interface id & subInterfaceId

Так вот на уровне TRANSPORT_OUTBOUND эти индексы одни
а на уровне TRANSPORT_INBOUND_DISCARD другие — и в том месте где я вызываю FwpsInjectTransportReceiveAsync0 не подходят.

Поэтому надо эти индексы сохранить в кллауте TRANSPORT_OUTBOUND и потом при инжектирования пакета с уровня TRANSPORT_INBOUND_DISCARD подставить их.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.