Forum Replies Created
-
AuthorPosts
-
Как-то странно.. ничего не понимаю.. Падает он все так же при вызове оригинальной функции.. Проверял адреса функции и контекста так:
в TDI_SET_EVENT_HANDLER выводил DbgPrint-ом адреса pBlockFromPagedLookasideList->EventHandler и pBlockFromPagedLookasideList->EventContext, а потом в HookedClientEventReceive тоже выводил.. Все правильно, адреса совпадают.. А вот почему падает не понимаю…=((Искал.. и в отладчике тоже.. Все осталось тоже самое.. При вызове оригинальной функции система падает..
Изменил.. Вснравно BSOD.. 🙁
Поменяй paged lookaside list на non paged lookaside list и будет тебе счастье.
А это где менять??? Что-то я не пойму..
И использовать их на IRQL_DISPATCH_LEVEL низзя
Ведь при компиляции в DDK при неверном IRQL на сколько я знаю он должен выдавать ошибку..
Вообще если есть желание, то я могу куда-нибудь залить свой этот драйвер с исходниками.. Просто я не понимаю почему он не работает.. 👿
Я выкладывал код в своем посте: Posted:Wed Jun 27, 2007 12:02 am. Он практически так и не изменился, добавились только прерывания..
Не вижу всего кода, но если pBlockFromPagedLookasideList действительно аппокирован из paged pool, то падает вполне закономерно, так как ClientEventReceive вызывается на IRQL_DISPATCH_LEVEL.
У меня pBlockFromPagedLookasideList находится в НЕСТРАНИЧНОЙ ПАМЯТИ(NonPagedPool)! Вот:
g_pPagedLookasideList = ExAllocatePool(NonPagedPool, sizeof(PAGED_LOOKASIDE_LIST)); ExInitializePagedLookasideList(g_pPagedLookasideList, NULL, NULL, 0, sizeof(CLIENTEVENTRECEIVECONTEXT), 'tdis', 0); InitializeListHead(&g_ClientEventReceiveListHead); ......... ..... ...... ..... pBlockFromPagedLookasideList = ExAllocateFromPagedLookasideList(g_pPagedLookasideList); memset(pBlockFromPagedLookasideList, 0, sizeof(CLIENTEVENTRECEIVECONTEXT)); 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;
Разобрался я немного с отладчиком… Из него я как понял драйвер валится на этом:
return OldClientEventReceive(pBlockFromPagedLookasideList->EventContext,ConnectionContext,
ReceiveFlags,
BytesIndicated,
BytesAvailable,
*BytesTaken,
Tsdu,
*IoRequestPacket);`
из функции HookedClientEventReceive, а она вот так выглядит:
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; _asm // ýòî ÿ äåëàë äëÿ ïðåðûâàíèÿ, äëÿ îòëàäêè.. { int 3 } pBlockFromPagedLookasideList = TdiEventContext; OldClientEventReceive = pBlockFromPagedLookasideList->EventHandler; _asm { int 3 } sduBuffer = Tsdu; DbgPrint("tdi_sniffer TDI_RECEIVE:n"); DbgPrint(sduBuffer); _asm { int 3 } // âîò òà ýòîì OldClientEventReceive âàëèòñÿ.. return OldClientEventReceive(pBlockFromPagedLookasideList->EventContext, ConnectionContext, ReceiveFlags, BytesIndicated, BytesAvailable, *BytesTaken, Tsdu, *IoRequestPacket); }
Вобщем все прерывания срабатывают.. DbgPrint пишет принятый первый пакет только.. А потом драйвет сваливается.. Я как понял на этой строке, но что в ней не так никак не пойму… По идее я присваиваю OldClientEventReceive оригинальный адрес из EventHandler-а а в pBlockFromPagedLookasideList->EventContext по идее содержится оригинальный контекст.. и почему BSOD не понимаю…
нашел..=) оказывается это при выключенной винде на ВМ есть..
Установил, VMware Workstation, создал там виртуальный комп, установил там ось.. Потом установил VMWare Tools, расшарил полностью диск С, так мне проще.. А вот как отлаживать драйвер? На ВМ нужно установить WinDBG и что дальше?
Из той статьи не понятно где искать этот “Configuration Editor” написано что Settings->Configuration Editor, но что-то нигде в настройках не найду его что-то..
Я как понимаю нужно VMWare скачать для создания виртуальной машины.. Зашел на сайт http://www.vmware.com/products/ и суда http://www.vmware.com/download/home.html а там много разных программ.. а какая мне нужна?
Soft-ICE у меня не запускается почему-то.. Что я только не делал.. И разные версии ставил и саму DriverStudio полную.. И на всяких форумах искал ответа и в гугле, не работает почему-то он у меня и все.. 🙁 Может из за того что у меня ноут..
А для WinDBG нужен второй комп.. И еще, везде пишут что он входит в состав DDK, у меня его почему-то нету.. Еще искал файл windbg.exe(точно не помню сейчас его название, но на каком-то форуме видел его правильное название) ничего не нашлось.. 🙁
Других отладчиков под ring0 я не знаю..
А сдавать мне уже совсем скоро.. Скорей всего у меня перехват как-то неправильно устанавливается.. SerpentFly, помоги пожалуйста, очень надо..
Я понимаю что несколько Event-ов нужно перехватывать.. Но у меня этот код почему-то постоянно синий экран выдает… никак не могу понять почему..=(
SerpentFly, помоги пожалуйста.. Все что я смог сделать я отобразил это в коде.. Я реально зашел в тупик.. Помоги пожалуйста..
Реализовал что-то наподобии, но у меня опять же таки не ловятся входящие пакеты и еще синий экран появляется.. Выложу весь код:
в *.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?
Спасибо большое 🙂 Вы очень добры.. Буду разбираться..
-
AuthorPosts