Se puede hacer ingeniería inversa de un software/programas?

La respuesta general es sí. La dificultad oscila entre fácil y muy difícil. Se pueden desensamblar muchos programas compilados. Si el proyecto fue construido sin despojar las tablas de símbolos, la salida del desensamblador puede ser muy informativa.

Yo despojo los símbolos de mis cargas de Elixir de producción por esta razón. Con la tabla de símbolos incluida, la salida desensamblada reproduce el código cerca de la fuente original. Sin los símbolos, no se puede ver mucho.

En el pasado, he utilizado herramientas para extraer archivos de recursos (imágenes, iconos, audio) de las aplicaciones de Windows. Eso fue hace un tiempo. No estoy seguro del estado de las cosas últimamente ya que me he mudado a un mac.

Hace mucho tiempo, escribí un emulador para un procesador que lo que todavía se está desarrollando. Tenía un ensamblador para el procesador que imprimía el código ensamblador con los códigos de operación generados. Tomé los opcodes, los convertí a binario y busqué los patrones de posición de los bits para entender qué bits controlaban r/w, branch, registros, etc. Con esto, pude escribir un simulador para probar mi ensamblaje antes de que llegaran los prototipos del procesador. El caso es que tuve que bajar a binario para realizar esa tarea.

Sospecharía que hay herramientas por ahí para este tipo de cosas. Nunca las he investigado antes.