Podrías ir a la página del programa y ver el típico archivo changes.txt que explica los cambios que efectúa en cada versión. Claro que no siempre lo escriben... en ese caso lo lógico sería desensamblar y mirar el código en ensamblador, si no sabes ensamblador utiliza un descompilador, que lo que hace es primero desensamblar y este código traducirlo a las instrucciones más probables en el lenguaje para el que está diseñado el descompilador (si es un descompilador para C lo hará en C). El problema es que cada lenguaje se traduce a ensamblador de manera distinta, un código ensamblador proveniente de C no tiene el mismo método para por ejemplo entrar a una función o salir de ella que el que utiliza uno de (yo que sé) Lisp.
De modo que debes identificar en qué lenguaje puede estar hecho y descompilarlo, si utilizas un descompilador incorrecto el código será imposible de leer. Sin embargo te advierto que aun empleando el correcto esto no es perfecto, obtendrás un código muy enrevesado, aunque no será tan doloroso a la vista como con uno incorrecto.
Se me ocurre también que la mayor parte de los programas incluyen un texto como manual, si no lo incluye también puedes probar a ejecutarlo desde la terminal con el argumento "-h" o "--help", si no funciona puedes intentar hacerte una idea de su funcionamiento mediante la utilidad objdump en linux ejecutando:
objdump -s -j .data archivo.exe
Con esto volcarás todos los valores en la sección .data del ejecutable, ahí es donde más probablemente se almacenen las cadenas de caracteres.
EDITO: Qué casualidad, leyendo el blog de esta página he encontrado esto, que es seguramente lo que buscas
http://blog.elhacker.net/2016/03/la-herramienta-bindiff-es-ahora-gratuita.html