Blog. Just Blog

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

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

Мульти-плагин для 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 ничего сложного:
  1. ;-----------------------------------------------------------
  2. ; PEiD - запрос имени плагина
  3. ;-----------------------------------------------------------
  4. proc LoadDll
  5.         ; Вернуть в регистре EAX указатель на строку названия
  6.         mov     eax,plugName
  7.         ret
  8. endp
Забегая вперед скажу, что подобная функция используется еще в двух анализаторах, так что при написании реального плагина их можно без проблем объединить. В статье для удобства понимания эти функции разделены.

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

Как менять цвета элементов диалогового окна на Ассемблере

03.12.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
По умолчанию цвета диалоговых окон и элементов управления в приложениях соответствуют установленной палитре Windows. Но иногда бывает необходимо выделить другим цветом какой-нибудь текст в диалоговом окне, или же вообще раскрасить все окно в нужный вам цвет. Это сделать очень легко, надо лишь знать порядок вывода на экран диалоговых окон и их содержимого. При отрисовке каждого элемента диалогового окна ему обязательно передается одно из следующих сообщений: WM_CTLCOLORDLG - отрисовка самого окна, WM_CTLCOLORBTN - отрисовка кнопок, WM_CTLCOLOREDIT - отрисовка полей редактирования, WM_CTLCOLORSTATIC - отрисовка статических элементов, WM_CTLCOLORLISTBOX - отрисовка комбобоксов и выпадающих списков, WM_CTLCOLORMSGBOX - вывод окна сообщений и WM_CTLCOLORSCROLLBAR - отрисовка полосы прокрутки. Обработчик для всех этих сообщений может быть один. Главное, чтобы на этапе инициализации окна был создан объект "кисть" с фоновым цветом главного окна. Именно это значение должен всегда возвращать обработчик сообщение изменения цвета. Предварительный каркас такого приложения выглядит примерно так:
  1. ; Обработчик диалогового окна
  2. proc DialogProc hwnddlg,msg,wparam,lparam
  3.         ...
  4.         ; Обработка сообщения инициализации окна
  5.         cmp     [msg],WM_INITDIALOG
  6.         je      wminitdialog
  7.  
  8.         ; Обработка всех сообщений, связанных с установкой цвета
  9.         cmp     [msg],WM_CTLCOLORDLG
  10.         je      color
  11.         cmp     [msg],WM_CTLCOLORBTN
  12.         je      color
  13.         cmp     [msg],WM_CTLCOLOREDIT
  14.         je      color
  15.         cmp     [msg],WM_CTLCOLORSTATIC
  16.         je      color
  17.         cmp     [msg],WM_CTLCOLORLISTBOX
  18.         je      color
  19.         cmp     [msg],WM_CTLCOLORMSGBOX
  20.         je      color
  21.         cmp     [msg],WM_CTLCOLORSCROLLBAR
  22.         je      color
  23.         ...
  24.  
  25.         ; Обработка инициализации окна
  26. wminitdialog:
  27.         ; Основной цвет фона окна в формате RGB
  28.         clrMain = 0012FFFFh
  29.         ; Создать объект фоновой кисти для всего окна
  30.         invoke  CreateSolidBrush,clrMain
  31.         mov     [hBrushBack], eax
  32.  
  33.         jmp     processed
В этом примере все обработчики заданы по максимуму, в вашем приложении можно оставить только необходимое, например, только обработку статических элементов. При написании обработчиков учтите следующие особенности: для read-only или отключенных элементов EDIT сообщение WM_CTLCOLOREDIT не посылается, вместо него посылается сообщение WM_CTLCOLORSTATIC. Цвет текста для кнопок BS_AUTOCHECKBOX и BS_AUTORADIOBUTTON применяется только к их тексту, а флажок кнопок закрашен системно-определенным цветом (обычно черным). Цвет текста для BS_GROUPBOX применяется только к тексту заголовка, но не к линии границы элемента. Также обратите внимание, что цвет задается значениями RGB в трех младших байтах DWORD, при этом оставшийся байт игнорируется.

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

