Blog. Just Blog

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

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

Меню с иконками на Ассемблере

07.11.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем кастомизацию такого элемента интерфейса, как выпадающее меню. Без меню обходится мало какое современное приложение, но вот работа с меню стандартными средствами обычно ограничивается установкой флага чекбокса, затенением неактивных пунктов или отрисовкой субменю. Попытка разнообразить меню, например, своими иконками, приводит к очень печальному результату. Ситуацию особо не спасают ни собственные битмапы, ни подгрузка изображений из списка ImageList. Очень странно, что на протяжении многих лет разработчики Windows так и не сделали инструментов "из коробки", чтобы можно было легко и комфортно работать с менюшками. К счастью, в системе есть "потайной ход", с помощью которого можно кастомизировать меню так, как вам захочется. Для своих проектов я постарался сделать как можно более универсальный инструмент для работы с меню и сейчас я с вами им поделюсь.

Начнем создание собственных элементов интерфейса с того, что для каждого настраиваемого меню резервируется структура с данными следующего формата:
  1. struct MYMENU
  2.   hMenu      dd ?
  3.   itemWidth  dd ?
  4.   itemHeight dd ?
  5.   hasIcons   db ?
  6. ends
В это же время, все меню, которые требуют кастомизации, формируют массив структур и указателей на них. Список заканчивается нулевым DWORD'ом:
  1. menus   dd Menu1
  2.         dd Menu2
  3.         dd ?
  4.  
  5. Menu1   MYMENU
  6. Menu2   MYMENU
Описание полей структуры: hMenu - хэндл меню, itemWidth - ширина пункта меню в пикселах, itemHeight - высота пункта меню в пикселах, hasIcons - флаг, определяющий, будут или нет использоваться в меню иконки (1 - да, 0 - нет). Если иконки будут использоваться, то слева от текста пунктов меню резервируется место для них, в противном случае текст пункта будет отрисовываться прямо от края меню.

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

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

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", а при отсутствии запущенного штатного шелла это гарантированно приведет к неверным результатам.

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

Как узнать дату создания или модификации ключа реестра

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

Как узнать дату создания или модификации ключа реестра

Еще одна несложная, но полезная задача: как узнать дату создания или модификации ключа реестра? Например, некоторые программы для очистки реестра от всякого мусора показывают эту информацию. Еще ее можно посмотреть, если экспортировать через regedit ветку реестра в формате текстового файла (*.txt). А вот как получить эту информацию из своего приложения, я вам сейчас расскажу.

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

Контроль запуска процессов на Ассемблере

29.08.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем интересную задачу: надо отслеживать запуск приложений в системе и, в случае необходимости, выборочно блокировать их запуск. Решения могут быть различные, я предлагаю вот такой способ. Он заключается в том, что в цепочку AppCertDlls встраивается наша собственная библиотека-обработчик. При первом и любом последующем вызове функции CreateProcess обработчику будет передан полный путь до запускаемого файла.

Такой способ перехвата используется еще со времен Windows 2000, но подробно не документирован до сих пор. Ничего удивительного, что "коробочный" FASM совершенно не в курсе используемых в нем данных. Сперва немного констант:
  1. ; Флаги запроса
  2. APPCERT_IMAGE_OK_TO_RUN  = 1
  3. APPCERT_CREATION_ALLOWED = 2
  4. APPCERT_CREATION_DENIED  = 3
  5.  
  6. ; Флаги результата
  7. STATUS_SUCCESS      = 0x00000000
  8. STATUS_UNSUCCESSFUL = 0xC0000001
Переходим к созданию основного модуля. В экспорте вашей dll обязательно должна быть функция CreateProcessNotify которая и отвечает за обработку запуска процесса. У нее два параметра: lpApplicationName - указатель на строку имени файла запускаемого процесса и Reason - флаг запроса. Если с именем файла все более-менее понятно, то по флагу запроса надо внести ясность. Этот флаг может принимать одно из трех возможных значений. APPCERT_IMAGE_OK_TO_RUN - система опрашивает вашу библиотеку на предмет того, доверяете вы указанному процессу или нет. Такое бывает, если ваш обработчик первый или единственный. Если запускаемая программа вас устраивает, то верните STATUS_SUCCESS, в противном случае установите флаг результата в STATUS_UNSUCCESSFUL. Варианты запроса APPCERT_CREATION_ALLOWED или APPCERT_CREATION_DENIED поступают в том случае, если в системе уже установлены обработчики запуска приложений, какой-то из них уже проверил запускаемый файл и принял решение, можно его запускать или нет. Если передаваемый функции флаг имеет значение APPCERT_CREATION_ALLOWED, то процесс с этим именем может быть создан, а если APPCERT_CREATION_DENIED, то, соответственно, нет.

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

Интерпретатор Brainfuck на Ассемблере

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

Интерпретатор Brainfuck на Ассемблере

Если вы увлекаетесь программированием, то скорее всего слышали об эзотерическом языке программирования Brainfuck. Дословно его название переводится на русский язык как "мозгоёбка", но в приличном обществе его обычно сглаживают до "вынос мозга". Язык имеет всего восемь команд, каждая из которых записывается одним символом. В полном соответствии с названием, программы на Brainfuck трудно не только читать, но и писать, поскольку они представляют собой последовательность символов-команд без какого-либо дополнительного синтаксиса. Несмотря на это, Brainfuck является полноценной машиной Тьюринга, и поэтому может выполнять любые вычислительные задачи. Ветераны реверса наверняка помнят KeygenMe от легендарного Ms-Rem, в котором алгоритм проверки ключа был спрятан внутри виртуальной машины на Brainfuck.

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

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