использование общих переменных для нескольких драйверов

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

  1. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
    Доброго времени суток.
    Решаю следующую задачу:
    Необходимо в одном драйвере объявить несколько глобальных экспортируемых переменных. Значения для этих переменных задаются в этом же драйвере. Затем из другого драйвера получить и изменить значение этих переменных.

    Использование IRP-пакетов и dll не подходит! (таково условие).

    Я понимаю, что условие необычно, но что поделаешь:)

    Что касается объявления, полагаю, что необходимо использовать __declspec,
    но как второй драйвер получит адрес переменой?

    Заранее признателен за помощь!
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Найдёт базу первого драйвера и разберёт вручную таблицу экспорта. В чём проблема-то?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ну например секцию расшарить.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    deshiko
    Объект именованный создайте, секции или есчо какие. Физическая память вся общая.
     
  5. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Слушайте, я может немного туплю, - вот взять минипорты/протоколы, - они же как-то получают импорты от ндиса? Более того, я видел например коммуникации по экспортам в Tcpip.sys, afd.sys и т.д. Может имеет смысл держать первый драйвер по приоритету "более раннезугружаемым", а второй собрать с либой на экспорты первого?
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Все эти приоритеты штука тонкая, иногда тупо подгадывать приходится. Гораздо проще реализовать схему, при которой второй драйвер в момент вызовать определённой функциональности будет проверять наличие первого и разбирать таблицу экспорта при необходимости. Ну а если первый ещё не загружен, возвращать STATUS_DEVICE_NOT_READY, вот и всё, чего тут думать-то. Между прочим, первый можно и по требованию загрузить через ZwLoadDriver().
     
  7. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
  8. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Скорее имелось ввиду ZwQuerySystemInformation + SYSTEM_MODULES_INFORMATION, и реализовать свою GetProcAddress
     
  9. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
    J0E
    Да именно так!
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Мне показалось что пример исходника на другую тему, или я слишком бегло смотрел?
     
  11. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
  12. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
    Вот пример, работающего кода ринг 0, который позволяет находить экспортируемые переменные для любого драйвера:

    Код (Text):
    1. #include <ntifs.h>
    2. #include <ntddk.h>
    3. #include <ntimage.h>
    4. #include <stdlib.h>
    5.  
    6. typedef     ULONG   DWORD;         
    7. typedef     DWORD   *PDWORD;       
    8. typedef     USHORT  WORD;          
    9. typedef     WORD    *PWORD;        
    10. typedef     UCHAR   BYTE;          
    11. typedef     BYTE    *PBYTE;        
    12.  
    13. typedef PVOID *PPVOID;
    14.  
    15. typedef struct _MODULE_INFO
    16. {
    17.     DWORD dReserved1;
    18.     DWORD dReserved2;
    19.     PVOID pBase;
    20.     DWORD dSize;
    21.     DWORD dFlags;
    22.     WORD wIndex;
    23.     WORD wRank;
    24.     WORD wLoadCount;
    25.     WORD wNameOffset;
    26.     BYTE abPath [MAXIMUM_FILENAME_LENGTH];
    27. }MODULE_INFO, *PMODULE_INFO , ** PPMODULE_INFO;
    28.  
    29. #define MODULE_INFO_ sizeof (MODULE_INFO)
    30.  
    31. typedef struct _MODULE_LIST
    32. {
    33.     DWORD dModules;
    34.     MODULE_INFO aModules [];
    35. }
    36. MODULE_LIST, *PMODULE_LIST , ** PPMODULE_LIST;
    37.  
    38. #define MODULE_LIST_ sizeof (MODULE_LIST)  
    39.  
    40. #define min(_a,_b) (((_a) < (_b)) ? (_a) : (_b))
    41. #define max(_a,_b) (((_a) > (_b)) ? (_a) : (_b))
    42.  
    43.  
    44. #define SPY_TAG 3 // SPY>
    45.  
    46. #define PTR_ADD(_base,_offset) \
    47.     ((PVOID) ((PBYTE) (_base) + (DWORD) (_offset)))
    48.  
    49. #define SystemModuleInformation 11  // SYSTEMINFOCLASS
    50.  
    51. NTSYSAPI
    52. PIMAGE_NT_HEADERS
    53. NTAPI
    54. RtlImageNtHeader(IN PVOID ModuleAddress);
    55.  
    56. typedef enum _SYSTEM_INFORMATION_CLASS {
    57.     SystemBasicInformation = 0,
    58.     SystemPerformanceInformation = 2,
    59.     SystemTimeOfDayInformation = 3,
    60.     SystemProcessInformation = 5,
    61.     SystemProcessorPerformanceInformation = 8,
    62.     SystemInterruptInformation = 23,
    63.     SystemExceptionInformation = 33,
    64.     SystemRegistryQuotaInformation = 37,
    65.     SystemLookasideInformation = 45
    66. } SYSTEM_INFORMATION_CLASS;
    67.  
    68. NTSYSAPI
    69. NTSTATUS
    70. NtQuerySystemInformation (
    71.     IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    72.     OUT PVOID SystemInformation,
    73.     IN ULONG SystemInformationLength,
    74.     OUT PULONG ReturnLength OPTIONAL
    75.     );
    76.  
    77.  
    78. /*---prototypes of function---*/
    79. NTSTATUS
    80. UnloadDriver(
    81.     PDRIVER_OBJECT  DriverObject
    82.     );
    83.  
    84. NTSTATUS
    85. DriverEntry(
    86.     PDRIVER_OBJECT  pDriverObject,
    87.     PUNICODE_STRING  pRegistryPath
    88.     );
    89.  
    90. /*---functions---*/
    91.  
    92.  
    93. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////PMODULE_LIST
    94. //выделение памяти
    95. PVOID
    96. SpyMemoryCreate(
    97.     DWORD dSize
    98.     )
    99. {
    100.     return ExAllocatePool(PagedPool, max(dSize, 1));
    101. }
    102.  
    103. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////PMODULE_LIST
    104. //обнуление
    105. PVOID
    106. SpyMemoryDestroy(
    107.     PVOID pData
    108.     )
    109. {
    110.     if (pData != NULL) ExFreePool (pData);
    111.     return NULL;
    112. }
    113. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////PMODULE_LIST
    114. PMODULE_LIST
    115. SpyModuleList (
    116.     PDWORD pdData,
    117.     PNTSTATUS pns
    118.     )
    119. {
    120.     DWORD dSize;
    121.     DWORD dData = 0;
    122.     NTSTATUS ns = STATUS_INVALID_PARAMETER;
    123.     PMODULE_LIST pml = NULL;
    124.    
    125.     for (dSize = 0x10000; ((pml == NULL) && dSize); dSize <<= 1)
    126.     {
    127.         if ((pml = SpyMemoryCreate (dSize)) == NULL)
    128.         {
    129.             ns = STATUS_NO_MEMORY;
    130.             break;
    131.         }
    132.         ns = NtQuerySystemInformation (SystemModuleInformation, pml, dSize, &dData);
    133.  
    134.         if (ns != STATUS_SUCCESS)
    135.         {
    136.             pml = SpyMemoryDestroy (pml);
    137.             dData = 0;
    138.             if (ns != STATUS_INFO_LENGTH_MISMATCH) break;
    139.         }
    140.     }
    141.    
    142.     if (pdData!= NULL) *pdData = dData;
    143.    
    144.     if (pns!= NULL) *pns = ns;
    145.    
    146.     return pml;
    147. }
    148. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////PMODULE_LIST
    149. PMODULE_LIST
    150. SpyModuleFind (
    151.     PBYTE pbModule,
    152.     PDWORD pdIndex,
    153.     PNTSTATUS pns
    154.     )
    155. {
    156.     DWORD i;
    157.     DWORD dIndex = -1;
    158.     NTSTATUS ns = STATUS_INVALID_PARAMETER;
    159.     PMODULE_LIST pml = NULL;
    160.     if ((pml = SpyModuleList (NULL, &ns))!= NULL)
    161.     {
    162.         for (i = 0; i < pml->dModules; i++)
    163.         {
    164.             if (!strstr(pml->aModules[i].abPath,pbModule))
    165.             {
    166.  
    167.                 dIndex = i;
    168.                 break;
    169.             }
    170.         }
    171.         if (dIndex == -1)
    172.         {
    173.             pml = SpyMemoryDestroy (pml);
    174.             ns = STATUS_NO_SUCH_FILE;
    175.         }
    176.     }
    177.    
    178.     if (pdIndex != NULL) *pdIndex = dIndex;
    179.    
    180.     if (pns != NULL) *pns = ns;
    181.  
    182.     return pml;
    183. }
    184. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    185. PVOID
    186. SpyModuleBase(
    187.     PBYTE pbModule,  
    188.     PNTSTATUS pns
    189.     )
    190. {
    191.     PMODULE_LIST pml;
    192.     DWORD dIndex;
    193.     NTSTATUS ns = STATUS_INVALID_PARAMETER;
    194.     PVOID pBase = NULL;
    195.  
    196.     if ((pml = SpyModuleFind(pbModule, &dIndex, &ns))!= NULL)
    197.     {  
    198.         pBase = pml->aModules[dIndex].pBase;
    199.         SpyMemoryDestroy (pml);
    200.     }
    201.     if (pns!= NULL) *pns = ns;
    202.     return pBase;
    203.  }
    204. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    205. PIMAGE_NT_HEADERS
    206. SpyModuleHeader (
    207.     PBYTE pbModule,
    208.     PPVOID ppBase,
    209.     PNTSTATUS pns
    210.     )
    211. {
    212.     PVOID pBase = NULL;
    213.     NTSTATUS ns = STATUS_INVALID_PARAMETER;
    214.     PIMAGE_NT_HEADERS pinh = NULL;
    215.    
    216.     if (((pBase = SpyModuleBase(pbModule,&ns))!= NULL) && ((pinh = RtlImageNtHeader(pBase)) == NULL))
    217.     {
    218.         ns = STATUS_INVALID_IMAGE_FORMAT;
    219.     }
    220.    
    221.     if (ppBase != NULL) *ppBase = pBase;
    222.    
    223.     if (pns!= NULL) *pns = ns;
    224.    
    225.     return pinh;
    226. }
    227. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    228. PIMAGE_EXPORT_DIRECTORY
    229. SpyModuleExport (
    230.     PBYTE pbModule,
    231.     PPVOID ppBase,
    232.     PNTSTATUS pns
    233.     )
    234. {
    235.     PIMAGE_NT_HEADERS pinh;
    236.     PIMAGE_DATA_DIRECTORY pidd;
    237.     PVOID pBase = NULL;
    238.     NTSTATUS ns = STATUS_INVALID_PARAMETER;
    239.     PIMAGE_EXPORT_DIRECTORY pied = NULL;
    240.    
    241.     if ((pinh = SpyModuleHeader(pbModule, & pBase, & ns))!= NULL)
    242.     {
    243.         pidd = pinh->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT;
    244.         if (pidd->VirtualAddress && (pidd->Size >= sizeof(IMAGE_EXPORT_DIRECTORY)))
    245.         {
    246.             pied = PTR_ADD(pBase,pidd->VirtualAddress);
    247.         }
    248.         else
    249.         {
    250.             ns = STATUS_DATA_ERROR;
    251.         }
    252.     }
    253.  
    254.     if (ppBase != NULL) *ppBase = pBase;
    255.    
    256.     if (pns != NULL) *pns = ns;
    257.    
    258.     return pied;
    259. }
    260. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    261. PVOID
    262. SpyModuleSymbol (
    263.     PBYTE pbModule,
    264.     PBYTE pbName,
    265.     PPVOID ppBase,
    266.     PNTSTATUS pns
    267.     )
    268. {
    269.     PIMAGE_EXPORT_DIRECTORY pied;
    270.     PDWORD pdNames, pdFunctions;
    271.     PWORD pwOrdinals;
    272.     DWORD i, j;
    273.     PVOID pBase = NULL;
    274.     NTSTATUS ns = STATUS_INVALID_PARAMETER;
    275.     PVOID pAddress = NULL;
    276.    
    277.     if ((pied = SpyModuleExport(pbModule, &pBase, &ns))!= NULL)
    278.     {
    279.         pdNames = PTR_ADD (pBase, pied->AddressOfNames);
    280.         pdFunctions = PTR_ADD (pBase, pied->AddressOfFunctions);
    281.         pwOrdinals = PTR_ADD (pBase, pied->AddressOfNameOrdinals);
    282.         for (i = 0; i <pied->NumberOfNames; i++)
    283.         {
    284.             j = pwOrdinals[i];
    285.             if (!strcmp((PTR_ADD(pBase,pdNames [i])), pbName))
    286.             {
    287.                 if (j <pied->NumberOfFunctions)
    288.                 {
    289.                     pAddress = PTR_ADD (pBase, pdFunctions [j]);
    290.                 }
    291.                 break;
    292.             }
    293.         }
    294.         if (pAddress == NULL)
    295.         {
    296.             ns = STATUS_PROCEDURE_NOT_FOUND;
    297.         }
    298.     }
    299.    
    300.     if (ppBase != NULL) *ppBase = pBase;
    301.    
    302.     if (pns != NULL) *pns = ns;
    303.    
    304.     return pAddress;
    305. }
    306. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    307. PVOID
    308. SpyModuleSymbolEx(
    309.       PBYTE pbSymbol,
    310.       PPVOID ppBase,
    311.       PNTSTATUS pns)
    312. {
    313.  
    314.     DWORD       i;
    315.     BYTE        abModule [MAXIMUM_FILENAME_LENGTH] = "ntkrpamp.exe";
    316.     PBYTE       pbName  = pbSymbol;
    317.     PVOID       pBase   = NULL;
    318.     NTSTATUS    ns      = STATUS_INVALID_PARAMETER;
    319.     PVOID       pAddress = NULL;
    320.  
    321.     for (i = 0; ((pbSymbol[i])&&(pbSymbol[i]!= '!')); i ++);
    322.     if (pbSymbol[i++])
    323.     {
    324.         if (i <= MAXIMUM_FILENAME_LENGTH)
    325.         {
    326.             strncpy (abModule, pbSymbol, i);
    327.             pbName = pbSymbol += i;
    328.         }
    329.         else
    330.         {
    331.             pbName = NULL;
    332.         }
    333.  
    334.     }
    335.     if (pbName != NULL)
    336.     {
    337.         pAddress = SpyModuleSymbol (abModule, pbName, &pBase, &ns);
    338.     }
    339.     if (ppBase != NULL) * ppBase = pBase;
    340.  
    341.     if (pns != NULL) * pns = ns;
    342.  
    343.     return pAddress;
    344. }
    345.  
    346. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    347. /*DriverEntry*/
    348. NTSTATUS
    349. DriverEntry(
    350.     PDRIVER_OBJECT  pDriverObject,
    351.     PUNICODE_STRING  pRegistryPath
    352.     )
    353. {
    354.     PDWORD  pKeServiceDescriptorTable;
    355.     UNICODE_STRING  us;
    356.     NTSTATUS ns;
    357.     RtlInitUnicodeString(&us,L"NtOpenFile");
    358.     pDriverObject->DriverUnload = UnloadDriver;
    359.     DbgPrint("Driver load\n");
    360.     pKeServiceDescriptorTable = SpyModuleSymbolEx("NtOpenFile", NULL, &ns);
    361.     if (ns == STATUS_SUCCESS)
    362.     {
    363.         DbgPrint("NtOpenFile <%p>\n",pKeServiceDescriptorTable);
    364.     }
    365.  
    366.     pKeServiceDescriptorTable = MmGetSystemRoutineAddress(&us);
    367.     if (pKeServiceDescriptorTable!= 0){
    368.         DbgPrint("NtOpenFile <%p>\n",pKeServiceDescriptorTable);
    369.     }
    370.  
    371.     return STATUS_SUCCESS;
    372. }
    373. /*DriverUnload*/
    374. NTSTATUS
    375. UnloadDriver(
    376.     PDRIVER_OBJECT  DriverObject
    377.     )
    378. {
    379.     DbgPrint("Driver unload\n");
    380.     return STATUS_SUCCESS;
    381. }
     
  13. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
    В приведенном выше примере с помощью системной функции MmGetSystemRoutineAddress и не системной SpyModuleSymbolEx, определяется адрес сервиса NtOpenFile.

    Всем спасибо, тема закрыта.