Dmitry_177

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)