Reply To: TDI FILTER driver

Home Forums Discussions General TDI FILTER driver Reply To: TDI FILTER driver

#6289
Dmitry_177
Participant

    Реализовал что-то наподобии, но у меня опять же таки не ловятся входящие пакеты и еще синий экран появляется.. Выложу весь код:

    в *.h файле:

    typedef NTSTATUS (*OLDCLIENTEVENTRECEIVE)(IN PVOID,
                                    IN CONNECTION_CONTEXT,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    OUT ULONG,
                                    IN PVOID,
                                    OUT PIRP);
    
    // структура про которую мы говорили
    typedef struct _CLIENTEVENTRECEIVECONTEXT
    {
       LIST_ENTRY   ListEntry;
       PVOID      EventHandler;
       PVOID      EventContext;
    } CLIENTEVENTRECEIVECONTEXT, *PCLIENTEVENTRECEIVECONTEXT;

    полный код драйвера в *.c файле

    #include "ntddk.h"
    #include "TdiKrnl.h"
    #include "main.h"
    
    PPAGED_LOOKASIDE_LIST   g_pPagedLookasideList;
    LIST_ENTRY            g_ClientEventReceiveListHead;
    KSPIN_LOCK            g_ClientEventReceiveListLock;
       
    NTSTATUS DriverEntry(IN PDRIVER_OBJECT  DriverObject,
                    IN PUNICODE_STRING RegistryPath)
    {
       OldTcpIrpMjDeviceControl = NULL;
    
       g_pPagedLookasideList = ExAllocatePool(NonPagedPool, sizeof(PAGED_LOOKASIDE_LIST));
    
       ExInitializePagedLookasideList(g_pPagedLookasideList, NULL, NULL, 0, sizeof(CLIENTEVENTRECEIVECONTEXT), 'tdis', 0);
    
       InitializeListHead(&g_ClientEventReceiveListHead);
       KeInitializeSpinLock(&g_ClientEventReceiveListLock);
    
       DriverObject->DriverUnload = OnUnload;
    
       return InstallDriverHook();
    }
    
    NTSTATUS InstallDriverHook()
    {
        NTSTATUS       ntStatus;     
       UNICODE_STRING deviceTCPUnicodeString;
       WCHAR deviceTCPNameBuffer[]  = L"\\Device\\Tcp";
        pFile_tcp  = NULL;
       pDev_tcp   = NULL;
       pDrv_tcpip = NULL;
    
       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)
          pDrv_tcpip->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = HookedTcpDeviceControl;      
          //InterlockedExchange ((PLONG)&pDrv_tcpip->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL], (LONG)HookedTcpDeviceControl);
    
       return STATUS_SUCCESS;
    }
    
    NTSTATUS HookedTcpDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
        PIO_STACK_LOCATION         irpStack;
       UCHAR                  *mdlBuffer;
       PCLIENTEVENTRECEIVECONTEXT   pBlockFromPagedLookasideList;
       KIRQL                  irql;
    
        irpStack = IoGetCurrentIrpStackLocation (Irp);
    
        switch (irpStack->MajorFunction)
       {
           case IRP_MJ_INTERNAL_DEVICE_CONTROL:
             if (irpStack->MinorFunction == TDI_SEND)
             {
                DbgPrint("tdi_sniffer TDI_SEND:");
    
                mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
    
                DbgPrint (mdlBuffer);
             }
    
             if (irpStack->MinorFunction == TDI_SET_EVENT_HANDLER)
             {
                if (((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventType == TDI_EVENT_RECEIVE)
                {
                   DbgPrint("tdi_sniffer TDI_SET_EVENT_HANDLER -> TDI_EVENT_RECEIVE");
    
                   pBlockFromPagedLookasideList = ExAllocateFromPagedLookasideList(g_pPagedLookasideList);
    
                   memset(pBlockFromPagedLookasideList, 0, sizeof(CLIENTEVENTRECEIVECONTEXT));
    
                   KeAcquireSpinLock(&g_ClientEventReceiveListLock, &irql);
    
                   InsertHeadList(&g_ClientEventReceiveListHead, &pBlockFromPagedLookasideList->ListEntry);
    
                   // ñîõðàíÿåì îðèãèíàë ôóíêöèè â ñòðóêòóðå
                   pBlockFromPagedLookasideList->EventHandler = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler;
    
                   // ñîõðàíÿåì îðèãèíàë êîíòåêñòà â ñòðóêòóðå
                   pBlockFromPagedLookasideList->EventContext = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventContext;
    
                      
                   ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler = HookedClientEventReceive;
                   ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventContext = pBlockFromPagedLookasideList;
    
                   KeReleaseSpinLock(&g_ClientEventReceiveListLock, irql);
    
                   DbgPrint("tdi_sniffer ClientEventReceive Hooked...");
                }
             }
    
          break;
          
          default:
          break;
        }
    
       return OldTcpIrpMjDeviceControl(DeviceObject, Irp);
    }
    
    NTSTATUS HookedClientEventReceive(IN PVOID  TdiEventContext,
                              IN CONNECTION_CONTEXT  ConnectionContext,
                              IN ULONG  ReceiveFlags,
                              IN ULONG  BytesIndicated,
                              IN ULONG  BytesAvailable,
                              OUT ULONG  *BytesTaken,
                              IN PVOID  Tsdu,
                              OUT PIRP  *IoRequestPacket)
    {
       UCHAR   *sduBuffer;
    
       PCLIENTEVENTRECEIVECONTEXT   pBlockFromPagedLookasideList;
       OLDCLIENTEVENTRECEIVE      OldClientEventReceive;
    
       pBlockFromPagedLookasideList = TdiEventContext; // â TdiEventContext ïî èäåå ñîäåðæèòñÿ óêàçàòåëü íà ìîþ ñòðóêòóðó
       OldClientEventReceive = pBlockFromPagedLookasideList->EventHandler;
    
       sduBuffer = Tsdu;
       DbgPrint("tdi_sniffer TDI_RECEIVE:");
       DbgPrint(sduBuffer); // íåçíàþ êàê âûòàùèòü ïðèíÿòûå ïàêåòû èç Tsdu, åñëè îíè òàì íàõîäÿòñÿ èëè åùå ãäå, èç DDK ÿ ÷òî-òî íå ïîíÿë ãäå èìåííî îíè ñîäåðæàòñÿ
    
       // âûçûâàåì îðèãèíàë ôóíêöèè
       return OldClientEventReceive(pBlockFromPagedLookasideList->EventContext,
                             ConnectionContext,
                             ReceiveFlags,
                             BytesIndicated,
                             BytesAvailable,
                             *BytesTaken,
                             Tsdu,
                             *IoRequestPacket);
    }
    
    NTSTATUS OnUnload(IN PDRIVER_OBJECT DriverObject)
    {
       if (OldTcpIrpMjDeviceControl)
          InterlockedExchange ((PLONG)&pDrv_tcpip->MajorFunction[IRP_MJ_DEVICE_CONTROL], (LONG)OldTcpIrpMjDeviceControl);   
       if (pFile_tcp != NULL)
          ObDereferenceObject(pFile_tcp);
       pFile_tcp = NULL;
    
       return STATUS_SUCCESS;
    }

    Выгрузку списка и проверку на существующий в нем элемент я еще пока не делал, так что не обращайте на это внимания.. Подскажите пожалуйста правильно ли я понял суть со своей структурой и правильно ли я делаю? Почему-то всеравно не показываются входящие пакеты, даже DbgPrint(“tdi_sniffer TDI_RECEIVE:”); не показывается.. И подскажите пожалуйста как вытащить принятые пакеты и от куда их вообще нужно вытаскивать, из Tsdu?