Blog. Just Blog

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

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

Как защитить DLL от выгрузки через FreeLibrary

07.11.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Небольшой трюк, позволяющий защитить вашу DLL от выгрузки из процесса при помощи функции FreeLibrary. Например, если процесс обнаружил инжект посторонней библиотеки в свое адресное пространство и пытается от нее избавиться.

Сперва немного теории. При вызове функции LoadLibrary увеличивается на единицу внутренний счетчик загрузок, но повторной загрузки библиотеки не выполняется. При вызове функции FreeLibrary, соответственно, этот счетчик уменьшается. При достижении счетчиком нулевого значения библиотека выгружается из памяти. На этом основан метод "защиты" от выгрузки, когда в самой DLL несколько раз дополнительно вызывается LoadLibrary, тем самым увеличивая счетчик загрузок. Но ведь никто не мешает вызвать FreeLibrary сто или сто тысяч раз подряд, пока счетчик не будет обнулен. Поэтому я взял слово "защита" в кавычки.

Правильным способом защититься от выгрузки DLL из целевого процесса будет использование функции GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_PIN. Функция должна вызываться из DLL. В этом случае загруженный модуль будет оставаться в памяти вплоть до завершения основного процесса, независимо от того, сколько раз будет вызвана функция FreeLibrary.

Просмотров: 332 | Комментариев: 2

Hotkey Helper 1.4

26.10.2023 | Категория: Мои программы | Автор: ManHunter

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

Небольшая программа-помощник для программистов. Показывает коды нажатых клавиш, значения параметров wParam и lParam сообщений WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_UNICHAR, WM_APPCOMMAND (мультимедийные клавиши), WM_DEADCHAR и WM_SYSDEADCHAR (умляуты, акуты, ударения и подобные модификаторы), результаты работы функций GetKeyState и GetAsyncKeyState с переключателями *Lock и клавишами-модификаторами, а также коды горячих клавиш из поля msctls_hotkey32, "сырой" ввод с клавиатуры и информацию о физических устройствах ввода. Предусмотрен режим работы с юникодом и ANSI. Программа написана для личных нужд, но может быть пригодится кому-нибудь еще.

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

Как отследить смену питания на ноутбуке

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

Как отследить смену питания на ноутбуке

Дополнение к статье о получении информации об оставшемся заряде батареи ноутбука. Запрос состояния батареи по мере надобности - это хорошо, но будет гораздо правильнее, если система сама будет уведомлять наше приложение об изменении типа электропитания, а также об оставшемся заряде аккумулятора. Сегодня я расскажу, как это делается.

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

Tesseract OCR - система распознавания текста

30.09.2023 | Категория: Software | Автор: ManHunter

Tesseract OCR - система распознавания текста

Вряд ли кто-то поспорит, что самой продвинутой системой распознавания текста в настоящее время является ABBYY FineReader. Я сам его постоянно использую при подготовке статей для сайта. Но вот возникла задача по распознаванию определенных текстов на большом количестве изображений (что-то типа схем или чертежей). Естественно, все должно делаться в автоматическом режиме, а результат был нужен уже вчера. Поискав возможные варианты решений, я остановился на Tesseract OCR. Это библиотека для распознавания текста с открытым исходным кодом, кроссплатформенная, с поддержкой юникода и более 100 языков "из коробки".

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

Отслеживание изменения метки тома

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

Сперва небольшое количество данных для работы, которые отсутствуют в инклудах FASM.
  1. struct SHChangeNotifyEntry
  2.         pidl       dd ?
  3.         fRecursive dd ?
  4. ends
  5.  
  6. SHCNRF_ShellLevel  = 0x0002
  7. SFGAO_FILESYSTEM   = 0x40000000
  8. SHCNE_RENAMEFOLDER = 0x00020000
Первым делом преобразуем имя отслеживаемого файла, диска или каталога в объект, для этого вызовем функцию SHParseDisplayName. После этого надо заполнить массив отслеживаемых объектов. У нас только один объект - диск C:\, но можно добавить любое их количество.
  1.         ; Настроить отслеживаемый объект
  2.         invoke  SHParseDisplayName,szWatch,NULL,\
  3.                 pidl,SFGAO_FILESYSTEM,NULL
  4.  
  5.         ; Заполнить массив отслеживаемых объектов
  6.         mov     eax,[pidl]
  7.         mov     [shentry.pidl],eax
  8.         mov     [shentry.fRecursive],FALSE
  9.  
  10.         ; Зарегистрировать обработчик уведомлений
  11.         invoke  SHChangeNotifyRegister,\
  12.                 [hwnddlg],\
  13.                 SHCNRF_ShellLevel,\
  14.                 SHCNE_RENAMEFOLDER,\
  15.                 WM_LABEL_CHANGED,\
  16.                 1,\
  17.                 shentry
  18.         mov     [cookie],eax
  19.  
  20.         ; Освободить неиспользуемую память
  21.         invoke  CoTaskMemFree,[pidl]
Так как мы отслеживаем изменение метки тома, а метка тома по сути является разновидностью каталога, то нам достаточно типа уведомления SHCNE_RENAMEFOLDER. Но никто не мешает скомбинировать типы уведомлений для отслеживания или вообще подписаться на все подряд, указав флаг SHCNE_ALLEVENTS.

Код WM_LABEL_CHANGED - это пользовательское сообщение окну приложения, его можно описать, например, как WM_LABEL_CHANGED = WM_USER + 200. При поступлении уведомления от системы именно это сообщение будет отправлено целевому окну обработчика. В параметре lParam находится код события, что очень полезно, когда приложение подписано сразу на несколько событий.

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

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