xFasImport — плагин для x64dbg для поддержки fasm

Плагин для импорта в отладчик x64dbg отладочной информации из fasm ассемблера (из файла .fas).

xFasImport - скриншот

Назначение

Этот плагин полезен для тех кто пользуется fasm (flat assembler) и отладчиком x64dbg. Fasm умеет создавать файл с отладочными данными (именами меток, функций и т.п.). Но формат отладочных данных у fasm свой собственный (стандартный pdb он создавать не умеет), и для его использования в отладчиках нужные сторонние средства.

Функциональные возможности xFasImport

  • Поддержка отладочных данных fasm для исполняемых файлов формата PE/PE+ (win32/win64);
  • Поддержка загрузки отладочных данных для DLL (выбор модуля для адресов которого требуется загрузка отладочных данных);
  • Загрузка имён меток и функций;
  • Загрузка в комментарии строк исходного asm-файла (для более понятного анализа машинного кода сгенерированного макросами, имён локальных переменных в proc-функциях, авторских комментариев);
  • Поддержка юникода (национальных букв, отличных от ASCII) в путях к файлам;
  • Полная поддержка любых национальных 8-битных кодировок в исходниках (всё корректно конвертируется – исходная кодировка указывается в настройках плагина – и импортируется в x64dbg в виде UTF-8).

xFasImport - скриншот настроек плагина

Планируемые возможности в будущих версиях

  • Поддержка отладочных данных для файлов скомпилированных в формат COFF и затем собранных сторонним линковщиком в исполняемые PE/PE+ (ситуация когда fas-файл сопоставлен с промежуточным COFF-файлом, а не с финальным исполняемым PE-файлом);
  • Поддержка fasmg (будет специализированный макрос для fasmg и его поддержка в плагине).

Альтернативные решения

Для отладчика x64dbg давно существует плагин xFasConv – но он загружает только имена функций и глобальных переменных. А имена локальных (стековых) переменных, к которым макросы fasm (в частности конструкции PROC … LOCALS … ENDL … ENDP) делают обращения через [EBP+n], в отладчик не загружаются и глядя на свой же код в отладчике не понятно что там за MOV EAX,[EBP+4] например). Есть косвенное решение этой проблемы – загружать локальные имена в виде комментариев к коду, такое решение реализовано в утилите x64dbg_dd.exe, однако неудобство в том что надо заранее её использовать – она создаёт отдельный файл dd32 или dd64 который потом импортируется в базу x64dbg.

Вышеуказанные решения неудобны (медленны), и имеют ряд проблем (некорректная работа с национальными кодировками, проблемы в некоторых случаях загрузки по изменённому базовому адресу, сложности с загрузкой отладочных данных для DLL).

Представленный тут плагин xFasImport для x64dbg – совмещает в себе функционал старых xFasConv и x64dbg_dd.exe, плюс новые возможности – теперь из меню плагина в x64dbg сразу загружаются и глобальные метки и исходный код (что позволяет видеть локальные метки и логику аргументов INVOKE/STDCALL в виде единой строки, а не несколько PUSH).

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

Для создания отладочной информации (файла .fas) в fasm:
у fasm.exe используйте ключ -s (например fasm.exe test.asm -s test.fas test.exe),
у fasmw.exe используйте команду Build symbols (Ctrl+F8) в меню.

fasmg не имеет простого способа, его поддержка возможно будет реализована в будущем.

Особенности отладочного fas-файла

Обращаю внимание что fas-файл не содержит весь исходный код.

В fas-файле содержатся имена меток и ссылки на строки внешних asm-файлов исходника. Имена меток читаются из fas-файла, а строки исходного кода читаются из asm-файлов. Поэтому, для корректной загрузки fas-файла в отладчик – все исходные asm-файлы тоже должны быть доступны и неизменны (если после компиляции программы вы что-то измените в исходниках, а потом загрузите это в отладчик не пересобрав программу – то исходник будет не соответствовать, позиции строк на которые ссылается fas-файл будут ошибочные).

Для некоторых asm-файлов в fas-файле могут быть прописаны ссылки с полными путями, поэтому перемещать их нельзя. fas-файл обычно не пригоден для использования на других компьютерах (вне исходной среды). В плагине реализован инструмент показывающий все ссылки в fas-файле и возраст файлов (если ссылка на файл исходника который моложе чем сам fas-файл – то вероятно что fas-файл более не актуален).

Локализация

Встроенный язык – английский. Но плагин читает настройку Language (из x64dbg) и подгружает соответствующий lng-файл, который должен лежать в папке plugins (рядом с плагином), например: xFasImport_ru.lng, xFasImport_fr.lng, xFasImport_de.lng, xFasImport_it.lng, xFasImport_zh_TW.lng

На данный момент в комплекте есть только xFasImport_ru.lng (русский перевод) и xFasImport_template.lng (английский шаблон для переводов), используя эти файлы в качестве примеров вы можете сделать перевод на любой язык. При желании можете присылать локализованные lng-файлы мне и они будут включены в дистрибутив.

Исходные коды

Будут опубликованы позднее.

История версий xFasImport

История развития плагина:
v.1.0.0.180 (2022.08.20) Первая публичная версия.

Загрузка и установка плагина

Скачать файлы xFasImport можно тут

Скачать “xFasImport_v10.rar” – 26 КБВерсия 1.0.0.180, 2022-08-20

Файл xFasImport.dp32 помещается в папку \x64dbg\release\x32\plugins
Файл xFasImport.dp64 помещается в папку \x64dbg\release\x64\plugins
lng-файлы помещаются в эти же папки.

Тестовый пример генерации ошибки для вызова отладчика

Инициирует ошибку разными способами – чтение из нулевого адреса, деление на 0, команда UD2, INT1, INT3, исполнение кода в секции данных. В основном процессе и во внешней DLL.

Test debuggers - screenshot

Исходник (.asm) для сборки exe/dll 32/64 и создания fas-файлов к ним.

Скачать “test_debug_20220820.rar” – 5 КБВерсия 1, 2022-08-20