Я хотел бы определить, были ли две функции в двух исполняемых файлах скомпилированы из одного и того же (С) исходного кода, и хотел бы сделать это, даже если они были скомпилированы разными версиями компилятора или с разными вариантами компиляции. В настоящее время я рассматриваю возможность реализации какой-нибудь дактилоскопии функций на уровне ассемблера. Отпечаток пальца функции должен обладать следующими свойствами:
- две функции, скомпилированные из одного и того же источника при разных обстоятельствах, скорее всего, будут иметь один и тот же отпечаток пальца (или похожий),
- две функции, скомпилированные из разных источников на языке Си, скорее всего, будут иметь разные отпечатки пальца,
- (bonus) если две функции источника были похожи, то отпечатки пальцев также будут похожи (для некоторого разумного определения похожих функций).
То, что я сейчас ищу, это набор свойств скомпилированных функций, которые индивидуально удовлетворяют (1.) и, надеюсь, также (2.).
Предположения
Конечно, это в общем невозможно, но может быть что-то, что будет работать в большинстве случаев. Вот некоторые предположения, которые могли бы сделать это проще:
- linux двоичные ELF-файлы (без доступной отладочной информации),
- никоим образом не обфусцированные,
- скомпилированные gcc,
- на x86 linux (подход, который может быть реализован на других архитектурах, был бы неплохим).
Идеи
К сожалению, у меня практически нет опыта сборки. Вот некоторые идеи для вышеупомянутых свойств:
- типы инструкций, содержащихся в функции (т.е. инструкции с плавающей точкой, барьеры памяти)
- обращения к памяти из функции (читает/записывает ли она из/в куче стека? )
- вызываемые библиотечные функции (их имена должны быть доступны в ELF; также их порядок обычно не должен меняться)
- форма графа потока управления (думаю, это будет сильно зависеть от компилятора)
Существующая работа
мне удалось найти только тангенциально связанную работу:
Есть ли у вас предложения по поводу свойств функции? Или другая идея, которая также достигает моей цели? Или что-то подобное уже было реализовано и я полностью это пропустил?
задан b42 2 September 2011 в 12:54
поделиться