Когда необходимо быстро что-то посмотреть или исправить в PE-файле очень удобно использовать замечательный инструмент HIEW. Но у него нет штатной возможности загрузки отладочной информации. А это просто необходимо, когда, например, нужно "подсмотреть", что же творится внутри MS’овского драйвера. На официальном сайте есть расширение NamesPeMap, но оно использует MAP-файл, которым обычно публично никто не делится.
Немного поискав на просторах интернета, нашел довольно забавное решение, использующее модуль Python’а и IDA в качестве источника символов: PyHiew: Transferring names between IDA Pro and Hiew. Имена передаются из IDA в HIEW по средствам локальной связки клиент-сервера, которая реализована на Python’овских скриптах. Автор точно знает толк в извращенных формах программирования :)
В связи с таким положением вещей была написана утилита DSymLoad для загрузки отладочных символов в HIEW. На самом деле DSymLoad включает в себя два исполняемых модуля: утилиту командной строки NameTGen.exe и внешний модуль для HIEW - DSymLoad.HEM (с файлом настроек DSymLoad.ini).
NameTGen.exe
NameTGen.exe является консольной утилитой командной строки, которая в стандартный вывод пишет загруженные отладочные символы в формате namet-файла. Формат запуска:
TARGET_FILE_NAME это обязательный параметр командной строки, в котором передается имя целевого исполняемого файла.
OPTIONS - набор необязательных опций. Опции могут быть:
- -c: все подстроки C++ символов, содержащих "::" будут преобразованы в "__"
- -u : по умолчанию, все символы представлены в undecorated - формате (как перевести на русский не знаю). Эта опция отменяет это преобразование. Это удобно для случаев, когда нужно читать параметров по имени символа.
- -n: обработка коллизий имен символов. Если при обработке встретится символ, имя которого уже было обработано, то к имени будет добавлен суффикс в виде шестнадцатеричного числа (адреса)
- -s STR: путь до символов. Путь может быть разделен точкой с запятой(;). Если параметр не задан, то библиотека отладчика будет искать символы в текущей директории или в значениях переменных окружения _NT_SYMBOL_PATH и _NT_ALTERNATE_SYMBOL_PATH
- -l STR: путь к динамическим библиотекам dbghelp.dll and symsrv.dll. Обычно это путь к установленному отладчику WinDbg
- -i STR: загрузка всех опций из файла DSymLoad.ini (STR-путь к файлу DSymLoad.ini)
Для себя я создал команду для FAR’а (<F2> -> <Ins>) которая формирует namet-файл:
В этой строке использованы метасимволы !.! - полное имя файла с расширением и !.namet полное имя файла с расширением namet. После обработки исходного файла такой командой, можно импортировать получившийся namet-файл в HIEW, как список имен локальных смещений(<F12>(Names) -> <F12>(Import))
DSymLoad.HEM
Что бы загружать символы "не отходя от HIEW" был написан внешний модуль DSymLoad.HEM. Это загружаемая в HIEW библиотека, которая использует отладочную информацию, перечисляет символы и формирует локальные символы для текущего файла. Фактически, я просто вынес движок перечисления символов в отдельную статическую библиотеку и собрал DLL. Параметры библиотеки почти полностью совпадают с NameTGen.exe. За исключением параметра перезаписи существующих имен ("Overrride name if exist"). Этот параметр позволяет не перезатирать уже введенные другими способами имена локальных смещений.
Для хранения настроек используется обычный INI-файл (DSymLoad.ini). Этот файл должен располагаться в той же директории, что и исполняемый образ DSymLoad.HEM.
Важный момент: все настройки, измененные в главном диалоговом окне, не сохраняются в файл, пока не будет нажата клавиша <F8>.
Скачать утилиту DSymLoad
Change log:
0.1.0.1: |
Добавлена детализация загрузки отладочных символов NameTGen.exe поддерживает ключ -i В архив добавлены необходимые библиотеки отладки |
0.1.0.0 |
Первая публичная работоспособная версия |
ΞρεΤΙκ