Движок для графа вызовов

Тема в разделе "WASM.WIN32", создана пользователем XshStasX, 18 авг 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Посоветуйте движок на С/С++ для построение графа вызовов, и матчасть.
    Желательна поддержка анализа вызовов, к примеру на входе в процедуру известно часть параметров нужно знать примерно что будет на выходе, или хотя бы какие вызовы процедур будут.

    Пока сам делаю с нуля примерно так
    struct InstructionList{
    LIST_ENTRY List;
    DWORD Offset; //смещение инструкции от точки входа на анализ
    DWORD Size; //хотя реально достаточно 4х - 5 бит
    }

    Это соединяю в блоки непрерывных инструкций:
    struct BlockInstructionList{
    LIST_ENTRY List;
    LIST_ENTRY InstructionsList;
    DWORD Offset; // Смещение первой инструкции
    DWORD InstrCount; // Количество инструкций
    DWORD Size; // Размер всех инструкций
    };

    Далее через дизасм. длин получаю размеры инструкций, в случаи если встречается jmp/call/ret/ создаю новый блок инструкций и соединяю с предыдущим.
    Что посоветуете делать если встречаем инструкции типа call eax/jmp [eax]/ret/int. Делать разрыв и создавать новый блок ?
    На основе чего можно предположить что процедура закончилась ?
     
  2. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    на основании того, что дальнейших путей нет, естественно. или исчерпались лимиты.
     
  3. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    В общем виде посчитать значение регистра не получится, но, если специально никто антидизасм не делал,можно попробовать поискать перед интересующим call eax, инструкции вида mov eax, 0x13123, а скорее всего будет mov eax,[global_var]...

    Если код был примерно такого вида, вычислить значение будет достаточно просто. В одном месте будет
    call [g_callback]
    в другом
    mov [g_callback], 0xdeadbeef

    Код (Text):
    1. fn_callback* g_callback;
    2. void process_message()
    3. {
    4.    ...
    5.    g_callback();
    6. }
    7.  
    8. void callback()
    9. {
    10. }
    11.  
    12. void install_callback()
    13. {
    14.    g_callback = &callback;
    15. }
    Но если чуть-чуть усложнить пример, уже понадобится виртуальная машина для эмуляции инструкций.