Question

Comment puis-je diff deux fichiers binaires?

J'ai deux versions d'un programme, la version 1 et la version 2. J'ai fait un petit nombre de changements entre les deux versions, mais malheureusement, ne sont pas la sauvegarde régulièrement, et donc bien que j'ai la source pour la version 2, je n'ai que le binaire de la version 1. J'ai besoin de savoir quoi, exactement, j'ai changé entre les deux versions. Je l'ai essayé de créer un objdump des deux versions, puis en utilisant diff pour trouver les changements, mais qui ne fonctionne pas parce que les compensations sont différentes, et ainsi de diff considère presque toutes les lignes avoir changé.

Par exemple, une ligne peut être bgez v0,4074d0<daemonize+0xd4> dans la version 1 et bgez v0,4073d4<daemonize+0xd4> dans la version 2. Ces fichiers sont copiés directement à partir des fichiers de sauvegarde - vous pouvez voir les deux lignes font la même chose, mais diff ne peut pas les distinguer. Les fichiers sont trop gros pour moi d'examiner toutes les lignes manuellement; Comment puis-je détecter les changements de fonctionnalité, tout en ignorant les différences de décalage?

Était-ce utile?

La solution 2

I finalement résolu ce problème en retirant les instructions de base et les marqueurs de décalage de sorte que j'eu l'assemblage, puis en utilisant sed pour dépouiller chaque chiffre, et la filtration de diff pour ignorer les modifications consistant en une seule ligne. Je suis un peu surpris que cela a fonctionné, mais il l'a fait.

Autres conseils

Il est possible. Je travaille actuellement sur un projet qui est capable de rechercher des adresses de fonction et pointeur de la mémoire à partir d'un fichier compilé dans un nouveau / fichier binaire modifié. Il prend en charge Windows PE et les binaires ELF sur x86 et x86_64. Il y a aussi un document décrivant l'approche. Il fonctionne bien pour mon projet de recul, où je dois mettre à jour tous les crochets et les adresses mémoire fréquemment lorsque des mises à jour binaires sont faits. Mais il y a d'autres cas d'utilisation aussi bien.

Check it out ici.

L'astuce est qu'il ne repose pas sur des comparaisons de texte faibles, il désassemble les binaires et compare toutes les fonctions en mesurant la distance géométrique entre les utilisant métriques de code.

Réponse courte:. Vous ne pouvez pas

Réponse longue:. Écrire votre propre diff qui peut ignorer un ou l'une des opérandes des opcodes si elles sont une valeur immédiate numérique

Vous pouvez utiliser sed ou awk (ou perl ou ...) pour écrire un filtre pour faire tous les décalages identiques avant d'exécuter diff. L'écriture d'un tel filtre est laissé en exercice au lecteur. :-P

Bien sûr, quelque chose comme bsdiff ferait le travail?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top