Blog. Just Blog

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

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

Запись в архивы ARC, ZOO и LHZ без помощи архиватора

20.02.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
В первой части статьи о записи в архивы без помощи архиваторов я разобрал внутренний формат наиболее популярных современных архиваторов. Как я понял, особого интереса статья не вызвала, но материал на новую статью уже был практически подготовлен. Не пропадать же добру. В этой части я расскажу о том, как внедряться в более редкие форматы архивов: ARC, ZOO и LHZ без использования сторонних приложений. Поскольку такие раритеты найти уже проблематично, к каждому примеру я приложил сам архиватор и описание внутреннего формата его архивов. Ну а совсем экзотические архиваторы рассмотрены в третьей и четвертой частях статьи.

ARC - формат архивов одноименного архиватора от компании System Enhancement Associates, который был достаточно широко распространен в 80-90-х годах прошлого века. Примечательно, что параметры его командной строки в последующем стали эталоном практически для всех других архиваторов с их появления и до нашего времени. Этот же формат архивов (но с расширением .PAK) также имеет архиватор PAK. Сейчас для операционных систем Windows появился архиватор FreeArc, который создает архивы с таким же расширением .ARC, но они имеют другой формат. Здесь я рассмотрю именно старый, DOS'овский формат архивов ARC.
  1. ;---------------------------------------------
  2. ; ARC/PAK Header
  3. ;---------------------------------------------
  4. csig    db      ?                       ; Sign
  5. cmeth   db      ?                       ; Compression method (2 = store)
  6. cfname  rb      13                      ; 12 char File name ASCIIZ
  7. ccsize  dd      ?                       ; Compressed file size
  8. cdtm    dd      ?                       ; Date/Time
  9. cfcrc   dw      ?                       ; 16-bit CRC
  10. cosize  dd      ?                       ; Original file size
Обратите внимание, что поле для хранения имени файла имеет фиксированный размер 13 символов (формат имени 8.3 + нулевой символ). Когда создавался этот архиватор, про длинные имена файлов никто даже не мечтал.
  1. ; Признак окончание архива
  2. tail    db      1Ah,00
  3. tail_length   = $-tail
Признаком окончания архива является двухбайтовый "хвост", который записан после последнего файла. Больше никаких особенностей нет, формат очень простой, многотомные архивы, блокировки от изменений и прочие новомодные штучки не поддерживаются, поэтому процесс внедрения также очень простой.

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

Мульти-плагин для 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
Забегая вперед скажу, что подобная функция используется еще в двух анализаторах, так что при написании реального плагина их можно без проблем объединить. В статье для удобства понимания эти функции разделены.

Читать статью целиком »
Просмотров: 7266 | Комментариев: 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, при этом оставшийся байт игнорируется.

Читать статью целиком »
Просмотров: 14011 | Комментариев: 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", а если будет только текст, то можете выбрать любой другой системный шрифт, лишь бы он был установлен у пользователя на компьютере. Текст скроллера можно создавать в любом редакторе, поддерживающем псевдографику. При использовании рамок или рисунков из символов, они обязательно должны быть дополнены пробелами до правой границы текста. Ширина и высота символов задается в настройках, но имейте в виду, что размеры должны поддерживаться свойствами самого шрифта. Поэкспериментируйте.

Читать статью целиком »
Просмотров: 5413 | Комментариев: 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-файле есть индекс, то после выполнения такой команды он останется на самом начале, тогда как правая информационная часть действительно откроется на нужной странице.

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

01 ... 57 58 59 60 61 62 63 ... 76
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.12 сек. / MySQL: 3 (0.0152 сек.) / Память: 4.5 Mb
Наверх