Forum Replies Created
-
AuthorPosts
-
Спасибо за разъяснение…
Я уже спрашивал, так правильно будет перехватывать?
OldClientEventReceive = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler; if (OldClientEventReceive) { ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler = HookedClientEventReceive; }
Ну и соответственно и контекст еще так же присвоить…
А еще, подскажете пожалуйста как в драйвере хранить список? Вроде как на уровне ядра подругому все, другие функции и т.д…
З.Ы. я не так давно изучаю ring0, многого еще не знаю.. 😳
Что-то я не пойму.. а как тогда хранить для каждого address object свой оригинал callback функции? и потом еще в самой callback функции определять какой оригинал вызывать..
tdi_fw-а я смотрел исходники..
Нужно перехватывать регистрацию 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?
В 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 содержатся принятые данные.. Как можно их вытащить от туда? Подскажите пожалуйста..
По поводу первого я уже сам догадался.. и попробовал вызывать оригинальную функцию в начале, а потом уже смотреть в IRP TDI_RECEIVE..=) Но всеравно и так не работает..
Спасибо за наводку, буду разбираться..
Собственно сам перехват:
в *.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 страничка.. Но этого почему-то нету..=(
Обязательность или опционально сть обработчиков в NDIS_PROTOCOL_CHARACTERISTICS и NDIS_MINIPORT_CHARACTERISTICS описана в DDK, большинство из них нужны.
Подскажи пожалуйста в каком разделе в DDK это можно почитать?
лучше из отдельного потока работающего на IRQL_PASSIVE_LEVEL
т.е. лучше создавать свой поток в драйвере при сохранении? какойнибудь там ZwCreateThread функцией?
-
AuthorPosts