Вертикальный скроллер на Ассемблере

04.10.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
Я уже ранее приводил код горизонтального скроллера на Ассемблере, теперь пришло время вертикального скроллера. Такой эффект очень часто используется в различных кейгенах, окнах "О программе", демо-роликах, просмотрщиках текстовых файлов и подобных программах. Код основан на аналогичной процедуре от Av0id, я добавил в него несколько усовершенствований. Для настройки размеров и внешнего вида скроллера в сегменте данных определяются вспомогательные константы и структуры, не описанные в FASM:
  1. ; Настройки внешнего вида скроллера
  2. SCROLL_FONT_WIDTH  = 8          ; Ширина символов текста
  3. SCROLL_FONT_HEIGHT = 8          ; Высота символов текста
  4. SCROLL_WIDTH       = 430        ; Ширина окна скроллера
  5. SCROLL_HEIGHT      = 350        ; Высота окна скроллера
  6. SCROLL_BACKCOLOR   = 0808080h   ; Цвет фона
  7. SCROLL_TEXTCOLOR   = 000FFFFh   ; Цвет текста
  8. SCROLL_SHADOWCOLOR = 0          ; Цвет тени
  9. SCROLL_SLEEP       = 40         ; Скорость скроллирования
  10. SCROLL_SHADOW      = FALSE      ; Рисовать тень TRUE/FALSE  
  11.  
  12. ; Структуры для создания виртуального BMP-файла
  13. struct  RGBQUAD
  14.     rgbBlue      db ?
  15.     rgbGreen     db ?
  16.     rgbRed       db ?
  17.     rgbReserved  db ?
  18. ends
  19.  
  20. struct  BITMAPINFO
  21.     bmiHeader     BITMAPINFOHEADER
  22.     bmiColors     RGBQUAD
  23. ends
А также переменные и другие данные, необходимые для его работы:
  1. section '.data' data readable writeable
  2.  
  3. hThread         dd ?    ; Хэндл потока скроллера
  4. exit_flag       dd ?    ; Флаг завершения потока
  5. active_flag     dd ?    ; Флаг активности скроллера
  6.  
  7. szTerminalFont  db 'Terminal',0 ; Шрифт скроллера
  8.                 ; Файл с текстом скроллера
  9. szScrollerText  file 'scroller.txt'
  10.                 db 0
Если в скроллере используется псевдографика, то желательно оставить шрифт "Terminal", а если будет только текст, то можете выбрать любой другой системный шрифт, лишь бы он был установлен у пользователя на компьютере. Текст скроллера можно создавать в любом редакторе, поддерживающем псевдографику. При использовании рамок или рисунков из символов, они обязательно должны быть дополнены пробелами до правой границы текста. Ширина и высота символов задается в настройках, но имейте в виду, что размеры должны поддерживаться свойствами самого шрифта. Поэкспериментируйте.

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

Работа с файлами справки CHM на Ассемблере

20.08.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
Когда речь заходит о работе с файлами справки в формате CHM, то обычно все ссылаются на системный файл hh.exe, который вызывают с различными параметрами. Действительно, с его помощью можно просто открывать файл справки, а также открывать его на нужной странице (при условии, что заранее известно наименование ее HTML-файла в составе скомпилированной справки). Но с помощью hh.exe невозможно воспользоваться таким мощным инструментом, как поиск по ключевым словам. В этом случае мы можем воспользоваться всей мощью WinAPI и задействовать функцию HtmlHelp, которая находится в системной библиотеке HHCtrl.ocx. К сожалению, информации по ее использованию даже на MSDN очень мало, пришлось самостоятельно разбираться с некоторыми моментами. Для работы нам понадобятся определения некоторых констант:
  1. HH_DISPLAY_TOPIC  = 00h ; Открыть страницу в файле справки
  2. HH_DISPLAY_INDEX  = 02h ; Установить индекс на ключевое слово
  3. HH_KEYWORD_LOOKUP = 0Dh ; Поиск ключевого слова
  4. HH_CLOSE_ALL      = 12h ; Закрыть все открытые окна справки
