Blog. Just Blog

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

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

Отслеживание загрузки dll в память процесса

13.05.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я уже рассказывал, как можно легко и просто получить список динамических библиотек, загруженных в ваш процесс. Сегодня расскажу о возможности отслеживания загрузки и выгрузки DLL. Начиная с Windows Vista, появилась функция LdrRegisterDllNotification. С ее помощью в приложении регистрируется callback-функция, которая будет вызываться каждый раз, как только в ваше приложение будет загружена DLL или какая-то DLL будет выгружена из его адресного пространства. Установка обработчика выполняется одной командой:
  1.         ; Зарегистрировать обработчик загрузки и выгрузки DLL
  2.         invoke  LdrRegisterDllNotification,0,LdrDllNotification,NULL,Cookie
  3.         or      eax,eax
  4.         jnz     loc_error
Важное замечание. Как показала практика, в callback-функции не должно быть никаких открытий окон, вывода сообщений и прочих взаимодействий с интерфейсом. Это может привести к зацикливанию и падению приложения во время загрузки UI-библиотек.
  1. LDR_DLL_NOTIFICATION_REASON_LOADED   = 1
  2. LDR_DLL_NOTIFICATION_REASON_UNLOADED = 2
  3.  
  4. struct NOTIFICATION_DATA
  5.     Flags       dd ?
  6.     FullDllName dd ?
  7.     BaseDllName dd ?
  8.     DllBase     dd ?
  9.     SizeOfImage dd ?
  10. ends
  11.  
  12. proc LdrDllNotification NotificationReason:DWORD,\
  13.         NotificationData:DWORD,Context:DWORD
  14.  
  15.         pusha
  16.         mov     eax,[NotificationReason]
  17.         ; EAX -> действие с DLL
  18.         ; LDR_DLL_NOTIFICATION_REASON_LOADED = загружена
  19.         ; LDR_DLL_NOTIFICATION_REASON_UNLOADED = выгружена
  20.  
  21.         ; Получить полный путь до файла DLL
  22.         mov     eax,[NotificationData]
  23.         mov     eax,[eax+NOTIFICATION_DATA.FullDllName]
  24.         mov     eax,[eax+4]
  25.         ; EAX -> полное имя файла DLL
  26.  
  27.         ; Получить базовый адрес DLL
  28.         mov     eax,[NotificationData]
  29.         mov     eax,[eax+NOTIFICATION_DATA.DllBase]
  30.         ; EAX -> DllBase библиотеки
  31.  
  32.         popa
  33.         ret
  34. endp
При каждом вызове в callback-функцию передается причина вызова - загрузка или выгрузка DLL, а также заполненная структура NOTIFICATION_DATA, в которой содержится полный путь и имя файла библиотеки, базовый адрес загрузки и размер загружаемого образа. Зная эти данные, можно проверить, что за DLL пытаются подгрузить в наш процесс и принять соответствующие меры. Например, при попытке подгрузить в процесс модуль мониторинга, можно отключить некоторые ветки алгоритма или исказить выдаваемые данные, а можно просто завершить работу приложения. Если пойти дальше, то теоретически можно даже модифицировать в памяти загруженную библиотеку, нейтрализовав в ней то, чего она не должна делать с вашим процессом. Просторы для фантазии безграничны.

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

Перезапуск приложения в случае его аварийного завершения

23.03.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Перезапуск приложения в случае его аварийного завершения

Небольшое дополнение к статье про обработку критических ошибок. Обработать возникшую ошибку, сохранить в лог состояние регистров на момент падения, уведомить пользователя о произошедшем - это хорошо и правильно. Но в Windows есть еще один интересный механизм обработки критических ошибок. Речь идет об автоматическом перезапуске приложения в случае возникновения нештатной ситуации типа необрабатываемого исключения или безответного зависания.

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

Как узнать, что приложение запущено через ярлык

29.11.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная развлекушка на Ассемблере. Давайте узнаем, была ли наша программа запущена через .lnk-файл, то есть через ярлык, или же напрямую через Проводник, файловый менеджер или другой процесс. Для этого надо получить структуру STARTUPINFO, а затем проверить, установлен ли флаг STARTF_TITLEISLINKNAME в поле dwFlags.
  1.         STARTF_TITLEISLINKNAME = 0x800
  2.  
  3.         ; Получить информацию запуска
  4.         mov     [sinfo.cb],sizeof.STARTUPINFO
  5.         invoke  GetStartupInfo,sinfo
  6.  
  7.         ; Флаг установлен?
  8.         test    [sinfo.dwFlags],STARTF_TITLEISLINKNAME
  9.         jz      @f
  10.         ; Да, запуск выполнен через ярлык
  11.         ...
  12. @@:
  13.         ; Нет, прямой запуск
  14.         ...
Ранее этот флаг относился к недокументированным, сейчас в MSDN появилось его нормальное описание. Итак, если флаг STARTF_TITLEISLINKNAME установлен, то программа была запущена через ярлык, а в параметре lpTitle структуры STARTUPINFO содержится указатель на строку с полным путем к .lnk-файлу, через который был произведен запуск.

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

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

27.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

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

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

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

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

23.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

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

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

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0023 сек.) / Память: 4.5 Mb
Наверх