Построение графа потока управления с использованием результатов Objdump

I ' m пытается построить граф потока управления из результатов сборки, которые возвращаются через вызов objdump -d. На данный момент лучший метод, который я придумал, - это поместить каждую строку результата в связанный список и разделить адрес памяти, код операции и операнды для каждой строки. Я разделяю их, полагаясь на регулярный характер результатов objdump (адрес памяти - от символа 2 до символа 7 в строке, представляющей каждую строку).

Как только это сделано, я запускаю настоящую инструкцию CFG. Каждый узел в CFG содержит начальный и конечный адрес памяти, указатель на предыдущий базовый блок и указатели на любые дочерние базовые блоки. Затем я просматриваю результаты objdump и сравниваю код операции с массивом всех кодов операций потока управления в x86_64. Если код операции является кодом потока управления, Я записываю адрес как конец базового блока и в зависимости от кода операции добавляю два дочерних указателя (условный код операции) или один (вызов или возврат).

Я работаю над реализацией этого на C, и кажется, что это будет работать, но кажется очень слабым. Есть ли у кого-нибудь предложения или что-то, что я не принимаю во внимание?

Спасибо, что нашли время прочитать это!

edit:

Идея состоит в том, чтобы использовать это для сравнения трассировки стека системных вызовов сгенерированный DynamoRIO по сравнению с ожидаемым CFG для целевого двоичного файла, я надеюсь, что построение его таким образом облегчит это. Я не использовал повторно то, что доступно, потому что A) я действительно не думал об этом и B) мне нужно преобразовать график в пригодную для использования структуру данных, чтобы я мог проводить сравнения путей. Я' Я собираюсь взглянуть на некоторые утилиты на странице, на которую вы выстроились, спасибо, что указали мне в правильном направлении. Спасибо за комментарии, я очень ценю это!

9
задан Jonathan Leffler 23 March 2013 в 05:43
поделиться