pdbdump to IDA

Тема в разделе "WASM.RESEARCH", создана пользователем volodya, 31 янв 2007.

  1. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Еще в стареньких вторых упаковщиках я писал, что pdbdump - это очень рульная и полезная штука. Если кому интересно, то более подробно почитать можно тута: http://pdbdump.sourceforge.net/pdbleak.html

    pdbdump выводит информацию в виде С-подобного языка, что, в принципе, достаточно наглядно. Однако, немедленно возникает желание перегнать информацию в нечто более полезное - в IDC. Если цель, разумеется, - это работа с идой.

    Какие есть для этого возможности?

    1. IDA позволяет Ctrl+F9 для хедеров

    Код (Text):
    1. Hex: генерил бы .h сишный и всех делов.
    2. volodya: что ты имеешь в виду?
    3. Hex: ctrl-F9
    4. Hex: загрузить header
    5. Hex: оно само парсит идобавляет структуры и енум
    6. Hex: бока начинаются если там в хедере есть инклюды других хедеров и условная компиляция. А если просто хедер со структурами - запросто хавает
    7. Hex: Тока оно их не добавляет в окно структур, а в "стандартные структуры". Т.е. чтобы потом добавить структуру из хедера надо добавить "стандартную структуру".
    8. volodya: а это ручками делать надо?
    9. volodya: а если таких структур штук 100-200?
    10. Hex: Ну тут сложно решить что лучше
    11. Hex: добавлять структуры по мере надобности
    12. volodya: да шоб сразу все, разумеется
    13. Hex: или потом выискивать нужную среди сотен
    14. volodya: и оно в окне дизасма выбор тебе давало
    15. volodya: а-а-а, логично
    2. Т.к. pdbdump имеет открытый исходный код, то можно было бы сделать так, чтобы он плевался IDC, а не С-подобным языком

    3. Парсить результаты вывода pdbdump

    Теперь рассмотрим все три варианта немного более подробно.

    1-й вариант, вероятно, предполагает наименьшие трудозатраты. Надо лишь править сорцы pdbdump, чтобы убрать псевдо-С выбрыки. Например:

    Код (Text):
    1. enum _EXCEPTION_DISPOSITION {
    2.   ...
    3.   ExceptionExecuteHandler = 0x4,
    4. };
    Или, вот, сие:
    Код (Text):
    1. typedef struct MemBlock*[512]* PSECTION;
    Подобную конструкцию компилятор VS 2005 не переваривает вообще. Да и оригинальная грамматика K&R такие фортели не допускает.

    Еще большой вопрос как Ctrl+F9 прохавает указатели на функции. Например, вот такое:
    Код (Text):
    1. typedef enum _EXCEPTION_DISPOSITION  EXCEPTION_ROUTINE(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, struct _DISPATCHER_CONTEXT*);
    Сам не пробовал, не знаю. Или, вот, например, еще такое есть:
    Код (Text):
    1. union <unnamed-tag> u;
    Встречается, в основном, на pdb-файлах от висты. Хекс утверждает, что IDA достаточно разумна, чтобы вместо такой дряни подставлять, например, тот же GUID, но вот сама строка "<unnamed-tag>" не является валидным идентификатором с точки зрения лексики С.

    Словом, если кто хочет, то берем в зубы VS 2005 и ковырям сорцы pdbdump до полного изнеможения. Впрочем, особо много сложностей тут быть не должно.

    2-й вариант, в общем-то, идентичен первому. Только надо твикать все printf внутри pdbdump.

    3-й вариант является, пожалуй, САМЫМ неправильным. Т.е. надо парсить вывод pdbdump и переводить это в IDC. Я для себя выбрал третий вариант, т.к. рассматривал не наиболее оптимальный путь решения проблемы, а, скорее, путь получения большого количества фана. Фана я получил по полной программе. Все свои соображения я изложу в другом топе.
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    А ещё можно взять исходники PdbPlus и сделать добавление структур через IDA API.
     
  3. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Можно и так. Не учел...

    Топ тута: http://www.wasm.ru/forum/viewtopic.php?id=18699
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    В том топе аттач парсера логов pdbdump. Цели парсера достаточно просты: только С. Поддержки С++ НЕТ. Гонять на С++-файлах НЕ стоит!

    Тестировалось на файлах из набора символов winxpsp2, vista и wince.

    Мои благодарности Hex :)