Перенаправление пакетов

Тема в разделе "WASM.NETWORKS", создана пользователем Gastik, 15 май 2010.

  1. Gastik

    Gastik New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    22
    Есть драйвер с PacketFilterExtensionPtr процедурой. Он должен проверять iph_dest пакетов на значения из списка и перенаправлять их по другому ip из списка. Контрольную сумму при изменении заголовка меняю, но почему-то эти пакеты все равно никуда не идут. Контрольная сумма вычисляется правильно, т.к я сделал ее пересчет на всех пакетах и без изменения iph_dest они нормально уходят. Может быть еще что-то нужно менять кроме iph_dest и iph_xsum?

    Ниже привожу код процедурки:

    Код (Text):
    1. PF_FORWARD_ACTION myHookProc(
    2.         unsigned char *PacketHeader,
    3.         unsigned char *Packet,
    4.         unsigned int PacketLength,
    5.         unsigned int RecvInterfaceIndex,
    6.         unsigned int SendInterfaceIndex,
    7.         IPAddr RecvLinkNextHop,
    8.         IPAddr SendLinkNextHop)
    9. {
    10.     KIRQL irql;
    11.     IPAddr ip,redirect;
    12.     PF_FORWARD_ACTION retVal;
    13.  
    14.     if (RecvInterfaceIndex!=INVALID_PF_IF_INDEX)
    15.     {
    16.         //recv
    17.         retVal=PF_PASS;
    18.     }
    19.     else if(SendInterfaceIndex!=INVALID_PF_IF_INDEX)
    20.     {
    21.  
    22.         IPHeader * ipHeader=(IPHeader *)PacketHeader;
    23.    
    24.         if (myAList!=NULL)
    25.         {
    26.             KeAcquireSpinLock(&myAList->myAddressSpinLock,&irql);
    27.  
    28.             LONG i=myAList->myAddressCount;    
    29.             while (i)
    30.             {
    31.                 if(IsListEmpty(&myAList->myAddressListEntry)!=TRUE)
    32.                 {
    33.                     PLIST_ENTRY pLink = RemoveTailList(&myAList->myAddressListEntry);
    34.                     PADDRENTRY pElement = CONTAINING_RECORD(pLink,ADDRENTRY,myListEntry);
    35.  
    36.                     ip=pElement->Addr.ip; redirect=pElement->Addr.redirect;
    37.  
    38.                     ExFreeToNPagedLookasideList(myAList->myAddressList,pElement);
    39.  
    40.                     pElement=(PADDRENTRY)ExAllocateFromNPagedLookasideList(myAList->myAddressList);
    41.                     if(pElement!=NULL)
    42.                     {
    43.                         RtlZeroMemory(pElement,sizeof(ADDRESS));
    44.                         InsertHeadList(&myAList->myAddressListEntry,&pElement->myListEntry);
    45.  
    46.                         pElement->Addr.ip=ip;
    47.                         pElement->Addr.redirect=redirect;
    48.                     }      
    49.  
    50.                     if (ip==ipHeader->iph_dest)
    51.                     {
    52.                         ipHeader->iph_dest=redirect;                   
    53.                         break;
    54.                     }
    55.                 }
    56.                 i--;           
    57.             }
    58.             KeReleaseSpinLock(&myAList->myAddressSpinLock,irql);
    59.         }
    60.  
    61.         //вычисляем контрольную сумму
    62.         ULONG TmpXSum=0;
    63.         PUSHORT  WordPtr = (PUSHORT) ipHeader;
    64.         BOOLEAN  fOddLen = (BOOLEAN)((ipHeader->iph_length) & 1);
    65.         int length=ipHeader->iph_length >>1;
    66.         while(length--)
    67.         {
    68.             TmpXSum += *WordPtr;
    69.             WordPtr++;
    70.         }
    71.         if(fOddLen)
    72.         {
    73.             TmpXSum += (USHORT)*((PUCHAR)WordPtr);
    74.         }
    75.         TmpXSum = (((TmpXSum >> 16) | (TmpXSum << 16)) + TmpXSum) >> 16;
    76.         ipHeader->iph_xsum=~(USHORT)TmpXSum;
    77.  
    78.         retVal=PF_FORWARD;
    79.     }
    80.   return (retVal);
    81.  
    82. }
     
  2. Gastik

    Gastik New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    22
    Кажется я понял в чем тут дело. Нужно изменять и iph_src для получаемых пакетов опять-таки в соответствии со списком, т.к ждем то совершенно с другого адреса, но тут возникает другой вопрос: как узнать, что входящий пакет пришел с адреса, к которому мы перенаправили пакет, а не был сразу направлен на тот адрес?
     
  3. JhanGhuangxi

    JhanGhuangxi New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    31
    Gastik
    Сдается мне, что ты не в том направлении копаешь...
     
  4. Gastik

    Gastik New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    22
    Смотрел в tracert . Перенаправление проходит. В браузере - нет
     
  5. Gastik

    Gastik New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    22
    А поподробнее можно? Что не так?
     
  6. Gastik

    Gastik New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    22
    Вот как выглядит перенаправление в tracert с www.mail.ru на www.yandex.ru. Если не делать подмену входящих пакетов - в последней строчке будет www.yandex.ru [87.250.251.3].

    Tracing route to mail.ru [217.69.128.41]
    over a maximum of 30 hops:

    1 * * * Request timed out.
    2 1 ms <1 ms 1 ms 92.50.189.1.static.ufanet.ru [92.50.189.1]
    3 1 ms <1 ms <1 ms ck165-1-eth1.ufa.ufanet.ru [92.50.190.101]
    4 1 ms 1 ms 1 ms cmr4-1-te21.ufa.ufanet.ru [92.50.190.1]
    5 1 ms 1 ms 1 ms b0-vlan35.ufa.ufanet.ru [92.50.190.194]
    6 1 ms 1 ms 1 ms 82.96.211.37
    7 26 ms 26 ms 26 ms msk-ix-gw.inet.euro-tel.ru [193.232.244.60]
    8 29 ms 28 ms 29 ms msk-ix-m9.yandex.net [193.232.244.93]
    9 27 ms 27 ms 27 ms gallium-vlan901.yandex.net [77.88.56.126]
    10 27 ms 27 ms 27 ms l3-ugr2-ugr1.yandex.net [213.180.213.39]
    11 27 ms 27 ms 27 ms l3link-iva1-ugr1.yandex.net [213.180.213.4]
    12 26 ms 25 ms 26 ms mail.ru [217.69.128.41]

    Trace complete.
     
  7. JhanGhuangxi

    JhanGhuangxi New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    31
    На мой взгляд, для редиректа пиши либо TDI-фильтр, либо NDIS IM драйвер
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Господа, а вас вообще не смущает, что PacketFilterExtensionPtr может быть всего одна зарегистрирована в системе? Любой другой фильтр похерит все ваши выкрутасы. Изначально IP Filter Driver (ipfltdrv.sys) был написан для встроенного виндового фаервола, который впервые появился в Windows XP SP2. Подразумевалось, что он будет один в системе и только он будет использовать указанный интерфейс. Короче говоря, если вы уверены, что подобный фильтр будет один в системе - не вопрос, используйте, конечно, но кто ж такую гарантию-то даст?
     
  9. Gastik

    Gastik New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    22
    Спасибо, я уже о том же подумал. Пару часов как занимаюсь NDIS уже :)
     
  10. Gastik

    Gastik New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    22
    Никто не даст. Спасибо за информацию :)