Управление редактором реестра из своего приложения
Наверняка вы слышали о программе RegJump от SysInternals, ныне принадлежащая Microsoft. При помощи этой программы вы можете открыть regedit сразу же на нужной ветке реестра. Мне стало очень интересно, как она это делает. Дизассемблер в руки, отладчик в боевую готовность и вперед!Вот что мне удалось накопать. Я оставил только самый важный код, попутно упростив и оптимизировав его. Оригинальный RegJump сперва пытается найти запущенный regedit по наименованию класса окна, если такого нет, то пытается запустить regedit из системной папки. Так или иначе, вся работа выполняется с найденным окном. У меня подразумевается, что редактор реестра уже запущен.
Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- ; Классы окон для поиска
- szClass db 'RegEdit_RegEdit',0
- szList db 'SysTreeView32',0
- ; Название ветки реестра
- szReg db '\HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\',0
Хэндл процесса необходим для синхронизации пользовательского ввода с окном приложения, поскольку все управление regedit выполняется через эмуляцию нажатий клавиш в списке. Для "своей" копии regedit, которая запущена RegJump, используется результат выполнения функции CreateProcess, для запущенного ранее экземпляра хэндл получается через пару функций GetWindowThreadProcessId и OpenProcess. Особых привилегий для этого не надо.
Code (Assembler) : Убрать нумерацию
- ; Найти окно редактора реестра
- invoke FindWindow,szClass,NULL
- or eax,eax
- jz loc_exit
- mov [hRWnd],eax
- ; Найти список в окне редактора реестра
- invoke FindWindowEx,[hRWnd],NULL,szList,NULL
- or eax,eax
- jz loc_exit
- mov [hWnd],eax
- ; Получить хэндл процесса-владельца
- invoke GetWindowThreadProcessId,[hRWnd],ProcessId
- invoke OpenProcess,PROCESS_QUERY_INFORMATION,0,[ProcessId]
- or eax,eax
- jz loc_exit
- mov [hProcess],eax
- ; Активировать окно редактора реестра
- invoke ShowWindow,[hRWnd],SW_RESTORE
- invoke SetForegroundWindow,[hRWnd]
- ; Установить фокус на список
- invoke SetFocus,[hWnd]
- invoke WaitForInputIdle,[hProcess],-1
- ; Вот тут непонятно :(
- invoke SendMessage,[hRWnd],WM_COMMAND,10288h,0
- invoke WaitForInputIdle,[hProcess],-1
- ; Перейти на верхний уровень списка
- mov ebx,30
- @@:
- invoke SendMessage,[hWnd],WM_KEYDOWN,VK_LEFT,0
- invoke WaitForInputIdle,[hProcess],-1
- sub ebx,1
- jnz @b
- ; Указатель на строку в названием ветки реестра
- mov esi,szReg
- loc_loop:
- lodsb
- or al,al
- jz loc_exit_clean
- cmp al,'\'
- jne @f
- ; Открыть ветку списка
- invoke SendMessage,[hWnd],WM_KEYDOWN,VK_RIGHT,0
- invoke WaitForInputIdle,[hProcess],-1
- jmp loc_loop
- @@:
- movzx eax,al
- ; Поиск строки в списке
- invoke SendMessage,[hWnd],WM_CHAR,eax,0
- invoke WaitForInputIdle,[hProcess],-1
- jmp loc_loop
- loc_exit_clean:
- invoke CloseHandle,[hProcess]
- loc_exit:
В приложении пример программы с исходным текстом, которая открывает в уже запущенном редакторе реестра ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion.
Просмотров: 1634 | Комментариев: 6
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
user
(28.12.2020 в 17:15):
А вообще, тема годная, респект.
Перегнал на Си и вставил функцией в CRACKER.
Для поиска в реестре своих же опций.
.. причём работает и в Win95, в том числе.
Перегнал на Си и вставил функцией в CRACKER.
Для поиска в реестре своих же опций.
.. причём работает и в Win95, в том числе.
user
(27.12.2020 в 20:08):
Вот очень нормальная программа на эту тему - Registry Studio.
1)
Оригинальная инсталляция + русификация:
old-dos.ru/dl.php?id=12987
2)
Она же проапдейченная русификацией, оформленная как RAR-SFX:
old-dos.ru/dl.php?id=12990
1)
Оригинальная инсталляция + русификация:
old-dos.ru/dl.php?id=12987
2)
Она же проапдейченная русификацией, оформленная как RAR-SFX:
old-dos.ru/dl.php?id=12990
Compiller
(12.06.2020 в 14:45):
Registry Studio (который древний от Microplanet) умел ещё и встраиваться в регедит,и визуальные закладки, и предпросмотр reg файлов, и свой формат закладок с url дляоткрытия из проводника, и мультитредовый поиск и замену
Но на новых виндах глючит :-(.
На новых виндах 10 не рисует окно и меню. На Ctrl+R (хоткей для поиска изамены) отзывается.
На Ctrl+S (тот самый поиск в несколько тредов) тоже.
Сама программа вроде как слегка расширенная надстройка над регедитом.
Вы её по моей просьбе раньше правили... За что вам большущее человеческое СПАСИБО!
В Windows 10 уже встроена своя строка адреса в регедит - она делает почтито же самое, что и старые regeditx.
Но на новых виндах глючит :-(.
На новых виндах 10 не рисует окно и меню. На Ctrl+R (хоткей для поиска изамены) отзывается.
На Ctrl+S (тот самый поиск в несколько тредов) тоже.
Сама программа вроде как слегка расширенная надстройка над регедитом.
Вы её по моей просьбе раньше правили... За что вам большущее человеческое СПАСИБО!
В Windows 10 уже встроена своя строка адреса в регедит - она делает почтито же самое, что и старые regeditx.
ManHunter
(06.06.2020 в 12:00):
Ничего удивительного, тема же интересная. Только у меня исходников не было, пришлось восстанавливать по коду.
PB
(06.06.2020 в 11:23):
Полтора года назад читал то же самое на форуме ПуреБасик.Только без истории про дизассемблер, ткпо исходник с Делфи переписали на purebasic.
Добавить комментарий
Заполните форму для добавления комментария
- - - - - - - - - - - - - - - - - - - - - - -
section '.data' data readable writeable
szExec db 'regedit.exe',0
szArgs db 0,0
szDir db '.\',0
szOpen db 'open',0
section '.code' code readable executable
start:
invoke ShellExecuteA, NULL, szOpen,\
szExec, szArgs, szDir, SW_SHOWNORMAL
invoke Sleep, 2FFh
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
И тогда пример будет ещё и запускать regedit.exe самостоятельно