Какие потребности в OP - это дисциплинированный подход к решению этой задачи.
Ему нужен хороший анализатор для источника ассемблера, поэтому он знает, что у него есть точное представление об этом. Помимо части чистого разбора, он будет иметь , чтобы полностью эмулировать ассемблер, включая все сложности, такие как макросы, условные блоки, несколько счетчиков местоположения, абсолютные/относительные/внешние символы и т. Д. (Создайте хороший парсер, полагаясь только для регулярных выражений не будет работать.)
Затем ему нужно будет вычислить первую оценку графика потока управления, проверив последовательности машинных команд и ветвей. Это может быть труднее сделать, чем выглядит; в больших сложных ассемблерных кодах люди злоупотребляют входными точками в процедуры, поэтому иногда сложно сказать, что такое инструкция, и каковы данные. .
(Вот трюк я использую в большом приложении x86 я хочу добавить здравомыслие проверки в мой код во многих местах Тестов здравомыслия выглядеть следующим образом:.
<test for some sane condition>
jf location+3 ; this branchs to a breakpoint in the middle of the next instruction
cmp al, 0xCC ; the immediate value is a BREAKPOINT opcode
Они компактны, и Точка останова происходит, когда некоторые плохое случается. Но при анализе этой программы для управления потоком, то «JMP ложные» иногда разветвляется на то, что, как представляется, средней из инструкции. Как будет модель OP что?)
Следующее осложнение указатели для кода. Код ассемблера часто генерирует много указателей на другие другие команды, а затем скрывает эти указатели в разных местах (команда вызова выталкивает их в стек данных для x86), извлекает их, а затем делает «jmp косвенным». Если вы хотите знать, куда может идти этот jmp, вам необходимо отслеживать возможные значения, которые может содержать ячейка памяти, а это означает, что вам нужно выполнить анализ потока данных (как значения получают там и откуда) и комбинировать с графиком вызовов (не может добраться до этой функции? ОК, тогда, где это происходит, это не повлияет на этот код), чтобы вычислить разумный ответ.
Выполнение всего этого специальными методами приведет к получению неточных (бесполезных) ответов. OP необходимо найти структуру, в которой он будет строить свой синтаксический анализатор, и внедрять точки хорошего качества в алгоритмы анализа, если он надеется получить хороший результат.
C специально не предназначен для поддержки этой задачи. Он может сделать это с достаточным количеством дополнительного пота, но это верно для любого языка программирования.
(Проверьте мою биографию для такой структуры. OP может использовать любую фреймворк, которая работает для него).
Это скорее зависит от того, насколько хороша работа, которую вам нужно делать. Регулярные регулярные выражения на любом языке, который вам наиболее удобен, являются разумным первым приближением. У вас возникнут проблемы с макросами, внешними связями, вычисленными ветвями и т. Д., Но тогда идеальное решение невозможно начать, поэтому все зависит от того, насколько хороша эвристика, которую вы требуете. – doynax
Если вы проводите специальный синтаксический анализ, вы получите в лучшем случае специальные графики потока управления. Почему вы хотите, чтобы плохой CFG был вне меня; что бы вы сделали с этим, что полезно? –
Для чего вам это нужно? Возможно, есть другое направление для решения настоящей проблемы. –