Отпечаток пальца функции на уровне ассемблера

Я хотел бы определить, были ли две функции в двух исполняемых файлах скомпилированы из одного и того же (С) исходного кода, и хотел бы сделать это, даже если они были скомпилированы разными версиями компилятора или с разными вариантами компиляции. В настоящее время я рассматриваю возможность реализации какой-нибудь дактилоскопии функций на уровне ассемблера. Отпечаток пальца функции должен обладать следующими свойствами:

  1. две функции, скомпилированные из одного и того же источника при разных обстоятельствах, скорее всего, будут иметь один и тот же отпечаток пальца (или похожий),
  2. две функции, скомпилированные из разных источников на языке Си, скорее всего, будут иметь разные отпечатки пальца,
  3. (bonus) если две функции источника были похожи, то отпечатки пальцев также будут похожи (для некоторого разумного определения похожих функций).

То, что я сейчас ищу, это набор свойств скомпилированных функций, которые индивидуально удовлетворяют (1.) и, надеюсь, также (2.).

Предположения

Конечно, это в общем невозможно, но может быть что-то, что будет работать в большинстве случаев. Вот некоторые предположения, которые могли бы сделать это проще:

  • linux двоичные ELF-файлы (без доступной отладочной информации),
  • никоим образом не обфусцированные,
  • скомпилированные gcc,
  • на x86 linux (подход, который может быть реализован на других архитектурах, был бы неплохим).

Идеи

К сожалению, у меня практически нет опыта сборки. Вот некоторые идеи для вышеупомянутых свойств:

  • типы инструкций, содержащихся в функции (т.е. инструкции с плавающей точкой, барьеры памяти)
  • обращения к памяти из функции (читает/записывает ли она из/в куче стека? )
  • вызываемые библиотечные функции (их имена должны быть доступны в ELF; также их порядок обычно не должен меняться)
  • форма графа потока управления (думаю, это будет сильно зависеть от компилятора)

Существующая работа

мне удалось найти только тангенциально связанную работу:


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

8
задан b42 2 September 2011 в 12:54
поделиться