Быстрый поиск
Введите фрагмент названия статьи для поиска
Мульти-плагин для PEiD, DiE, Bit Detector, SCANiT, ExeScan, FastScanner и PE Tools
10.01.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Практически все современные анализаторы исполняемых файлов поддерживают внешние модули (плагины), значительно расширяющие их функционал. Это могут быть утилиты для извлечения ресурсов, узкоспециализированные анализаторы протекторов, распаковщики, редакторы исполняемых файлов и множество других модулей. Все хорошо и здорово, если бы не одно "но". Анализаторы чаще всего не совместимы по своим функциям взаимодействия с плагинами. Для решения этой проблемы некоторые авторы начали делать мульти-плагины, которые могут работать с несколькими типами анализаторов. Если мне не изменяет память, то первым таким плагином стал модуль определения точной версии ASProtect под названием VerA от известного реверсера PE_Kill. Он одинаково хорошо работал в PEiD и DiE. Я решил пойти дальше и сделать мульти-плагин, который поддерживает шесть различных анализаторов, а именно PEiD, DiE, Bit Detector, SCANiT, ExeScan и FastScanner, а также подходит для программы PE Tools. Остальные анализаторы исполняемых файлов и подавляющее большинство утилит для реверса, поддерживающие внешние модули, "заточены" на формат плагинов от PEiD, поэтому я их в этом списке даже не упоминаю.Начнем с формата плагинов для PEiD. Тут используются две функции - LoadDll и DoMyJob. Первая используется для получения имени плагина, вторая - непосредственно для работы плагина с загруженным файлом. С LoadDll ничего сложного:
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; PEiD - запрос имени плагина
- ;-----------------------------------------------------------
- proc LoadDll
- ; Вернуть в регистре EAX указатель на строку названия
- mov eax,plugName
- ret
- endp
Читать статью целиком »
Просмотров: 6952 | Комментариев: 8
Как менять цвета элементов диалогового окна на Ассемблере
03.12.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
По умолчанию цвета диалоговых окон и элементов управления в приложениях соответствуют установленной палитре Windows. Но иногда бывает необходимо выделить другим цветом какой-нибудь текст в диалоговом окне, или же вообще раскрасить все окно в нужный вам цвет. Это сделать очень легко, надо лишь знать порядок вывода на экран диалоговых окон и их содержимого. При отрисовке каждого элемента диалогового окна ему обязательно передается одно из следующих сообщений: WM_CTLCOLORDLG - отрисовка самого окна, WM_CTLCOLORBTN - отрисовка кнопок, WM_CTLCOLOREDIT - отрисовка полей редактирования, WM_CTLCOLORSTATIC - отрисовка статических элементов, WM_CTLCOLORLISTBOX - отрисовка комбобоксов и выпадающих списков, WM_CTLCOLORMSGBOX - вывод окна сообщений и WM_CTLCOLORSCROLLBAR - отрисовка полосы прокрутки. Обработчик для всех этих сообщений может быть один. Главное, чтобы на этапе инициализации окна был создан объект "кисть" с фоновым цветом главного окна. Именно это значение должен всегда возвращать обработчик сообщение изменения цвета. Предварительный каркас такого приложения выглядит примерно так:Code (Assembler) : Убрать нумерацию
- ; Обработчик диалогового окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ...
- ; Обработка сообщения инициализации окна
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- ; Обработка всех сообщений, связанных с установкой цвета
- cmp [msg],WM_CTLCOLORDLG
- je color
- cmp [msg],WM_CTLCOLORBTN
- je color
- cmp [msg],WM_CTLCOLOREDIT
- je color
- cmp [msg],WM_CTLCOLORSTATIC
- je color
- cmp [msg],WM_CTLCOLORLISTBOX
- je color
- cmp [msg],WM_CTLCOLORMSGBOX
- je color
- cmp [msg],WM_CTLCOLORSCROLLBAR
- je color
- ...
- ; Обработка инициализации окна
- wminitdialog:
- ; Основной цвет фона окна в формате RGB
- clrMain = 0012FFFFh
- ; Создать объект фоновой кисти для всего окна
- invoke CreateSolidBrush,clrMain
- mov [hBrushBack], eax
- jmp processed
Читать статью целиком »
Просмотров: 13475 | Комментариев: 12
Вертикальный скроллер на Ассемблере
04.10.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
Я уже ранее приводил код горизонтального скроллера на Ассемблере, теперь пришло время вертикального скроллера. Такой эффект очень часто используется в различных кейгенах, окнах "О программе", демо-роликах, просмотрщиках текстовых файлов и подобных программах. Код основан на аналогичной процедуре от Av0id, я добавил в него несколько усовершенствований. Для настройки размеров и внешнего вида скроллера в сегменте данных определяются вспомогательные константы и структуры, не описанные в FASM:Code (Assembler) : Убрать нумерацию
- ; Настройки внешнего вида скроллера
- SCROLL_FONT_WIDTH = 8 ; Ширина символов текста
- SCROLL_FONT_HEIGHT = 8 ; Высота символов текста
- SCROLL_WIDTH = 430 ; Ширина окна скроллера
- SCROLL_HEIGHT = 350 ; Высота окна скроллера
- SCROLL_BACKCOLOR = 0808080h ; Цвет фона
- SCROLL_TEXTCOLOR = 000FFFFh ; Цвет текста
- SCROLL_SHADOWCOLOR = 0 ; Цвет тени
- SCROLL_SLEEP = 40 ; Скорость скроллирования
- SCROLL_SHADOW = FALSE ; Рисовать тень TRUE/FALSE
- ; Структуры для создания виртуального BMP-файла
- struct RGBQUAD
- rgbBlue db ?
- rgbGreen db ?
- rgbRed db ?
- rgbReserved db ?
- ends
- struct BITMAPINFO
- bmiHeader BITMAPINFOHEADER
- bmiColors RGBQUAD
- ends
Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- hThread dd ? ; Хэндл потока скроллера
- exit_flag dd ? ; Флаг завершения потока
- active_flag dd ? ; Флаг активности скроллера
- szTerminalFont db 'Terminal',0 ; Шрифт скроллера
- ; Файл с текстом скроллера
- szScrollerText file 'scroller.txt'
- db 0
Читать статью целиком »
Просмотров: 5205 | Комментариев: 0
Работа с файлами справки CHM на Ассемблере
20.08.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
Когда речь заходит о работе с файлами справки в формате CHM, то обычно все ссылаются на системный файл hh.exe, который вызывают с различными параметрами. Действительно, с его помощью можно просто открывать файл справки, а также открывать его на нужной странице (при условии, что заранее известно наименование ее HTML-файла в составе скомпилированной справки). Но с помощью hh.exe невозможно воспользоваться таким мощным инструментом, как поиск по ключевым словам. В этом случае мы можем воспользоваться всей мощью WinAPI и задействовать функцию HtmlHelp, которая находится в системной библиотеке HHCtrl.ocx. К сожалению, информации по ее использованию даже на MSDN очень мало, пришлось самостоятельно разбираться с некоторыми моментами. Для работы нам понадобятся определения некоторых констант:Code (Assembler) : Убрать нумерацию
- HH_DISPLAY_TOPIC = 00h ; Открыть страницу в файле справки
- HH_DISPLAY_INDEX = 02h ; Установить индекс на ключевое слово
- HH_KEYWORD_LOOKUP = 0Dh ; Поиск ключевого слова
- HH_CLOSE_ALL = 12h ; Закрыть все открытые окна справки
Первый пример, самый простой, это открытие файла справки на заранее известной странице.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ; CHM-файл
- szFile db 'php_manual_ru.chm',0
- ; Адрес страницы внутри скомпилированного CHM-файла
- szPage db 'res/function.http-send-data.html',0
- ...
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Открыть CHM-файл на заранее известной странице
- invoke HtmlHelp,NULL,szFile,HH_DISPLAY_TOPIC,szPage
hh.exe php_manual_ru.chm::res/function.http-send-data.html
У этого метода есть один большой недостаток. Если в CHM-файле есть индекс, то после выполнения такой команды он останется на самом начале, тогда как правая информационная часть действительно откроется на нужной странице.
Читать статью целиком »
Просмотров: 6978 | Комментариев: 1
Получение иконки из окна чужого приложения
23.07.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
В некоторых приложениях, например, в различных таскменеджерах, возникает задача получить иконку окна другого приложения, чтобы затем использовать ее в своем контексте. Делается это очень просто. Окну посылается сообщение WM_GETICON с параметром ICON_SMALL или ICON_BIG, в зависимости от того, маленькую или большую иконку надо получить. Если это не срабатывает, то можно попробовать получить иконку при помощи функции GetClassLong, соответственно, с параметром GCL_HICONSM или GCL_HICON. Если и в этом случае хэндл иконки получить не удалось, то значит не судьба. Или приложение, которому принадлежит окно, не отвечает, или же окно просто не имеет иконки. Для облегчения задачи я написал следующую функцию:Code (Assembler) : Убрать нумерацию
- ;--------------------------------------------------------------
- ; Функция получения иконки окна
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;--------------------------------------------------------------
- ; Параметры:
- ; hwnd - хэндл окна
- ; dType - тип иконки (0 - 16x16, 1 - 32x32)
- ; На выходе:
- ; EAX - хэндл иконки или -1 если окна не существует
- ;--------------------------------------------------------------
- proc GetIcon hwnd:DWORD, dType:DWORD
- pusha
- ; Такое окно существует?
- invoke IsWindow,[hwnd]
- or eax,eax
- jnz @f
- ; Окно не найдено
- mov eax,-1
- jmp .loc_ret
- @@:
- ; Какую иконку надо получить?
- cmp [dType],0
- jne .get_big_icon
- ; Получить хэндл маленькой иконки
- .get_small_icon:
- invoke SendMessage,[hwnd],WM_GETICON,ICON_SMALL,0
- or eax,eax
- jnz .loc_ret
- invoke GetClassLong,[hwnd],GCL_HICONSM
- or eax,eax
- jnz .loc_ret
- jmp .load_def
- ; Получить хэндл большой иконки
- .get_big_icon:
- invoke SendMessage,[hwnd],WM_GETICON,ICON_BIG,0
- or eax,eax
- jnz .loc_ret
- invoke GetClassLong,[hwnd],GCL_HICON
- or eax,eax
- jnz .loc_ret
- ; Получить хэндл иконки по умолчанию
- .load_def:
- invoke LoadIcon,NULL,IDI_WINLOGO
- .loc_ret:
- mov [dType],eax
- popa
- ; Вернуть результат
- mov eax,[dType]
- ret
- endp
Читать статью целиком »
Просмотров: 4730 | Комментариев: 3