Pregunta

¿Cómo difunto dos archivos binarios?

Tengo dos versiones de un programa, versión 1 y versión 2. He realizado un pequeño número de cambios entre las dos versión, pero desafortunadamente no he estado haciendo una copia de seguridad regularmente, por lo que tengo la fuente de la versión 2 , Solo tengo el binario de la versión 1. Necesito averiguar qué, exactamente, cambié entre las dos versiones. He intentado crear un objdump de las dos versiones y luego usar Diff para encontrar los cambios, pero eso no funciona porque las compensaciones son diferentes, por lo que Diff considera que casi todas las líneas han cambiado.

Por ejemplo, una línea podría ser bgez v0,4074d0<daemonize+0xd4> en la versión 1 y bgez v0,4073d4<daemonize+0xd4> En la versión 2. Estos se copian directamente de los archivos de volcado: puede ver que las dos líneas hacen lo mismo, pero Diff no puede distinguirlos. Los archivos son demasiado grandes para que examine cada línea manualmente; ¿Cómo detecto los cambios en la funcionalidad, al tiempo que ignoro las diferencias en el desplazamiento?

¿Fue útil?

Solución 2

Eventualmente resolví esto eliminando las instrucciones sin procesar y los marcadores de compensación, por lo que solo tuve el ensamblaje, luego usando SED para eliminar cada dígito y filtrando la diferencia para ignorar los cambios que consisten en solo 1 línea. Me sorprendió un poco que funcionara, pero lo hizo.

Otros consejos

Es posible. Actualmente estoy trabajando en un proyecto que es capaz de buscar direcciones de función y puntero de memoria desde un archivo compilado dentro de un archivo binario nuevo/modificado. Admite binarios de Windows PE y ELF en X86 y X86_64. También hay un artículo que describe el enfoque. Funciona bien para mi proyecto de inversión, donde tengo que actualizar todos los ganchos y direcciones de memoria con frecuencia cuando se realizan actualizaciones binarias. Pero también hay otros casos de uso.

Compruébalo aquí.

El truco es que no se basa en las comparaciones de texto débiles, desmonta los binarios y compara todas las funciones midiendo la distancia geométrica entre ellos utilizando métricas de código.

Respuesta corta: no puedes.

Respuesta larga: Escriba su propia diferencia que pueda ignorar uno o cualquiera de los operandos de los códigos OP si son un valor inmediato numérico.

Puede usar SED o AWK (o Perl o ...) para escribir un filtro para que todas las compensaciones sean idénticas antes de ejecutar Diff. Escribir dicho filtro se deja como un ejercicio para el lector. :-PAGS

Seguro algo como bsdiff haría el trabajo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top