Reply To: TDI FILTER driver

Home Forums Discussions General Discussion 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?