Перехват функций драйвером загруженным из SMM

Тема в разделе "WASM.NT.KERNEL", создана пользователем drem1lin, 18 ноя 2010.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Из SMM режима в Windows XP загружается драйвер, при попытке перехватить IRP_MJ_CLOSE или IRP_MJ_WRITE из Ntfs.sys компьютер перезагружается, на экране пусто, из-за нестандартной загрузки драйвера, не знаю, как подцепить к нему отладчик. В коде жирным отмечены инструкции вызывающие сбой в работе.
    Код (Text):
    1.    INT InstallFilter (VOID)
    2. {
    3.     NTSTATUS        status = STATUS_SUCCESS;
    4.     UNICODE_STRING  devName;
    5.     INT     err = 0;
    6.     ULONG   cr0Val = 0;
    7.     ULONG   pImageSize = 0;
    8.     DWORD   pNtfsSys = 0;
    9.    
    10.    
    11.     if ( g_filterEnabled )
    12.         {
    13.                 IFDEBUG(WriteLogMessage( "Filter already installed\r\n" ));
    14.                 return -1;
    15.         }
    16.     pNtfsSys = FindImageBaseAddress("ntfs.sys", NULL);
    17.     if (pNtfsSys == 0)
    18.     {
    19.         IFDEBUG(WriteLogMessage( "Can`t get ntfs.sys image base address\r\n" ));
    20.         return -2;
    21.     }
    22.     IFDEBUG(WriteLogMessage( "Ntfs.sys image base address finded\r\n" ));
    23.     g_filesCopyCountInQueue = 0;
    24.  
    25.     RtlInitUnicodeString(&devName, L"\\FileSystem\\Ntfs");
    26.     status = ObReferenceObjectByName(
    27.                                             &devName,
    28.                                             OBJ_CASE_INSENSITIVE,
    29.                                             NULL,
    30.                                             0,
    31.                                             (POBJECT_TYPE)IoDriverObjectType,
    32.                                             KernelMode,
    33.                                             NULL,
    34.                                             (PVOID*)&g_TargetDrvObj
    35.                                             );
    36.     if (!NT_SUCCESS(status))
    37.     {
    38.             IFDEBUG( WriteLogMessage ("Cannot get DriverObject of NTFS\r\n"));
    39.             return -1;
    40.     }
    41.    
    42.    /* if ( *NtBuildNumber == WINXP )
    43.     {
    44.             g_freeMem = (ULONG) pNtfsSys + RVA_FREEDATA_XP;
    45.     }
    46.     else if ( *NtBuildNumber == WINVISTA )
    47.     {
    48.             g_freeMem = (ULONG) pNtfsSys + RVA_FREEDATA_VISTA;
    49.     }
    50.     else if ( *NtBuildNumber >= WINVISTASP1 && *NtBuildNumber <= WINVISTASP2 )
    51.     {
    52.             g_freeMem = (ULONG) pNtfsSys + RVA_FREEDATA_VISTA_SP;
    53.     }
    54.     else
    55.     {
    56.             IFDEBUG( WriteLogMessage ("Unsupported Windows Build in InstallFilter\r\n"));
    57.             return -1;
    58.     }*/
    59.     //IFDEBUG( WriteLogMessage ("g_freeMem Defined\r\n"));
    60.    // InitializeListHead( &g_filesCopyQueueList );
    61.     KeInitializeSpinLock( &g_filesCopyQueueListLock );
    62.     KeInitializeEvent( &g_filesCopyCloseThreadSignalEvent, NotificationEvent, FALSE );
    63.     KeInitializeEvent( &g_filesCopyEvent, NotificationEvent, FALSE );
    64.  
    65.     g_filesCopyThread = NULL;
    66.     err = CrCreateThread( FilterCopyFilesThread, NULL,  &g_filesCopyThread);
    67.     if ( err < THREAD_OK )
    68.     {      
    69.             IFDEBUG( WriteLogMessage  ( "Can't create files copy thread\r\n"));
    70.             return -3;
    71.     }
    72.    
    73.      // Сохраняем адрес оригинальной функции
    74.      g_OldMJClose = g_TargetDrvObj->MajorFunction[IRP_MJ_CLOSE];
    75.      g_OldMJWrite = g_TargetDrvObj->MajorFunction[IRP_MJ_WRITE];
    76.      
    77.      // Сохраняем данные из области памяти
    78.      //RtlCopyMemory ( g_oldData, (PUCHAR) g_freeMem, sizeof(g_oldData) );
    79.      
    80.      // Записываем код перехода на нашу функцию MJClose
    81.      ((pfar_jmp) g_MyData)->PushOp  = 0x68;
    82.      ((pfar_jmp) g_MyData)->PushArg = NewMJClose;
    83.      ((pfar_jmp) g_MyData)->RetOp   = 0xC3;
    84.  
    85.      // Записываем код перехода на нашу функцию MJWrite
    86.      ((pfar_jmp) (g_MyData + 6))->PushOp  = 0x68;
    87.      ((pfar_jmp) (g_MyData + 6))->PushArg = NewMJWrite;
    88.      ((pfar_jmp) (g_MyData + 6))->RetOp   = 0xC3;
    89.      // Отключаем защиту записи в память
    90.      CommonEnableGlobalMemoryWR ( &cr0Val );
    91.      
    92.      
    93.      // Записываем указатель на наш код в секции data, вместо оригинального IRP_MJ_CLOSE
    94.     [b] g_TargetDrvObj->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH) g_MyData;[/b]
    95.  
    96. [b]     // Записываем указатель на наш код в секции data, вместо оригинального IRP_MJ_WRITE
    97.      g_TargetDrvObj->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH) (g_MyData+6);[/b]
    98.      
    99.      // Возвращаем обратно защиту памяти от записи
    100.      CommonDisableGlobalMemoryWR ( cr0Val );
    101.  
    102.      IFDEBUG(DbgPrint( "IRP_MJ_CLOSE Old func 0x%.8x; New func 0x%.8x (free mem)\n", g_OldMJClose, g_freeMem ));
    103.      IFDEBUG(DbgPrint( "IRP_MJ_WRITE Old func 0x%.8x; New func 0x%.8x (free mem)\n", g_OldMJWrite, g_freeMem + 6 ));
    104.      
    105.      // Устанавливаем флаг активности фильтра
    106.      g_filterEnabled = TRUE;
    107.      IFDEBUG(WriteLogMessage("FileHooking is Enabled\r\n" ));
    108.  
    109.      return 0;
    110. }
    111.  
    112.  
    113. INT
    114.     UninstallFilter (
    115.     VOID
    116.     )
    117. {
    118.         ULONG    CR0Reg;
    119.  
    120.         PLIST_ENTRY pEnt = NULL;
    121.         PFILTER_FILE_ENTRY      fileEnt = NULL;
    122.         KIRQL   oldIrql;
    123.  
    124.         if ( !g_filterEnabled )
    125.         {
    126.                 IFDEBUG(WriteLogMessage ( "Filter not installed yet\r\n" ));
    127.                 return 0;
    128.         }
    129.        
    130.         // Отключаем защиту записи в память
    131.         CommonEnableGlobalMemoryWR ( &CR0Reg );
    132.  
    133.          // Удаляем наш код перехода из секции data модуля ntfs.sys, возвращая старые данные
    134.       //  RtlCopyMemory ( (PUCHAR) g_freeMem, g_oldData, sizeof(g_oldData) );
    135.  
    136.         // Возвращаем оригинальный обработчик IRP_MJ_CLOSE
    137.          g_TargetDrvObj->MajorFunction[IRP_MJ_CLOSE] = g_OldMJClose;
    138.  
    139.         // Возвращаем оригинальный обработчик IRP_MJ_WRITE
    140.          g_TargetDrvObj->MajorFunction[IRP_MJ_WRITE] = g_OldMJWrite;
    141.  
    142.         // Возвращаем обратно защиту памяти от записи*/
    143.         CommonDisableGlobalMemoryWR ( CR0Reg );
    144.         IFDEBUG(WriteLogMessage("IRP_MJ_CLOSE and IRP_MJ_WRITE restored\n"));
    145.              
    146.  
    147.         if(g_filesCopyThread)
    148.         {
    149.                 CrCloseAndWaitThread(g_filesCopyThread, &g_filesCopyCloseThreadSignalEvent, NULL);
    150.                 g_filesCopyThread = NULL;
    151.         }
    152.         /*
    153.         // Если в очереди на копирование присутствуют файлы, то необходимо очистить очередь
    154.         if( g_filesCopyCountInQueue )
    155.         {
    156.                 KeAcquireSpinLock( &g_filesCopyQueueListLock, &oldIrql );
    157.                 while ( TRUE )
    158.                 {
    159.                         if ( IsListEmpty(&g_filesCopyQueueList) || !g_filesCopyCountInQueue )
    160.                         {
    161.                                 KeReleaseSpinLock( &g_filesCopyQueueListLock, oldIrql );
    162.                                 break;
    163.                         }
    164.                         pEnt = g_filesCopyQueueList.Flink;
    165.                         fileEnt = NULL;
    166.                         fileEnt = CONTAINING_RECORD( pEnt, FILTER_FILE_ENTRY, le );
    167.                         if ( fileEnt )
    168.                         {
    169.                                 RemoveEntryList(&fileEnt->le );
    170.                                 if ( g_filesCopyCountInQueue > 0 )
    171.                                 {
    172.                                         g_filesCopyCountInQueue--;
    173.                                 }
    174.                                        
    175.                                 if ( fileEnt->fileName )
    176.                                 {
    177.                                         ExFreePoolWithTag( fileEnt->fileName, SNU_ALLOC_TAG);
    178.                                 }
    179.                                 ExFreePoolWithTag( fileEnt , SNU_ALLOC_TAG);
    180.                         }
    181.                 }
    182.                 KeReleaseSpinLock ( &g_filesCopyQueueListLock, oldIrql );
    183.         }
    184.         */
    185.         // Сбрасываем флаг активности фильтра
    186.         g_filterEnabled = FALSE;
    187.         IFDEBUG(WriteLogMessage ( "FileHooking is Disabled\r\n" ));
    188.  
    189.         return 0;
    190. }
    191.  
    192.  
    193. void
    194. CommonEnableGlobalMemoryWR (
    195.         unsigned long   *cr0Value
    196.         )
    197. {
    198.     unsigned long   val = 0;
    199.     IFDEBUG( WriteLogMessage ("CommonEnableGlobalMemoryWR start\r\n"));
    200.     _asm    
    201.         {              
    202.                 cli            
    203.                 mov eax,cr0    
    204.                 mov val,eax            
    205.                 and eax,0xfffEffff              
    206.                 mov cr0,eax    
    207.         }
    208.         *cr0Value = val;
    209.     //IFDEBUG( WriteLogMessage ("CommonEnableGlobalMemoryWR stop\r\n"));
    210. }
    211.  
    212. void
    213. CommonDisableGlobalMemoryWR (
    214.         unsigned long   cr0Value
    215.         )
    216. {      
    217.     //IFDEBUG( WriteLogMessage ("CommonDisableGlobalMemoryWR start\r\n"));
    218.         _asm    
    219.         {              
    220.                 mov eax,cr0Value                
    221.                 mov cr0,eax            
    222.                 sti    
    223.         }
    224.     IFDEBUG( WriteLogMessage ("CommonDisableGlobalMemoryWR stop\r\n"));
    225. }
    226.  
    227. DWORD FindImageBaseAddress( char *szImageName, ULONG *pLength )
    228. {
    229.     PSYSTEM_MODULE_INFORMATION pItem;
    230.     PVOID buf = 0;
    231.     ULONG len;
    232.     ULONG count;
    233.     DWORD addr = 0;
    234.  
    235.     if( ZwQuerySystemInformation( SystemModuleInformation, buf, 0, &len ) == STATUS_INFO_LENGTH_MISMATCH )
    236.     {
    237.         buf = MmAllocateNonCachedMemory( len );
    238.         IFDEBUG( WriteLogMessage ("STATUS_INFO_LENGTH_MISMATCH\r\n"));
    239.         if( buf )
    240.         {
    241.             if( ZwQuerySystemInformation( SystemModuleInformation, buf, len, NULL ) == STATUS_SUCCESS )
    242.             {
    243.                 IFDEBUG( WriteLogMessage ("STATUS_SUCCESS\r\n"));
    244.                 count = *(ULONG*)buf;
    245.                 pItem = (PSYSTEM_MODULE_INFORMATION)((UCHAR*)buf + 4);
    246.  
    247.                 do  {
    248.  
    249.                     if( _stricmp( pItem->ImageName + pItem->ModuleNameOffset, szImageName ) == 0 )
    250.                     {
    251.                         addr = (DWORD)(pItem->Base);
    252.                         if( pLength )
    253.                             *pLength = pItem->Size;
    254.                         IFDEBUG( WriteLogMessage ("Module finded!\r\n"));
    255.                         break;
    256.                     }
    257.  
    258.                     pItem ++;
    259.                     count --;
    260.                 }
    261.                 while( count > 0 );
    262.             }
    263.  
    264.             MmFreeNonCachedMemory( buf, len );
    265.  
    266.         }
    267.     }
    268.  
    269.     return addr;
    270. }
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    точно SMM?
     
  3. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    что точно SMM? загрузчик драйвера точно в SMM, ради этого биос патчил.