Blog. Just Blog

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

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

Продвинутая работа с буфером обмена на Ассемблере

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

Продвинутая работа с буфером обмена на Ассемблере

Еще одна статья, посвященная работе с буфером обмена. Обычно для этого используются функции GetClipboardData и SetClipboardData, но сегодня мы будем осваивать новый уровень - чтение и запись различных данных в буфер обмена при помощи OLE-функций. Хорошая практика для закрепления навыков работы с объектами.

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

M/o/Vfuscator. Ночной кошмар реверсера

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

M/o/Vfuscator. Ночной кошмар реверсера

Когда-то давно наткнулся на интересный проект - M/o/Vfuscator от Chris Domas. Его необычность заключается в том, что все ассемблерные команды в исходнике преобразуются в набор команд MOV (и только их!!!), которые в результате выполняют то же самое действие, что и заменяемая команда. Никаких проверок, никаких условных переходов, никаких ветвлений алгоритма, вообще ничего, кроме сотен и тысяч последовательных инструкций MOV. Понятное дело, что размеры исходника и готовой программы распухают на порядки, но кого это в наше время волнует. Похоже на магию?

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

Обработка Drag'n'Drop в разные поля ввода

28.03.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
В статье об обработке перетаскивания файлов я упомянул про раздельную обработку перетаскивания файлов в разные поля. В частности про вариант с субклассированием. Теперь расскажу, как это делается. Предположим, что у нас на форме есть три поля для выбора файла, причем каждое должно работать независимо.
  1.         ; Разрешить каждому полю принимать файлы
  2.         invoke  GetDlgItem,[hwnddlg],ID_FILE1
  3.         mov     ebx,eax
  4.         invoke  DragAcceptFiles,ebx,TRUE
  5.         ; Установить наш собственный обработчик
  6.         invoke  SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
  7.         ; Сохранить хэндл предыдущего обработчика
  8.         invoke  SetWindowLong,ebx,GWL_USERDATA,eax
  9.  
  10.         invoke  GetDlgItem,[hwnddlg],ID_FILE2
  11.         mov     ebx,eax
  12.         invoke  DragAcceptFiles,ebx,TRUE
  13.         ; Установить наш собственный обработчик
  14.         invoke  SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
  15.         ; Сохранить хэндл предыдущего обработчика
  16.         invoke  SetWindowLong,ebx,GWL_USERDATA,eax
  17.  
  18.         invoke  GetDlgItem,[hwnddlg],ID_FILE3
  19.         mov     ebx,eax
  20.         invoke  DragAcceptFiles,ebx,TRUE
  21.         ; Установить наш собственный обработчик
  22.         invoke  SetWindowLong,ebx,GWL_WNDPROC,EditWindowProc
  23.         ; Сохранить хэндл предыдущего обработчика
  24.         invoke  SetWindowLong,ebx,GWL_USERDATA,eax
На этапе инициализации окна надо при помощи функции DragAcceptFiles разрешить каждому полю ввода принимать файлы, а затем субклассировать их, чтобы обрабатывать сам момент броска.

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

Получение длительности MP3-файлов на Ассемблере

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

Получение длительности MP3-файлов на Ассемблере

Вот и анонсированная ранее "другая история" про некорректное определение длительности MP3-файлов при использовании системных функций. При тестировании своих программ я нашел уже несколько таких файлов. Что интересно, на ошибочный результат размер файлов не влияет, это, как мне кажется, происходит из-за очень упрощенного расчета, который используется системой. Расчехляем Ассемблер, будем парсить внутреннюю структуру MP3 самостоятельно.

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

Создание пользовательского MessageBox с помощью SoftModalMessageBox

14.03.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я уже рассказывал, каким образом можно кастомизировать стандартный MessageBox при помощи хуков, в частности, менять надписи на кнопках. Сегодня разберем создание MessageBox с помощью недокументированной функции SoftModalMessageBox. В качестве единственного параметра она принимает указатель на структуру MSGBOXDATA, которая тоже относится к недокументированным:
  1. struct MSGBOXDATA
  2.         params         MSGBOXPARAMS
  3.         pwndOwner      dd ?  ; Хэндл окна-владельца
  4.         wLanguageId    dd ?  ; Идентификатор языка
  5.         pidButton      dd ?  ; Массив с идентификаторами кнопок
  6.         ppszButtonText dd ?  ; Массив с указателями на строки текста
  7.         cButtons       dd ?  ; Количество кнопок в окне
  8.         DefButton      dd ?  ; Кнопка по умолчанию
  9.         CancelId       dd ?  ; Идентификатор кнопки отмены
  10.         Timeout        dd ?  ; Таймаут окна
  11.         Unknown        rd 5  ; Зарезервировано
  12. ends
Давайте подробно разберем ее поля, так как никаких нормальных описаний в рунете я не нашел, пришлось собирать информацию по крупицам. Первый параметр - документированная структура MSGBOXPARAMS, в ней можно настроить, например, пользовательскую иконку, которая будет отображаться в MessageBox. Подробное описание структуры есть в MSDN, дублировать его не буду. Поля pwndOwner и wLanguageId сложности не представляют, это хэндл окна-владельца и идентификатор языка, на котором будет выведен текст в окне сообщения. Поле pidButton - указатель на массив DWORD'ов, которые являются идентификаторами кнопок в создаваемом окне. Важное замечание. Идентификаторы кнопок должны быть строго одним из стандартных значений, возвращаемых обычной функцией MessageBox. Любое другое значение будет проигнорировано, а соответствующая кнопка при нажатии не будет ничего делать. В поле ppszButtonText записывается указатель на массив указателей на юникодные строки, которые будут использоваться в качестве надписей на кнопках. Размер кнопок под длину надписей не подгоняется, берется максимальный системный размер кнопки для текущей локали, так что без фанатизма. cButtons - количество кнопок в окне. Этому количеству должно соответствовать количество элементов в массиве идентификаторов и в массиве указателей на названия. DefButton - кнопка по умолчанию, нумерация кнопок начинается с 0. В поле CancelId по задумке должен быть идентификатор, отвечающий за кнопку отмены, но по факту это поле игнорируется. Нулевое значение деактивирует крестик закрытия в заголовке окна сообщения. Timeout задает интервал, после которого окно автоматически закроется, об этом я рассказывал в одной из предыдущих статей.

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

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