Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› RootDirectory в OBJECT_ATTRIBUTES
Посл.ответ Сообщение

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 12 декабря 2010 19:59
· Личное сообщение · #1

Вызываю вручную ZwOpenKey. на 2к3 посредством тестового вызова RegOpenKeyEx установил RootDirectory в структуре атрибутов на значение 4Ch. Работает! Запустил на висте, ключ не открывается. Оказалось заявленный параметр должен быть равен 24h, однако при таком раскладе на 2к3 он не откроется. Как обойти расхождения и по возможности вручную считать его?



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 12 декабря 2010 20:22
· Личное сообщение · #2

Проверить версию и выставить нужный?

-----
старый пень




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 12 декабря 2010 20:55 · Поправил: ELF_7719116
· Личное сообщение · #3

r_e
Да. Одним словом Получить. Я диссасембл RegOpenKeyEx, он в какой-то структуре лежит в advapi32. Смещения разные в двух осях



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 12 декабря 2010 21:18
· Личное сообщение · #4

RtlGetVersion?

-----
старый пень




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 13 декабря 2010 08:49 · Поправил: ELF_7719116
· Личное сообщение · #5

r_e пишет:
RtlGetVersion?

Но она же не имеет отношения к RootDirectory ?!
Вот кусок кода из advapi32 который получает RootDirectory. Смысл: берется 80000002 (HKEY_LOCAL_MACHINE), обнуляется первый байт(80h), двойка одним словом [EDI+EDI*2] и в EAX, затем увеличивается в 4 раза. LEA ESI,DWORD PTR DS:[EAX+77FC00D0] читает указатель где лежит 4Сh. В висте немного по другому: там 2 сразу в 8 раз увеличивается и читается. Но смещения разные.
Code:
  1.  
  2. PUSH EDI
  3. PUSH ECX
  4. CALL ADVAPI32.77F76821
  5. MOV EDI,EAX
  6. CMP EDI,-1
  7. JE ADVAPI32.77F8D1CF
  8. PUSH ADVAPI32.77FC1600
  9. CALL DWORD PTR DS:[<&ntdll.RtlEnterCriti>; ntdll.RtlEnterCriticalSection
  10. TEST EAX,EAX
  11. JL ADVAPI32.77F8D1D6
  12. LEA EAX,DWORD PTR DS:[EDI+EDI*2]
  13. SHL EAX,2
  14. CMP BYTE PTR DS:[EAX+77FC00D8],1
  15. JE ADVAPI32.77F5485F
  16. PUSH EDI
  17. PUSH ECX
  18. CALL ADVAPI32.77F76821
  19. MOV EDI,EAX
  20. CMP EDI,-1
  21. JE ADVAPI32.77F8D1CF
  22. PUSH ADVAPI32.77FC1600
  23. CALL DWORD PTR DS:[<&ntdll.RtlEnterCriti>; ntdll.RtlEnterCriticalSection
  24. TEST EAX,EAX
  25. JL ADVAPI32.77F8D1D6
  26. LEA EAX,DWORD PTR DS:[EDI+EDI*2] // <--
  27. SHL EAX,2 // <--
  28. CMP BYTE PTR DS:[EAX+77FC00D8],1
  29. JE ADVAPI32.77F5485F
  30. LEA ESI,DWORD PTR DS:[EAX+77FC00D0] // <--
  31. CMP DWORD PTR DS:[ESI],EBX
  32. JE ADVAPI32.77F77BEF
  33. MOV ESI,DWORD PTR DS:[ESI] // <--
  34. PUSH ADVAPI32.77FC1600
  35. CALL DWORD PTR DS:[<&ntdll.RtlLeaveCriti>; ntdll.RtlLeaveCriticalSection
  36. MOV EAX,ESI
  37. POP EDI
  38. JMP SHORT ADVAPI32.77F767BE




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 13 декабря 2010 09:36
· Личное сообщение · #6

Все! Я нашел решение проблемы и ответ на вопрос:
Структура в advapi32 хранит хендлы всех рут реестра (machine, user, classes_root...). Они инициализируются еще до старта основной программы и при таком раскладе RootDirectory равен 0 при их инициализации, а ACCESS_MASK = 02000000h. Таким образом, RootDirectory для следующих вызовов опенкея это хендл уже открытых рут для веток в реестре и по смещению мы просто ссылаемся на эту структуру получаем его (это и объясняет почему в аргументах RegOpenKeyEx рут и сама ветка стоят отдельно, а не одна единая строка).
В Итоге: первым делом я самостоятельно открываю "\REGISTRY\MACHINE", а уже после по полученному хендлу HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows


 eXeL@B —› Программирование —› RootDirectory в OBJECT_ATTRIBUTES
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати