Управление редактором реестра из своего приложения
27.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Наверняка вы слышали о программе 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:
Читать статью целиком »
Просмотров: 1573 | Комментариев: 6