Dmitry_177

Forum Replies Created

Viewing 7 posts - 31 through 37 (of 37 total)
  • Author
    Posts
  • in reply to: TDI FILTER driver #6286
    Dmitry_177
    Participant

      Спасибо за разъяснение…

      Я уже спрашивал, так правильно будет перехватывать?

      OldClientEventReceive = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler;
      if (OldClientEventReceive)
      {
         ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler = HookedClientEventReceive;
      }

      Ну и соответственно и контекст еще так же присвоить…

      А еще, подскажете пожалуйста как в драйвере хранить список? Вроде как на уровне ядра подругому все, другие функции и т.д…

      З.Ы. я не так давно изучаю ring0, многого еще не знаю.. 😳

      in reply to: TDI FILTER driver #6284
      Dmitry_177
      Participant

        Что-то я не пойму.. а как тогда хранить для каждого address object свой оригинал callback функции? и потом еще в самой callback функции определять какой оригинал вызывать..

        tdi_fw-а я смотрел исходники..

        in reply to: TDI FILTER driver #6282
        Dmitry_177
        Participant

          Нужно перехватывать регистрацию TDI_EVENT_RECEIVE event’а и менять указатель на свой…

          Ловим:

          MajorFunction=IRP_INTERNAL_DEVICE_CONTROL
          MinorFunction=TDI_SET_EVENT_HANDLER
          Parameters->EventType=TDI_EVENT_RECEIVE

          Из DDK я как понял в Parameters->EventHandler будет указатель на callback функцию ClientEventReceive, но как его поменять на свой? может так?:

          OldClientEventReceive = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler;
          if (OldClientEventReceive)
          {
             ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler =
          
          HookedClientEventReceive;
          }

          А еще тогда в HookedClientEventReceive нужно вызывать оригинал:

          return OldClientEventReceive(TdiEventContext,
                              ConnectionContext,
                              ReceiveFlags,
                              BytesIndicated,
                              BytesAvailable,
                              BytesTaken,
                              Tsdu,
                              IoRequestPacket);

          Как тогда все оригинальные адреса callback функций сохранять для разных потоков вызвавших TDI_SET_EVENT_HANDLER чтобы потом их вызывать в HookedClientEventReceive? Или может есть какойнибудь способ передавать этот адрес в саму функцию HookedClientEventReceive?

          in reply to: TDI FILTER driver #6281
          Dmitry_177
          Participant

            В HookedTcpDeviceControl делаю так:

            if (irpStack->MinorFunction == TDI_SET_EVENT_HANDLER)
            {
               if (((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventType == TDI_EVENT_RECEIVE)
               {
                  .....
               }
            }

            Вот где точки, там в ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler по идее содержится адрес callback функции ClientEventReceive. В ней на сколько я понял в параметре Tsdu содержатся принятые данные.. Как можно их вытащить от туда? Подскажите пожалуйста..

            in reply to: TDI FILTER driver #6280
            Dmitry_177
            Participant

              По поводу первого я уже сам догадался.. и попробовал вызывать оригинальную функцию в начале, а потом уже смотреть в IRP TDI_RECEIVE..=) Но всеравно и так не работает..

              Спасибо за наводку, буду разбираться..

              in reply to: TDI FILTER driver #6278
              Dmitry_177
              Participant

                Собственно сам перехват:

                в *.h файле:

                PFILE_OBJECT pFile_tcp;
                PDEVICE_OBJECT pDev_tcp;
                PDRIVER_OBJECT pDrv_tcpip;
                
                typedef NTSTATUS (*OLDTCPIRPMJDEVICECONTROL)(IN PDEVICE_OBJECT, IN PIRP);
                OLDTCPIRPMJDEVICECONTROL OldTcpIrpMjDeviceControl;

                в *.с файле:

                UNICODE_STRING deviceTCPUnicodeString;
                WCHAR deviceTCPNameBuffer[]  = L"\\Device\\Tcp";
                
                RtlInitUnicodeString (&deviceTCPUnicodeString, deviceTCPNameBuffer);
                ntStatus = IoGetDeviceObjectPointer(&deviceTCPUnicodeString, FILE_READ_DATA, &pFile_tcp, &pDev_tcp);
                if(!NT_SUCCESS(ntStatus))
                   return ntStatus;
                pDrv_tcpip = pDev_tcp->DriverObject;
                
                OldTcpIrpMjDeviceControl = pDrv_tcpip->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL];
                
                if (OldTcpIrpMjDeviceControl)
                   InterlockedExchange ((PLONG)&pDrv_tcpip->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL], (LONG)HookedTcpDeviceControl);
                
                ...
                
                NTSTATUS HookedTcpDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
                {
                    PIO_STACK_LOCATION      irpStack;
                    UCHAR         *mdlBuffer;
                
                    irpStack = IoGetCurrentIrpStackLocation (Irp);
                    switch (irpStack->MajorFunction)
                   {
                       case IRP_MJ_INTERNAL_DEVICE_CONTROL:
                         if (irpStack->MinorFunction == TDI_SEND)
                         {
                            DbgPrint("tdifilter TDI_SEND");
                
                            mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
                
                            DbgPrint (mdlBuffer);
                         }
                
                         if (irpStack->MinorFunction == TDI_RECEIVE)
                         {
                            DbgPrint("tdifilter TDI_RECEIVE");
                
                            mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
                
                            DbgPrint (mdlBuffer);
                         }
                
                       break;
                      
                       default:
                       break;
                       }
                
                    return OldTcpIrpMjDeviceControl(DeviceObject, Irp);
                }

                по идее все должно ловиться и TDI_RECEIVE тоже.. Но почему-то этого не происходит.. Если я захожу на какойнибудь сайт, по идее там должны быть http-пакеты и html страничка.. Но этого почему-то нету..=(

                in reply to: NDIS IM #6258
                Dmitry_177
                Participant

                  Обязательность или опционально сть обработчиков в NDIS_PROTOCOL_CHARACTERISTICS и NDIS_MINIPORT_CHARACTERISTICS описана в DDK, большинство из них нужны.

                  Подскажи пожалуйста в каком разделе в DDK это можно почитать?

                  лучше из отдельного потока работающего на IRQL_PASSIVE_LEVEL

                  т.е. лучше создавать свой поток в драйвере при сохранении? какойнибудь там ZwCreateThread функцией?

                Viewing 7 posts - 31 through 37 (of 37 total)