Еще в стареньких вторых упаковщиках я писал, что pdbdump - это очень рульная и полезная штука. Если кому интересно, то более подробно почитать можно тута: http://pdbdump.sourceforge.net/pdbleak.html pdbdump выводит информацию в виде С-подобного языка, что, в принципе, достаточно наглядно. Однако, немедленно возникает желание перегнать информацию в нечто более полезное - в IDC. Если цель, разумеется, - это работа с идой. Какие есть для этого возможности? 1. IDA позволяет Ctrl+F9 для хедеров Код (Text): Hex: генерил бы .h сишный и всех делов. volodya: что ты имеешь в виду? Hex: ctrl-F9 Hex: загрузить header Hex: оно само парсит идобавляет структуры и енум Hex: бока начинаются если там в хедере есть инклюды других хедеров и условная компиляция. А если просто хедер со структурами - запросто хавает Hex: Тока оно их не добавляет в окно структур, а в "стандартные структуры". Т.е. чтобы потом добавить структуру из хедера надо добавить "стандартную структуру". volodya: а это ручками делать надо? volodya: а если таких структур штук 100-200? Hex: Ну тут сложно решить что лучше Hex: добавлять структуры по мере надобности volodya: да шоб сразу все, разумеется Hex: или потом выискивать нужную среди сотен volodya: и оно в окне дизасма выбор тебе давало volodya: а-а-а, логично 2. Т.к. pdbdump имеет открытый исходный код, то можно было бы сделать так, чтобы он плевался IDC, а не С-подобным языком 3. Парсить результаты вывода pdbdump Теперь рассмотрим все три варианта немного более подробно. 1-й вариант, вероятно, предполагает наименьшие трудозатраты. Надо лишь править сорцы pdbdump, чтобы убрать псевдо-С выбрыки. Например: Код (Text): enum _EXCEPTION_DISPOSITION { ... ExceptionExecuteHandler = 0x4, }; Или, вот, сие: Код (Text): typedef struct MemBlock*[512]* PSECTION; Подобную конструкцию компилятор VS 2005 не переваривает вообще. Да и оригинальная грамматика K&R такие фортели не допускает. Еще большой вопрос как Ctrl+F9 прохавает указатели на функции. Например, вот такое: Код (Text): typedef enum _EXCEPTION_DISPOSITION EXCEPTION_ROUTINE(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, struct _DISPATCHER_CONTEXT*); Сам не пробовал, не знаю. Или, вот, например, еще такое есть: Код (Text): union <unnamed-tag> u; Встречается, в основном, на pdb-файлах от висты. Хекс утверждает, что IDA достаточно разумна, чтобы вместо такой дряни подставлять, например, тот же GUID, но вот сама строка "<unnamed-tag>" не является валидным идентификатором с точки зрения лексики С. Словом, если кто хочет, то берем в зубы VS 2005 и ковырям сорцы pdbdump до полного изнеможения. Впрочем, особо много сложностей тут быть не должно. 2-й вариант, в общем-то, идентичен первому. Только надо твикать все printf внутри pdbdump. 3-й вариант является, пожалуй, САМЫМ неправильным. Т.е. надо парсить вывод pdbdump и переводить это в IDC. Я для себя выбрал третий вариант, т.к. рассматривал не наиболее оптимальный путь решения проблемы, а, скорее, путь получения большого количества фана. Фана я получил по полной программе. Все свои соображения я изложу в другом топе.
В том топе аттач парсера логов pdbdump. Цели парсера достаточно просты: только С. Поддержки С++ НЕТ. Гонять на С++-файлах НЕ стоит! Тестировалось на файлах из набора символов winxpsp2, vista и wince. Мои благодарности Hex