Forum Replies Created

Viewing 15 posts - 16 through 30 (of 37 total)
  • Author
    Posts
  • in reply to: TDI FILTER driver #6312
    Dmitry_177
    Participant

    Как-то странно.. ничего не понимаю.. Падает он все так же при вызове оригинальной функции.. Проверял адреса функции и контекста так:
    в TDI_SET_EVENT_HANDLER выводил DbgPrint-ом адреса pBlockFromPagedLookasideList->EventHandler и pBlockFromPagedLookasideList->EventContext, а потом в HookedClientEventReceive тоже выводил.. Все правильно, адреса совпадают.. А вот почему падает не понимаю…=((

    in reply to: TDI FILTER driver #6310
    Dmitry_177
    Participant

    Искал.. и в отладчике тоже.. Все осталось тоже самое.. При вызове оригинальной функции система падает..

    in reply to: TDI FILTER driver #6308
    Dmitry_177
    Participant

    Изменил.. Вснравно BSOD.. 🙁

    in reply to: TDI FILTER driver #6306
    Dmitry_177
    Participant

    Поменяй paged lookaside list на non paged lookaside list и будет тебе счастье.

    А это где менять??? Что-то я не пойму..

    in reply to: TDI FILTER driver #6304
    Dmitry_177
    Participant

    И использовать их на IRQL_DISPATCH_LEVEL низзя

    Ведь при компиляции в DDK при неверном IRQL на сколько я знаю он должен выдавать ошибку..

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

    in reply to: TDI FILTER driver #6302
    Dmitry_177
    Participant

    Я выкладывал код в своем посте: 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;
    in reply to: TDI FILTER driver #6300
    Dmitry_177
    Participant

    Разобрался я немного с отладчиком… Из него я как понял драйвер валится на этом:
    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 не понимаю…

    in reply to: TDI FILTER driver #6299
    Dmitry_177
    Participant

    нашел..=) оказывается это при выключенной винде на ВМ есть..

    in reply to: TDI FILTER driver #6298
    Dmitry_177
    Participant

    Установил, VMware Workstation, создал там виртуальный комп, установил там ось.. Потом установил VMWare Tools, расшарил полностью диск С, так мне проще.. А вот как отлаживать драйвер? На ВМ нужно установить WinDBG и что дальше?

    Из той статьи не понятно где искать этот “Configuration Editor” написано что Settings->Configuration Editor, но что-то нигде в настройках не найду его что-то..

    in reply to: TDI FILTER driver #6296
    Dmitry_177
    Participant

    Я как понимаю нужно VMWare скачать для создания виртуальной машины.. Зашел на сайт http://www.vmware.com/products/ и суда http://www.vmware.com/download/home.html а там много разных программ.. а какая мне нужна?

    in reply to: TDI FILTER driver #6294
    Dmitry_177
    Participant

    Soft-ICE у меня не запускается почему-то.. Что я только не делал.. И разные версии ставил и саму DriverStudio полную.. И на всяких форумах искал ответа и в гугле, не работает почему-то он у меня и все.. 🙁 Может из за того что у меня ноут..

    А для WinDBG нужен второй комп.. И еще, везде пишут что он входит в состав DDK, у меня его почему-то нету.. Еще искал файл windbg.exe(точно не помню сейчас его название, но на каком-то форуме видел его правильное название) ничего не нашлось.. 🙁

    Других отладчиков под ring0 я не знаю..

    А сдавать мне уже совсем скоро.. Скорей всего у меня перехват как-то неправильно устанавливается.. SerpentFly, помоги пожалуйста, очень надо..

    in reply to: TDI FILTER driver #6292
    Dmitry_177
    Participant

    Я понимаю что несколько Event-ов нужно перехватывать.. Но у меня этот код почему-то постоянно синий экран выдает… никак не могу понять почему..=(

    in reply to: TDI FILTER driver #6290
    Dmitry_177
    Participant

    SerpentFly, помоги пожалуйста.. Все что я смог сделать я отобразил это в коде.. Я реально зашел в тупик.. Помоги пожалуйста..

    in 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?

    in reply to: TDI FILTER driver #6288
    Dmitry_177
    Participant

    Спасибо большое 🙂 Вы очень добры.. Буду разбираться..

Viewing 15 posts - 16 through 30 (of 37 total)