Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Управление редактором реестра из своего приложения

27.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Наверняка вы слышали о программе RegJump от SysInternals, ныне принадлежащая Microsoft. При помощи этой программы вы можете открыть regedit сразу же на нужной ветке реестра. Мне стало очень интересно, как она это делает. Дизассемблер в руки, отладчик в боевую готовность и вперед!

Вот что мне удалось накопать. Я оставил только самый важный код, попутно упростив и оптимизировав его. Оригинальный RegJump сперва пытается найти запущенный regedit по наименованию класса окна, если такого нет, то пытается запустить regedit из системной папки. Так или иначе, вся работа выполняется с найденным окном. У меня подразумевается, что редактор реестра уже запущен.
  1. section '.data' data readable writeable
  2.  
  3. ; Классы окон для поиска
  4. szClass db 'RegEdit_RegEdit',0
  5. szList  db 'SysTreeView32',0
  6. ; Название ветки реестра
  7. szReg   db '\HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\',0
Наименование ветки реестра, куда надо перейти, переводится в верхний регистр, а в начало и конец строки прицепляется символ "\". Традиционные сокращения типа "HKLM" разворачиваются в полноценные наименования веток реестра "HKEY_LOCAL_MACHINE" и т.п. Я надеюсь, с подобным преобразованием строки у вас проблем возникнуть не должно. У меня строка сразу приведена в должный вид.

