Посоветуйте движок на С/С++ для построение графа вызовов, и матчасть. Желательна поддержка анализа вызовов, к примеру на входе в процедуру известно часть параметров нужно знать примерно что будет на выходе, или хотя бы какие вызовы процедур будут. Пока сам делаю с нуля примерно так 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. Делать разрыв и создавать новый блок ? На основе чего можно предположить что процедура закончилась ?
В общем виде посчитать значение регистра не получится, но, если специально никто антидизасм не делал,можно попробовать поискать перед интересующим call eax, инструкции вида mov eax, 0x13123, а скорее всего будет mov eax,[global_var]... Если код был примерно такого вида, вычислить значение будет достаточно просто. В одном месте будет call [g_callback] в другом mov [g_callback], 0xdeadbeef Код (Text): fn_callback* g_callback; void process_message() { ... g_callback(); } void callback() { } void install_callback() { g_callback = &callback; } Но если чуть-чуть усложнить пример, уже понадобится виртуальная машина для эмуляции инструкций.