Для отдельных функций: скомпилируйте их и сравните полученный ассемблерный код или объекты.Для всей программы: выполните все вышеперечисленное для всех функций и создайте нечеткий поиск, чтобы найти фрагменты в базе данных известных функций и фрагментов.
Таким образом, в основном вам нужно создать компилятор, который выдаетКанонизированное представление его входных данных, аналогично P-коду, но желательно удобочитаемому человеку.
Некоторые фрагменты более характерны, чем другие, фрагмент
for (i=0; i < 12345; i++) {
array[i] = 54321;
}
Вероятно, произойдет в той или иной форме вкаждая программа.Он на 100% функционально идентичен
j=0;
while ( j < 12345) {
foobar[j++] = 54321;
}
, и компилятор, вероятно, выдаст идентичный код.
Могут быть различия в именах переменных, числовых константах, константах адреса, чем угодно.Но «скелет» ключевых слов (-> {сравнения, циклы, выражения, присваивания, вызовы функций}) будет таким же.Итак: не отбрасывайте ключевые слова, они являются основой программы.