Скрытие раздела реестра из ring0 - проблемы

Тема в разделе "WASM.WIN32", создана пользователем drmist, 6 авг 2006.

  1. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Поигравшись с процессами и файлами перешел к реестру.
    Поставил задачу: скрыть раздел с заданным именем.
    Как я понимаю, алгоритм следующий: перехватить NtEnumerateKey, в перехватчике получить имя раздела по его Index (второй параметр NtEnumerateKey), если имя равно заданному, вместо вызова NtEnumerateKey c заданным Index вызвать c Index+1 (будем считать, что имя раздела уникально). Но TrueEnumerateKey(hKey, Index, 0, &Buff, 512, &dwTemp) (Buff - это буфер для структуры KEY_BASIC_INFORMATION) возвращает STATUS_ACCESS_VIOLATION.
    Помогите пожалуйста, я в панике )).
     
  2. UPI

    UPI New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    11
    pObjectNames - юникодный массив с именами ключей, которые нужно скрыть.
    nkeys - количество элементов в массиве.

    Код (Text):
    1. NTSTATUS MyNtEnumerateKey(
    2.                 IN HANDLE KeyHandle,
    3.                 IN ULONG Index,
    4.                 IN KEY_INFORMATION_CLASS KeyInformationClass,
    5.                 OUT PVOID KeyInformation,
    6.                 IN ULONG KeyInformationLength,
    7.                 OUT PULONG ResultLength)
    8. {
    9.    NTSTATUS ns;
    10.    UNICODE_STRING Name;
    11.    OBJECT_ATTRIBUTES ObjectAttributes;
    12.    HANDLE Key;
    13.    ULONG i = 0, hkeysum = 0, id;
    14.    BOOLEAN hideit;
    15.  
    16.    ns=NtEnumerateKey(KeyHandle,Index,KeyNameInformation,
    17.             KeyInformation,KeyInformationLength,ResultLength);
    18.  
    19.    if (ns!=STATUS_SUCCESS) return ns;
    20.  
    21.    ObjectAttributes.Length=sizeof(OBJECT_ATTRIBUTES);  
    22.    ObjectAttributes.Attributes=OBJ_CASE_INSENSITIVE;
    23.    ObjectAttributes.RootDirectory=KeyHandle;
    24.    ObjectAttributes.SecurityDescriptor=NULL;
    25.    ObjectAttributes.SecurityQualityOfService=NULL;
    26.  
    27.    RtlInitUnicodeString(&Name,KeyInformation->Name);
    28.    while (i<nkeys) {
    29.      ObjectAttributes.ObjectName=&pObjectNames[i];
    30.      if (NtOpenKey(&Key,KEY_ENUMERATE_SUB_KEYS,&ObjectAttributes)==STATUS_SUCCESS) {  
    31.         NtClose(Key);
    32.         if (RtlCompareUnicodeString(&pObjectNames[i],&Name,TRUE)<=0) ++hkeysum;
    33.      }
    34.      ++i;
    35.    }
    36.  
    37.    id=Index+hkeysum;
    38.    if (id>Index)
    39.    while (TRUE) {
    40.      i=0; hideit=FALSE;
    41.      ns=NtEnumerateKey(KeyHandle,id,KeyNameInformation,
    42.             KeyInformation,KeyInformationLength,ResultLength);
    43.      if (ns!=STATUS_SUCCESS) return ns;
    44.  
    45.      RtlInitUnicodeString(&Name,KeyInformation->Name);
    46.      while (i<nkeys) {
    47.        ObjectAttributes.ObjectName=&pObjectNames[i];
    48.        if (NtOpenKey(&Key,KEY_ENUMERATE_SUB_KEYS,&ObjectAttributes)==STATUS_SUCCESS) {  
    49.                NtClose(Key);
    50.           if (!RtlCompareUnicodeString(&pObjectNames[i],&Name,TRUE)) { hideit=TRUE; break; }
    51.        }
    52.        ++i;
    53.      }
    54.      if (!hideit) break;
    55.      ++id;
    56.    }
    57.  
    58.    return NtEnumerateKey(KeyHandle,id,KeyInformationClass,
    59.                  KeyInformation,KeyInformationLength,ResultLength);
    60. }
     
  3. electron

    electron New Member

    Публикаций:
    0
    Регистрация:
    26 май 2005
    Сообщения:
    32
    Пример обработчика скрывающего раздел начинающийся с "_":
    Код (Text):
    1. NTSTATUS NewNtEnumerateKey(
    2.         IN HANDLE KeyHandle,
    3.         IN ULONG Index,
    4.         IN KEY_INFORMATION_CLASS KeyInformationClass,
    5.         OUT PVOID KeyInformation,
    6.         IN ULONG KeyInformationLength,
    7.         OUT PULONG ResultLength
    8.         )
    9. {
    10.     Result=TrueNtEnumerateKey(KeyHandle,Index,KeyInformationClass,KeyInformation,KeyInformationLength,ResultLength);
    11.     switch(KeyInformationClass)
    12.     {
    13.  
    14.     case KeyBasicInformation:
    15.         if(((PKEY_BASIC_INFORMATION)KeyInformation)->Name[0]==0x5F)
    16.             return STATUS_OBJECT_NAME_NOT_FOUND;
    17.         break;
    18.     case KeyNodeInformation:
    19.         if(((PKEY_NODE_INFORMATION)KeyInformation)->Name[0]==0x5F)
    20.             return STATUS_OBJECT_NAME_NOT_FOUND;
    21.         break;
    22.     case KeyNameInformation:
    23.         if(((PKEY_NAME_INFORMATION)KeyInformation)->Name[0]==0x5F)
    24.             return STATUS_OBJECT_NAME_NOT_FOUND;
    25.         break;
    26.     }
    27.            
    28.  
    29.     return Result;
    30. }
     
  4. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Код (Text):
    1. NTSTATUS NewEnumerateKey(HANDLE hKey, ULONG Index, ULONG KeyInfoClass, PVOID pKeyInfo, ULONG KeyInfoLen, PULONG ResultLen)
    2. {
    3.   NTSTATUS st;
    4.   ULONG dwTemp;
    5.   UCHAR Buff[sizeof(KEY_BASIC_INFORMATION)+1024];
    6.  
    7.   st = TrueEnumerateKey(hKey, Index, KeyBasicInformation, &Buff, sizeof(KEY_BASIC_INFORMATION)+1024, &dwTemp);
    8.   DPRINT("TrueEnumerateKey returns 0x%08x", st);
    9.   return TrueEnumerateKey(hKey, Index, KeyInfoClass, pKeyInfo, KeyInfoLen, ResultLen);
    10. }
    При первом вызове TrueEnumerateKey постоянно получаю 0xC0000005 == STATUS_ACCESS_VIOLATION. При этом regedit функционирует нормально.
    На всякий случай даже посмотрел ассемблерный листинг - все компилится все равно как если бы я тоже самое написал на асме.
    Что не так?
     
  5. X_k

    X_k New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    34
    Точно! Вот вчера написал тоже самое и сидел парился почему не прячутся в записи в реестре. Потом посмотрел, а у меня даже дело до цикла не доходит. Не возвращается STATUS_SUCCESS при вызове TRUE функции с KeyBasicInformation. Пока не понял почему. А и ещё почему то при выгрузке драйвера BSOD c DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS. По ходу у меня что-то ещё выполняется а я его выгружаю. Не нашел что там ещё выполняется.
     
  6. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Твоя проблема заключается в том, что адреса аргументов передаваемых функции не соответствуют PreviousMode. Есть несколько путей решения этой проблемы.
    1) Использовать Zw функцию вместо Nt, она сама устанавливает PreviousMode. Но в твоем случае это неприменимо, так как вызовет рекурсию.
    2) Использовать для своих вызовов буфер переданый тебе из юзермода.
    3) Создавать свой буфер, и мапить его в юзермод через mdl.
     
  7. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    X_k
    >>DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
    такая ошибка оычно появляется когда ты выгружаешь драйвер, не сняв хуки.
    PE386
    Спасибо, буду думать.
     
  8. UPI

    UPI New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    11
    Посмотри dwTemp должна быть инициализированной переменной.
     
  9. X_k

    X_k New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    34
    Фу ну вот вроде всё сделал. Всё что надо скрывает. Всё что не надо не скрывает. Тока вот одна ерунда не могу зайти в некоторые разделы реестра при загруженном драйвере. Они просто не открываются. Ни у кого такой проблемы не было?
     
  10. AXE123

    AXE123 New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    1
    Адрес:
    Россия
    Скинь код свой интересно глянуть!
     
  11. X_k

    X_k New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    34
    И вообще сейчас потестил дровина себя как то странно ведет. При запущенном драйвере у меня скрываются папки "Мои документы" и "Общие документы" Пропадает звук везде. Пишет Bad Direct Sound Driver. Ну там еще кое какие ярлыки не хотят работать. Што за бред?
     
  12. X_k

    X_k New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2006
    Сообщения:
    34
    Вот код если поможет:
    Код (Text):
    1. NTSTATUS
    2. Captured_NtEnumerateKey(
    3.     IN HANDLE KeyHandle,
    4.     IN ULONG Index,
    5.     IN KEY_INFORMATION_CLASS KeyInformationClass,
    6.     OUT PVOID KeyInformation,
    7.     IN ULONG Length,
    8.     OUT PULONG ResultLength
    9.     )
    10. {
    11.     NTSTATUS                Result;
    12.     UNICODE_STRING          usKeyName;
    13.     UNICODE_STRING          usKeyHide;
    14.     OBJECT_ATTRIBUTES       ObjectAttributes;
    15.     KEY_BASIC_INFORMATION   *lpKey;
    16.     HANDLE                  hKey;
    17.     ULONG                   dwTemp;
    18.     BOOLEAN                 bIfHide = TRUE;
    19.     //UCHAR                 Buff[sizeof(KEY_BASIC_INFORMATION)+1024];
    20.     int                     i;
    21.  
    22.     DPRINT( "Captured NtEnumerateKey function called\n" );
    23.    
    24.     //lpKey=ExAllocatePool(PagedPool,sizeof(KEY_BASIC_INFORMATION)+1024);
    25.  
    26.     Result = True_NtEnumerateKey(   KeyHandle,
    27.                                     Index,
    28.                                     KeyBasicInformation,
    29.                                     KeyInformation,
    30.                                     Length,
    31.                                     ResultLength );
    32.  
    33.     DPRINT("TrueEnumerateKey with KeyBasicInformation returns 0x%08x", Result);
    34.  
    35.     if ( Result != STATUS_SUCCESS )
    36.         return True_NtEnumerateKey( KeyHandle,
    37.                                     Index,
    38.                                     KeyInformationClass,
    39.                                     KeyInformation,
    40.                                     Length,
    41.                                     ResultLength );
    42.  
    43.     lpKey = KeyInformation;
    44.     usKeyName.Buffer = lpKey->Name;
    45.     usKeyName.Length = usKeyName.MaximumLength = (USHORT) lpKey->NameLength;
    46.  
    47.     ObjectAttributes.Length=sizeof(OBJECT_ATTRIBUTES);  
    48.     ObjectAttributes.Attributes=OBJ_CASE_INSENSITIVE;
    49.     ObjectAttributes.RootDirectory=KeyHandle;
    50.     ObjectAttributes.SecurityDescriptor=NULL;
    51.     ObjectAttributes.SecurityQualityOfService=NULL;
    52.  
    53.     for( i = 0; i != CAPREG_MAX_HIDE_SUBKEYS; i++ )
    54.     {
    55.         usKeyHide.Buffer = wHideKeys[i];
    56.         usKeyHide.Length = usKeyHide.MaximumLength = (USHORT) wcslen(wHideKeys[i])*sizeof(WCHAR);
    57.  
    58.         ObjectAttributes.ObjectName=&usKeyHide;
    59.  
    60.         //InitializeObjectAttributes(&ObjectAttributes, &usKeyHide, OBJ_CASE_INSENSITIVE, NULL, NULL);
    61.  
    62.         Result = ZwOpenKey( &hKey,
    63.                             KEY_ENUMERATE_SUB_KEYS,
    64.                             &ObjectAttributes );
    65.  
    66.         DPRINT("Result of open key is:%d\n",Result);
    67.  
    68.         if ( Result == STATUS_SUCCESS )
    69.         {
    70.             ZwClose(hKey);
    71.  
    72.             if ( RtlCompareUnicodeString(&usKeyName, &usKeyHide, TRUE) >= 0 )
    73.                 Index++;
    74.         }
    75.     }
    76.  
    77.     while (bIfHide)
    78.     {
    79.         Result = True_NtEnumerateKey(   KeyHandle,
    80.                                         Index,
    81.                                         KeyBasicInformation,
    82.                                         KeyInformation,
    83.                                         Length,
    84.                                         ResultLength );
    85.  
    86.         if ( Result != STATUS_SUCCESS )
    87.            return STATUS_EA_LIST_INCONSISTENT;
    88.  
    89.         lpKey = KeyInformation;
    90.         usKeyName.Buffer = lpKey->Name;
    91.         usKeyName.Length = usKeyName.MaximumLength = (USHORT) lpKey->NameLength;
    92.  
    93.         for( i = 0; i != CAPREG_MAX_HIDE_SUBKEYS; i++ )
    94.         {  
    95.             usKeyHide.Buffer = wHideKeys[i];
    96.             usKeyHide.Length = usKeyHide.MaximumLength = (USHORT) wcslen(wHideKeys[i])*sizeof(WCHAR);
    97.  
    98.             if ( RtlCompareUnicodeString(&usKeyName, &usKeyHide, TRUE) == 0 )
    99.             {
    100.                 Index++;
    101.                 break;
    102.             }  
    103.         }
    104.  
    105.         if ( i == CAPREG_MAX_HIDE_SUBKEYS)
    106.             bIfHide = FALSE;
    107.     }
    108.  
    109.     return True_NtEnumerateKey( KeyHandle,
    110.                                 Index,
    111.                                 KeyInformationClass,
    112.                                 KeyInformation,
    113.                                 Length,
    114.                                 ResultLength );
    115. }
    тег code для кого придуман?
     
  13. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Код (Text):
    1. NTSTATUS NewEnumerateKey(HANDLE hKey, ULONG Index, ULONG KeyInfoClass, PVOID pKeyInfo, ULONG KeyInfoLen, PULONG ResultLen)
    2. {
    3.   NTSTATUS st;
    4.   ULONG dwTemp = 0;
    5.   PMDL Mdl;
    6.   PKEY_BASIC_INFORMATION pTmpKeyInfo;
    7.   PVOID pTempBuff;
    8.   PVOID pMapped;
    9.  
    10.   // _asm int 3
    11.  
    12.   pTempBuff = ExAllocatePool(NonPagedPool, sizeof(KEY_BASIC_INFORMATION)+1024);
    13.  
    14.   Mdl = IoAllocateMdl(pTempBuff, sizeof(KEY_BASIC_INFORMATION)+1024, FALSE, FALSE, NULL);
    15.   MmBuildMdlForNonPagedPool(Mdl);
    16.   pMapped = MmMapLockedPages(Mdl, UserMode);
    17.   pTmpKeyInfo = (PKEY_BASIC_INFORMATION)MmGetSystemAddressForMdl(Mdl);
    18.  
    19.   st = TrueEnumerateKey(hKey, Index, KeyBasicInformation, pTmpKeyInfo, sizeof(KEY_BASIC_INFORMATION)+1024, &dwTemp);
    20.   DPRINT("EnumerateKey: 0x%08x", st);
    21.  
    22.   MmUnmapLockedPages(pMapped, Mdl);
    23.   MmUnlockPages(Mdl);
    24.   IoFreeMdl(Mdl);
    25.   ExFreePool(pTempBuff);
    26.   return TrueEnumerateKey(hKey, Index, KeyInfoClass, pKeyInfo, KeyInfoLen, ResultLen);
    27. }
    Получаю Bsod, Stop 4E: PFN_LIST_CORRUPT, притом он вылетает не с первого вызова моей функции потому где происходит ошибка сказать лично мне затруднительно.
    Я дурак, объясните что нет так.
     
  14. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    drmist
    Мда, руки нужно срочно выпремлять. Код просто блещет багами.

    1) pTmpKeyInfo = (PKEY_BASIC_INFORMATION)MmGetSystemAddressForMdl(Mdl); (а мапили то зачем спрашивается?)
    2) MmMapLockedPages(Mdl, UserMode) (а если юзермода нет? например мы в system)
    3) ULONG dwTemp = 0; (а указатель то в ядре)
    4) MmUnlockPages(Mdl); (чето я не видел, чтобы страницы где-то блокировались)
    5) А кто результаты всех этих функций проверять будет??

    Имхо не пиши дрова, пожалей бедную винду :))
     
  15. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    PE386
    Пока не буду. Сначал доку хорошую подыщу по работе с MDL и динамической памятью в ring0 (думаю, статьи Four-F подойдут), потом глядишь винда меня сама уговаривать будет, чтоб я под нее драйвер написал ))
    Не суди строго - я DDK неделю назад поставил.
     
  16. UPI

    UPI New Member

    Публикаций:
    0
    Регистрация:
    1 май 2006
    Сообщения:
    11
    Блин, а я и забыл, как делал. Короче, смотри переделку вверху.