У меня есть двоичный файл A , который представляет собой отладочную сборку с сопровождающими символами - созданную много лет назад.У меня также есть двоичный файл B , сборка релиза без сопровождающих символов и намного более поздняя версия.Я ищу наиболее эффективный метод сопоставления символов из двоичного A с потенциальными кандидатами в двоичном B .
Учитывая, что сборка отладки значительно больше (делаетбольше проверки ввода, печатает больше вещей в stderr
и т. д.) и что функции неизменно меняются со временем, я полагаю, что попытка снять отпечатки пальцев с отдельных функций будет напрасной тратой времени.- совершенно невесело, так что я могу лаять не на то дерево - что лучший способ снять отпечатки пальцев с функций - создать графы вызовов обоих двоичных файлов и попытаться сопоставить их с вершинами (то есть с функциями).
Я уже выполнил некоторую предварительную обработку, поэтому у меня есть следующие структуры данных:
# binary A
[[60, 60, 8734], # function 0 is called by functions 60 (twice) and 8734
[193, 441, 505], # function 1 is called by functions 193, 441 and 505
[193, 742],
[23],
[21],
[21],
[26],
[26, 1508, 1509, 1573],
[24],
[25],
...] # (~10k functions)
# binary B
[[8999], # function 0 is called by function 8999
[9016], # function 1 is called by function 9016
[1126],
[7904, 7904, 7913],
[182, 336, 396, 396],
[9010],
[407],
[182, 632],
[20],
[24],
...] # (~10k functions)
Важное замечание, которое необходимо уловить, заключается в том, что в функции "0" нет соответствия no двоичный файл A и функция "0" в двоичном формате B .Это произвольные идентификаторы, которые я назначил каждой функции в каждом двоичном файле.
Следующий шаг - это то, что смущает меня.Мой алгоритм фу очень слабый, и я не могу придумать, как правильно поступить.Мое (очень ограниченное) понимание состоит в том, что для решения этой проблемы я бы хотел использовать некую форму неточного сопоставления графов .Другими словами, какой набор отображений Ai -> Bi максимизирует сходство двух графов вызовов?
Учитывая, что в двоичном коде есть дополнительные функции отладки A и очевидный факт, чтопрограммы развиваются с течением времени, скорее всего, нет точного соответствия.В идеале я хотел бы получить вывод вида:
[[(37, 0.998), (8432, 0.912), (442, 0.75)], # matching-ness of function "0" in binary A with function "37" in binary B is 0.998, second most likely candidate is function "8432" in binary B with score 0.912, etc.
[(42, 0.973), (7751, 0.788)], # matching-ness of function "1" in binary A with function "42" in binary B is 0.973, second most likely candidate is function "7751" in binary B with score 0.788, etc.
[(4579, 0.996), (123, 0.934)],
...] # around ~10k mappings
На самом деле, я был бы счастлив, если бы мне пришлось обойтись только с одним кандидатом, а рейтинг не был предоставлен, но можно мечтать.
Есть ли у кого-нибудь из SO-идей идея, с чего мне начать?