Остальные константы вы можете посмотреть в MSDN, но для нормальной работы с файлом справки вполне достаточно этих четырех. Во всех примерах этой статьи я ссылаюсь на файл справки PHP php_manual_ru.chm, его можно скачать здесь (примерно 13 мегабайт). В ваших программах, естественно, вы будете использовать свой файл справки.

Первый пример, самый простой, это открытие файла справки на заранее известной странице.
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3. ; CHM-файл
  4. szFile  db 'php_manual_ru.chm',0
  5. ; Адрес страницы внутри скомпилированного CHM-файла
  6. szPage  db 'res/function.http-send-data.html',0
  7. ...
  8.  
  9. ; Сегмент кода
  10. section '.code' code readable executable
  11.         ...
  12.         ; Открыть CHM-файл на заранее известной странице
  13.         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. Если и в этом случае хэндл иконки получить не удалось, то значит не судьба. Или приложение, которому принадлежит окно, не отвечает, или же окно просто не имеет иконки. Для облегчения задачи я написал следующую функцию:
  1. ;--------------------------------------------------------------
  2. ; Функция получения иконки окна
  3. ; by ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;--------------------------------------------------------------
  6. ; Параметры:
  7. ;     hwnd - хэндл окна
  8. ;     dType - тип иконки (0 - 16x16, 1 - 32x32)
  9. ; На выходе:
  10. ;     EAX - хэндл иконки или -1 если окна не существует
  11. ;--------------------------------------------------------------
  12. proc    GetIcon hwnd:DWORD, dType:DWORD
  13.         pusha
  14.  
  15.         ; Такое окно существует?
  16.         invoke  IsWindow,[hwnd]
  17.         or      eax,eax
  18.         jnz     @f
  19.  
  20.         ; Окно не найдено
  21.         mov     eax,-1
  22.         jmp     .loc_ret
  23. @@:
  24.         ; Какую иконку надо получить?
  25.         cmp     [dType],0
  26.         jne     .get_big_icon
  27.  
  28.         ; Получить хэндл маленькой иконки
  29. .get_small_icon:
  30.         invoke  SendMessage,[hwnd],WM_GETICON,ICON_SMALL,0
  31.         or      eax,eax
  32.         jnz     .loc_ret
  33.         invoke  GetClassLong,[hwnd],GCL_HICONSM
  34.         or      eax,eax
  35.         jnz     .loc_ret
  36.         jmp     .load_def
  37.  
  38.         ; Получить хэндл большой иконки
  39. .get_big_icon:
  40.         invoke  SendMessage,[hwnd],WM_GETICON,ICON_BIG,0
  41.         or      eax,eax
  42.         jnz     .loc_ret
  43.         invoke  GetClassLong,[hwnd],GCL_HICON
  44.         or      eax,eax
  45.         jnz     .loc_ret
  46.  
  47.         ; Получить хэндл иконки по умолчанию
  48. .load_def:
  49.         invoke  LoadIcon,NULL,IDI_WINLOGO
  50.  
  51. .loc_ret:
  52.         mov     [dType],eax
  53.         popa
  54.  
  55.         ; Вернуть результат
  56.         mov     eax,[dType]
  57.         ret
  58. endp
Параметры: hwnd - хэндл окна, из которого надо получить иконку, dType - тип иконки, большая или маленькая. Функция самодостаточная, не требует дополнительных переменных в сегменте данных. На выходе в регистре EAX возвращается хэндл иконки или -1, в случае, если запрошенного окна не существует. Если же окно существует, но по какой-то причине не удалось получить его иконку, то вместо нее функция возвращает хэндл дефолтной иконки из библиотеки Windows.

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

01 ... 51 52 53 54 55 56 57 ... 70
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 3 (0.0172 сек.) / Память: 4.5 Mb
Наверх