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