Обработчик перехваченой API RegEnumValue

Тема в разделе "WASM.BEGINNERS", создана пользователем integer, 8 авг 2010.

  1. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    Задача: скрыть определенные параметры в реесте.

    Вариант 1: возвращается ERROR_NO_MORE_ITEMS если текущий параметр совпадает с тем который нужно скрыть.
    Недостаток. Параметры которые идут после скрываемого отображены не будут.

    Вариант 2: вызывающей программе возвращается следующий за скрываемым параметр.
    Недостаток: этот "следующий параметр" отобразится в списке 2 раза.

    Вариант 3, (код ниже) комбинация варианта 2 + в глобальную переменную сохраняется количество скрытых параметров, а при следующем вызове добавляется к Index.
    Недостаток: если параметры будут запрашиваться не по порядку Index, или начинаться не с 0го Index, то будут лезть баги в виде повторения некоторых параметров, или отображение не всех параметров.

    NewRegEnumValue - вариант 3:
    Код (Text):
    1. .data
    2.     nHdnCount dd 0  ; Hidden records counter (for delta)
    3.  
    4.  
    5. .code
    6.  
    7. ;; -------------------------------------------------------------------------------- ;;
    8. IsHiddenRegValue proc
    9.  
    10.     cmp byte ptr [ebx], "C"
    11.     je @hide
    12.  
    13. ;; Not hide
    14.     xor ebx, ebx
    15.     ret
    16.  
    17. @hide:
    18.     ret
    19. IsHiddenRegValue endp
    20.  
    21.  
    22. ;; -------------------------------------------------------------------------------- ;;
    23. NewRegEnumValue proc p1:dword, p2:dword, p3:dword, p4:dword, p5:dword, p6:dword, p7:dword, p8:dword
    24.     local RealRegEnumValue : dword
    25.  
    26.     mov RealRegEnumValue, eax
    27.  
    28. ; Init counter if search from begining
    29.     .if p2==0
    30.         mov nHdnCount, 0
    31. ; else add delta to dwIndex
    32.     .else
    33.         mov eax, nHdnCount
    34.         add p2, eax
    35.     .endif
    36.  
    37. @RegEnumValue:
    38.     push p8                 ; lpcbData
    39.     push p7                 ; lpData
    40.     push p6                 ; lpType
    41.     push p5                 ; lpReserved
    42.     push p4                 ; lpcchValueName
    43.     push p3                 ; lpValueName
    44.     push p2                 ; dwIndex
    45.     push p1                 ; hKey
    46.     call RealRegEnumValue   ; Real RegEnumValue
    47.     .if eax!=ERROR_SUCCESS
    48.         ret
    49.     .endif
    50.  
    51.     pushad
    52.  
    53. ; Decision: to hide or not to hide
    54.     mov ebx, p3
    55.     call IsHiddenRegValue
    56.     .if ebx==0
    57.         popad
    58.         ret
    59.     .endif
    60.  
    61. ; Hide Value (replace by next)
    62.     inc p2          ; Next dwIndex
    63.     inc nHdnCount   ; Increase counter (for delta)
    64.     popad
    65.     jmp @RegEnumValue
    66. NewRegEnumValue endp
    Вопрос вот в чем... Есть ли варинт который лишен всех этих недостатков ?
     
  2. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Держите у себя индекс соего параметра, и если переданный в функцию индекс больше либо равен вашему индексу, то передаёте ориг. функции индекс на 1 больше.
     
  3. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    Хранить индекс скрываемого параметра не очень удобно. Если в ключ добавляются новые параметры другими программами, например в ветку ".../Run". Индекс который нужно скрывать может измениться.
    И еще если нужно будет спрятать 2 параметра в одном ключе то функции нужно будет передавать уже +2.
    В приведенном коде уже реализовано скрытие любого количества параметров начинающихся с буквы "C".
    Недостатки кода я описал
    Хотя Вы навели меня на мысль что можно хранить еще индекс который в последний раз был передан в RegEnumValue и сравнивать его со следующим переданным. Если вызов идет не по порядку то сбрасывать переменную с количеством скрытых параметров...
     
  4. n0name

    n0name New Member

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Хранить таблицу индексов(передавать следующий индекс в таблице), перестраивать её каждый раз при вызове этой апи, либо синхронно апдейтить из другого потока, ожидающего апдейт в NtNotifyChangeKey(не помню имя обёртки для этого сервиса).
     
  6. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    Гуглил RegEnumValue и ZwEnumerateValueKey, а в статьях сейчас нашел NtEnumerateValueKey.
    Предложеный способ "И снова мы должны вычислить сдвиг, перевызывая функцию для всех индексов от 0 до Index" - то что нужно.
    Переделал обработчик под ZwEnumerateValueKey. Все работает, всем спасибо.