Хэндл процесса необходим для синхронизации пользовательского ввода с окном приложения, поскольку все управление regedit выполняется через эмуляцию нажатий клавиш в списке. Для "своей" копии regedit, которая запущена RegJump, используется результат выполнения функции CreateProcess, для запущенного ранее экземпляра хэндл получается через пару функций GetWindowThreadProcessId и OpenProcess. Особых привилегий для этого не надо.
  1.         ; Найти окно редактора реестра
  2.         invoke  FindWindow,szClass,NULL
  3.         or      eax,eax
  4.         jz      loc_exit
  5.         mov     [hRWnd],eax
  6.  
  7.         ; Найти список в окне редактора реестра
  8.         invoke  FindWindowEx,[hRWnd],NULL,szList,NULL
  9.         or      eax,eax
  10.         jz      loc_exit
  11.         mov     [hWnd],eax
  12.  
  13.         ; Получить хэндл процесса-владельца
  14.         invoke  GetWindowThreadProcessId,[hRWnd],ProcessId
  15.         invoke  OpenProcess,PROCESS_QUERY_INFORMATION,0,[ProcessId]
  16.         or      eax,eax
  17.         jz      loc_exit
  18.         mov     [hProcess],eax
  19.  
  20.         ; Активировать окно редактора реестра
  21.         invoke  ShowWindow,[hRWnd],SW_RESTORE
  22.         invoke  SetForegroundWindow,[hRWnd]
  23.         ; Установить фокус на список
  24.         invoke  SetFocus,[hWnd]
  25.         invoke  WaitForInputIdle,[hProcess],-1
  26.  
  27.         ; Вот тут непонятно :(
  28.         invoke  SendMessage,[hRWnd],WM_COMMAND,10288h,0
  29.         invoke  WaitForInputIdle,[hProcess],-1
  30.  
  31.         ; Перейти на верхний уровень списка
  32.         mov     ebx,30
  33. @@:
  34.         invoke  SendMessage,[hWnd],WM_KEYDOWN,VK_LEFT,0
  35.         invoke  WaitForInputIdle,[hProcess],-1
  36.         sub     ebx,1
  37.         jnz     @b
  38.  
  39.         ; Указатель на строку в названием ветки реестра
  40.         mov     esi,szReg
  41. loc_loop:
  42.         lodsb
  43.         or      al,al
  44.         jz      loc_exit_clean
  45.  
  46.         cmp     al,'\'
  47.         jne     @f
  48.         ; Открыть ветку списка
  49.         invoke  SendMessage,[hWnd],WM_KEYDOWN,VK_RIGHT,0
  50.         invoke  WaitForInputIdle,[hProcess],-1
  51.         jmp     loc_loop
  52. @@:
  53.         movzx   eax,al
  54.         ; Поиск строки в списке
  55.         invoke  SendMessage,[hWnd],WM_CHAR,eax,0
  56.         invoke  WaitForInputIdle,[hProcess],-1
  57.         jmp     loc_loop
  58. loc_exit_clean:
  59.         invoke  CloseHandle,[hProcess]
  60.  
  61. loc_exit:
Когда все нужные окна найдены и хэндл процесса получен, начинается эмуляция нажатий клавиш. Сперва выполняется переход на самый верхний уровень списка. Судя по коду, Марк Руссинович предположил, что глубже 30-го уровня списка зайти невозможно, что ж, ему виднее. Затем начинается обработка строки с нужным названием ветки реестра. Строка обрабатывается посимвольно, когда встретится символ "\", то эмулируется нажатие стрелки вправо для открытия нужного уровня списка и перехода на него. Именно для этого исходная строка дополняется в начале и в конце этим символом. Строковые символы из строки передаются в поиск, тем самым определяя следующий уровень списка. Как видите, никаких ракетных технологий, но лично мне было очень интересно посмотреть на решение этой задачи от одного из признанных знатоков внутренностей Windows.

Читать статью целиком »
Просмотров: 386 | Комментариев: 3

Запуск ограниченного количества копий программы

23.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
В комментариях к статье о запрете запуска нескольких копий программы пару лет назад был задан очень правильный вопрос: как реализовать запуск ограниченного числа копий программы больше одного? Сейчас я могу ответить на этот вопрос полноценной статьей. Настоятельно рекомендую сперва прочитать изначальную статью, чтобы не дублировать здесь теоретические выкладки. Для наглядности почти все методы остаются прежними, меняться будут только условия их использования.

Первый способ использует shared-память, общую для всех копий данного приложения. В ней находится счетчик, который каждая копия увеличивает на 1 при запуске и уменьшает на 1 при завершении своей работы. При старте выполняется проверка на количество ранее запущенных копий. Счетчик достиг максимального значения - пожалуйте на выход.
  1. ; Расшаренная секция, общая для всех копий данного приложения
  2. section '.shared' data readable writeable shareable
  3. started  dd  0       ; Количество запущенных копий
  4.  
  5. ; Сегмент кода
  6. section '.code' code readable executable 
  7.         cmp     [started],3     ; Уже запущено три экземпляра программы?
  8.         jae     already_started ; Да, на выход
  9.  
  10.         ; +1 к счетчику копий
  11.         ; Префикс LOCK используется для предотвращения возможных конфликтов
  12.         ; на многопроцессорных машинах
  13.         lock add [started],1
  14.  
  15.         ; Нормальный запуск программы 
  16.         ... 
  17.         ...
  18.         ...
  19.         ; -1 от счетчика копий
  20.         lock sub [started],1
  21.         jmp     loc_exit
  22.  
  23. already_started:
  24.         ; Выход из программы
  25.         ...
  26. loc_exit:
Обратите внимание на использование префикса LOCK перед командами изменения счетчика копий. Этот префикс предназначен для обеспечения исключительного доступа к ячейке памяти на время выполнения команды при работе на многопроцессорных многозадачных системах. В отличие от проверки единственной копии, у такого варианта решения есть большой недостаток. Если приложение завершится аварийно или будет принудительно завершено системой, то счетчик работающих копий не уменьшится. Обойти это можно, если, например, в общей памяти хранить не просто счетчик, а массив идентификаторов процессов, при каждом запуске проверяя их наличие и актуальность.

Читать статью целиком »
Просмотров: 395 | Комментариев: 3

Исследование защиты программы TaskmgrPro

13.01.2020 | Категория: Темная сторона Силы | Автор: ManHunter

Скриншот программы TaskmgrPro

TaskmgrPro - плагин для стандартного Диспетчера задач Windows, значительно расширяющий его возможности. К списку стандартных вкладок Диспетчера добавляются функции работы с автозагрузкой, расшаренными ресурсами, соединениями TCP/IP, а также групповой запуск и остановка процессов и служб по заранее сформированным спискам. За самую минимальную лицензию требуется выложить почти тридцатку баксов. Делать мы этого, конечно, не будем, а сделаем что-нибудь другое, менее затратное по финансам.

Читать статью целиком »
Просмотров: 753 | Комментариев: 1

Исследование защиты программы Process Master

02.12.2018 | Категория: Темная сторона Силы | Автор: ManHunter

Скриншот программы Process Master

Программа Process Master - менеджер процессов с возможностью принудительного завершения выбранных процессов и якобы даже способный обнаруживать руткиты. Ну и все, вроде как. И за все это грандиозное разнообразие функций, которое студенты-первокурсники пишут в качестве лабораторных работ, аффтар требовал быренько метнуться в кассу на предмет выкладывания своих кровных. К счастью, проект прекратил свое развитие практически сразу после начала, оффсайт сдох, так что нам остается только попрактиковаться в реверсивной некромантии. Ну а что, почему бы и нет?

Читать статью целиком »
Просмотров: 1006 | Комментариев: 3

Ассемблер: получаем имя файла оболочки

27.09.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
В этой статье я расскажу, как можно программно получить имя файла оболочки Windows. Зачем это нужно? Например, есть программа, которая инжектит свою библиотеку в работающую копию explorer.exe и при этом подразумевает, что такой процесс в системе гарантированно должен присутствовать. В подавляющем большинстве случаев действительно все работает, никаких нареканий нет. Но стоит запустить программу под альтернативным шеллом, например, Aston Desktop, и она неизбежно падает с ошибкой, потому что explorer.exe в системе вообще не запущен. Проверки на соответствие оболочки в программе нет, и вместо корректного информирования пользователя о причинах невозможности запуска мы получаем фатальное падение. И хорошо, если не вместе с системой.

Чтобы найти процесс оболочки, сперва надо определить ее главное окно. В MSDN для этого рекомендуют воспользоваться следующим кодом:
  1.         ; Найти окно с классом "Progman"
  2.         invoke  FindWindow, szClass, NULL
  3.         ...
  4. szClass db 'Progman',0
Недостатки такого способа, надеюсь, очевидны. Ничто не мешает любому приложению создать окно с классом "Progman", а при отсутствии запущенного штатного шелла это гарантированно приведет к неверным результатам.

Читать статью целиком »
Просмотров: 1460 | Комментариев: 3

prev 01 02 03 04
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2020
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.0447 сек.) / Память: 4.75 Mb
Наверх