
Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта

Как защитить DLL от выгрузки через FreeLibrary
07.11.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Небольшой трюк, позволяющий защитить вашу DLL от выгрузки из процесса при помощи функции FreeLibrary. Например, если процесс обнаружил инжект посторонней библиотеки в свое адресное пространство и пытается от нее избавиться.Сперва немного теории. При вызове функции LoadLibrary увеличивается на единицу внутренний счетчик загрузок, но повторной загрузки библиотеки не выполняется. При вызове функции FreeLibrary, соответственно, этот счетчик уменьшается. При достижении счетчиком нулевого значения библиотека выгружается из памяти. На этом основан метод "защиты" от выгрузки, когда в самой DLL несколько раз дополнительно вызывается LoadLibrary, тем самым увеличивая счетчик загрузок. Но ведь никто не мешает вызвать FreeLibrary сто или сто тысяч раз подряд, пока счетчик не будет обнулен. Поэтому я взял слово "защита" в кавычки.
Правильным способом защититься от выгрузки DLL из целевого процесса будет использование функции GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_PIN. Функция должна вызываться из DLL. В этом случае загруженный модуль будет оставаться в памяти вплоть до завершения основного процесса, независимо от того, сколько раз будет вызвана функция FreeLibrary.
Просмотров: 364 | Комментариев: 2

Как получить список поддерживаемых кодировок
05.11.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодняшний небольшой пример кода - получение списка всех поддерживаемых кодировок в системе. Примерно такой список можно увидеть в меню сохранения в текстовых редакторах или в браузерах, когда надо выбрать кодировку страницы. Если ваше приложение умеет работать с разными кодировками, то значит должно уметь и получать их список.Начинаем с констант и структуры, которые отсутствуют в FASM.
Code (Assembler) : Убрать нумерацию
- CP_SUPPORTED = 0x00000002
- MAX_LEADBYTES = 12
- MAX_DEFAULTCHAR = 2
- struct CPINFOEX
- MaxCharSize dd ?
- DefaultChar rb MAX_DEFAULTCHAR
- LeadByte rb MAX_LEADBYTES
- UnicodeDefaultChar dw ?
- CodePage dd ?
- CodePageName rb MAX_PATH
- ends
Code (Assembler) : Убрать нумерацию
- ; Получить список поддерживаемых кодировок
- invoke EnumSystemCodePages,CodePageEnumProc,CP_SUPPORTED
Читать статью целиком »
Просмотров: 514 | Комментариев: 0

Устраняем косяки функций PathRemoveExtension и PathRenameExtension
24.10.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
В комментариях к статьям иногда проскакивают мысли, мол, зачем изобретать велосипед, если уже существуют готовые WinAPI. Ну так вот, в библиотеке shlwapi помимо кучи других полезных функций есть две функции для работы с расширениями файлов. PathRemoveExtension служит для удаления расширения из строки с путем файла, а PathRenameExtension для замены имеющегося расширения на другое. Это очень удобно в случае, когда, например, надо сгенерировать имя файла данных или файла с настройками по имени исполняемого файла. Но, к сожалению, у них есть фатальные косяки в реализации. Это проще показать на примерах. Вот удаление расширения:c:\test\file1.txt -> PathRemoveExtension -> c:\test\file1
c:\test\file2 -> PathRemoveExtension -> c:\test\file2
c:\test\.htaccess -> PathRemoveExtension -> c:\test\
c:\test\.htaccess.bak -> PathRemoveExtension -> c:\test\.htaccess
И аналогично для замены расширения, например, на ".ini":
c:\test\file1.txt -> PathRenameExtension -> c:\test\file1.ini
c:\test\file2 -> PathRenameExtension -> c:\test\file2.ini
c:\test\.htaccess -> PathRenameExtension -> c:\test\.ini
c:\test\ -> PathRenameExtension -> c:\test\.ini
c:\test\.htaccess.bak -> PathRenameExtension -> c:\test\.htaccess.ini
Как видите, если имя файла начинается с точки и при этом файл не имеет расширения, то обе функции работают неправильно. Кроме этого, функция замены расширения дает неправильный с точки зрения логики результат, если имя файла в строке вообще отсутствует.
Читать статью целиком »
Просмотров: 432 | Комментариев: 3

Как сделать перетаскиваемый курсор-прицел
21.10.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
У многих программ для работы с окнами приложений есть такая фича, как перетаскиваемый указатель-прицел, с помощью которого можно выбрать определенное окно. Когда-то у меня в комментариях спросили, как можно сделать что-то подобное. Что ж, лучше поздно, чем никогда.Начнем с теории, как это все должно работать. На форме программы сперва рисуется значок прицела, это самая обычная статическая картинка. При клике на нее активируется процесс перетаскивания. Системный курсор меняется на этот же прицел, а значок на форме скрывается. Тем самым достигается визуальный эффект, что перетаскивается именно прицел с формы. Пока кнопка мыши нажата, обрабатываются координаты курсора и выполняются нужные действия с этой информацией. При отпускании кнопки мыши курсор меняется на дефолтный системный, а на форме снова отображается картинка. Таким образом нам надо отслеживать три сообщения окна: WM_LBUTTONDOWN для нажатия левой кнопки мыши, WM_LBUTTONUP для ее отпускания и WM_MOUSEMOVE для перемещения мыши.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_LBUTTONDOWN
- je .wmsetcursor
- cmp [msg],WM_LBUTTONUP
- je .wmreleasecursor
- cmp [msg],WM_MOUSEMOVE
- je .wmmousemove
Code (Assembler) : Убрать нумерацию
- .wmsetcursor:
- ; Получить координаты события
- invoke GetMessagePos
- ; Координата Y
- mov ebx,eax
- shr ebx,16
- mov [pt.y],ebx
- ; Координата X
- mov ebx,eax
- and ebx,0FFFFh
- mov [pt.x],ebx
- ; Получить границы иконки
- invoke GetWindowRect,[hStatic],img
- ; Клик произошел в области иконки?
- invoke PtInRect,img,[pt.x],[pt.y]
- or eax,eax
- jz .processed
- ; Установить захват событий мыши
- invoke SetCapture,[hwnddlg]
- ; Загрузить наш курсор
- invoke SetCursor,[hCursor]
- ; Скрыть иконку на форме
- invoke SendMessage,[hStatic],STM_SETIMAGE,IMAGE_CURSOR,0
- mov [state],1
Читать статью целиком »
Просмотров: 819 | Комментариев: 2

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

Как отследить смену питания на ноутбуке
Дополнение к статье о получении информации об оставшемся заряде батареи ноутбука. Запрос состояния батареи по мере надобности - это хорошо, но будет гораздо правильнее, если система сама будет уведомлять наше приложение об изменении типа электропитания, а также об оставшемся заряде аккумулятора. Сегодня я расскажу, как это делается.
Читать статью целиком »
Просмотров: 550 | Комментариев: 0
