Home › Forums › Discussions › General › TDI FILTER driver › Reply To: TDI FILTER driver
June 26, 2007 at 10:02 pm
#6289
Реализовал что-то наподобии, но у меня опять же таки не ловятся входящие пакеты и еще синий экран появляется.. Выложу весь код:
в *.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?