Cómo modificar la salida de un programa para el que no tiene el código fuente

89

En nuestra empresa, tenemos un pequeño programa (tamaño .exe 500Kb) que realiza cálculos matemáticos y al final escupe el resultado en una hoja de cálculo de Excel que utilizamos para continuar nuestro flujo de trabajo.

Quiero modificar las columnas, el formato de espaciado y agregar lógica VBA, etc. en la hoja de cálculo de Excel, pero dado que estos parámetros no son configurables en ese programa, me parece que la única forma de modificarlo es descomponer / aplicar ingeniería inversa al .exe

Nadie sabe en qué idioma se programó, lo único que sabemos es:

  1. Desarrollado hace más de 20 años
  2. Desarrollador retirado hace 10 años
  3. Aplicación GUI
  4. Corre independiente
  5. Tamaño 500Kb

¿Alguna sugerencia de qué opciones tengo para hacer frente a este tipo de problemas? ¿Es la ingeniería inversa la única opción, o hay un mejor enfoque?

Alec
fuente
149
¿Sabes cuál es el cálculo que realiza? Si es así, escriba una nueva aplicación, inserte algunos datos de prueba a través de ambos para verificar que la nueva funcione de la misma manera, luego deseche la anterior. Luego haga los cambios que desea hacer.
David Arno
13
El comentario de @DavidArno sería una buena respuesta. La ingeniería inversa es posible, pero volver a especificar y reescribir la aplicación será mucho más barata / fácil / rápida.
Dan Pichelman
44
La otra forma de modificarlo sería tomar el resultado que produce el programa original y filtrarlo en lo que desee.
Blrfl
99
@Alec si abre el archivo .exe con un editor hexadecimal, puede obtener pistas sobre lo que se escribió. Por ejemplo, el nombre del compilador podría estar incrustado. A partir de ahí, sabrá más sobre las posibles opciones de descompilación.
GrandmasterB
26
Alternativamente, podría intentar encontrar al caballero que escribió la solicitud y ver si está dispuesto a venir por un día o dos (tal vez un par de horas cada día) como consultor. Si es un desarrollador retirado, existe una posibilidad moderada de que pueda apreciar un poco de dinero gastado a razón de $ 100-150 / h mientras disfruta el momento de hacer un poco de trabajo por un breve período de tiempo.
RLH

Respuestas:

234

La ingeniería inversa puede volverse muy difícil, incluso más si no solo quiere comprender la lógica del programa, sino cambiarlo y recompilarlo. Entonces, lo primero que intentaré es buscar una solución diferente.

Quiero modificar las columnas, el formato de espaciado y agregar lógica VBA, etc. en la hoja de cálculo de Excel

Si eso es lo único que desea, y el cálculo realizado por el programa está bien, ¿por qué no escribir un programa en el idioma de su elección (tal vez una macro de Excel) que llama a su legado "exe", toma el resultado y lo procesa promover, adicional.

Doc Brown
fuente
99
¿Por qué el nuevo programa tiene que llamar al antiguo EXE? ¿Por qué no simplemente hacer que el nuevo programa sea independiente y luego escribir un script que llame a ambos y coordine la salida y la entrada? Mi experiencia sugiere que permitir que los lenguajes de línea de comandos como bash, PowerShell o símbolo del sistema manejen las coordenadas del proceso es generalmente más simple que intentar codificarlo usted mismo en un lenguaje imperativo. De lo contrario, +1.
jpmc26
8
@ jpmc26: Eso es cierto hasta que tienes que lidiar con las absurdas reglas de cotización de Bash. Sí, son (en su mayoría) compatibles con POSIX. No, no tienen ningún sentido. $ FOO no debe dividir palabras, por ejemplo.
Kevin
16
@ jpmc26: Nunca he tenido problemas para llamar subprocess.run(), personalmente.
Kevin
3
@ jpmc26: ¿Qué tuberías? Es puro libro de cocina; si quieres stdout, pasas la PIPEconstante mágica . De lo contrario, no lo hace y se descarta. ¿Qué hay para entender?
Kevin
3
... Debo agregar que utilicé Excel con VBA en el pasado como interfaz para las utilidades de línea de comandos con mucho éxito más de una vez. La estructura es siempre la misma: una hoja para ingresar los parámetros como "interfaz de usuario pobre", un botón "Inicio" en esa hoja. En el código VBA, se necesita una Shellllamada en Excel VBA como esta: stackoverflow.com/questions/8902022/… , se puede canalizar el stdout / stderr de la utilidad cmd en archivos separados y luego aplicar el formato de salida.
Doc Brown
114

Además de las respuestas ya dadas por Doc Brown y Telastyn, me gustaría sugerir un enfoque alternativo (bajo el supuesto de que es de misión crítica).

Si no conoce los cálculos que realiza y los cálculos son (algo) críticos para la misión: Deduzca la lógica original en el .exearchivo por cualquier medio necesario. Descifrarlo usando un descompilador / desensamblador como IDA si es necesario. Contratar a un consultor (o un grupo de consultores) si es necesario.

Claro, evítelo por ahora usando su solución, pero no lo deje.

La razón que sugiero es la siguiente: ha admitido que los cálculos son muy complejos (según un ingeniero con el que habló). También es de misión crítica. Entonces, si de alguna manera el original .exedeja de funcionar debido a los cambios en las plataformas que tiene (¿tal vez se dejó caer el soporte de 16 bits?), Acaba de perder un conocimiento de misión crítica .

Ahora, no me preocupa perderlo .exe, sino perder el conocimiento que codifica. Ese conocimiento debe ser recuperado.

Como antes: si ese conocimiento ya está disponible, asegúrese de escribirlo en un formato que no se perderá pronto. De lo contrario, recupérelo y anótelo.

Sjoerd Job Postmus
fuente
14
Los descompiladores modernos en realidad producen código que generalmente es bastante legible, especialmente si la fuente original estaba en C simple o ensamblador, y no en un lenguaje de nivel superior.
phyrfox
44
Muy buen punto. Además: solo parcharlo para que funcione nuevamente solo funcionará hasta que sea necesario implementar la siguiente solución.
Daniel Jour
33
@phyrfox 20 años ... el desarrollador se retiró hace 10 años ... solo el resultado es una hoja de cálculo de Excel ... Apostaría a que sea una aplicación VB6.
J ...
10
@micaho: o la empresa aún existe y la persona con el conocimiento para verificar los resultados y las suposiciones ocultas acaba de ser golpeada por un camión. Por supuesto, es un riesgo comercial, por lo que, en última instancia, las partes interesadas deberían decidir. Solo quería enfatizar que el "envoltorio" funcionará ahora, pero solo se suma a la deuda técnica.
Sjoerd Job Postmus
22
@J ...: si es VB6, entonces el póster original está de enhorabuena. Puede recuperar el código fuente de una compilación VB6 con bastante facilidad.
Eric Lippert
74

Pregunte al programador original, si es posible.

Hace unas semanas, una empresa en la que solía trabajar hace 10 años me contactó con la misma pregunta sobre un archivo mdb desarrollado a mediados de los 90.

Paolo
fuente
52
Esta es la verdadera fruta baja. Todos (incluido yo mismo) idealizamos el uso de habilidades de programación difíciles como la ingeniería inversa, reimplementando la funcionalidad del programa o agregando capas al procesamiento de datos. En realidad, el mejor lugar para comenzar es un correo electrónico amigable que podría volver en una hora con la ubicación del código fuente o alguna otra solución ideal.
user1717828
2
Cuando estoy en casa con una aplicación de 10 años, yo también enciendo un desensamblador, pero durante las horas de trabajo el objetivo es diferente ^^
Paolo
2
¿Recuerdas algo al respecto? :)
Ángel
2
¡por supuesto! desafortunadamente, la compañía se sometió a 3 adquisiciones y fusiones, por lo que se perdió mucha información y parte de las copias de seguridad estaban en la bolsa perdida ... el desarrollo estaba en el sitio en sus máquinas, así que no tengo una copia de la fuente y eso es todo.
Paolo
1
Escanee el EXE en busca de cadenas incrustadas que puedan incluir el nombre de un desarrollador o algo así. ¡Eso es más fácil que un desmontaje completo!
JDługosz
55

¿Alguna sugerencia de qué opciones tengo para hacer frente a este tipo de problemas?

Si todo lo que quiere hacer es modificar la salida, ¿por qué no simplemente usar composición?

En lugar de modificar el cuadro negro al que no puede acceder fácilmente, crea un nuevo programa que toma la salida de Excel y también cambia el formato / columna . Luego, podría hacer un nuevo exe / script que llame a los dos programas en orden, de modo que el usuario final considere que solo hay un programa que hace todo el trabajo, a pesar de que son dos pasos distintos.

Telastyn
fuente
2
@Alec Si Java es un lenguaje adecuado o no depende principalmente de la cantidad de datos que necesita manejar / la cantidad de cómputo que necesita hacer. Si ambos son bajos, Java está bien. Si alguno de los dos es crítico, es mejor que bajes a C o C ++. Pero dado que parece que solo está utilizando una cantidad de datos que se ajusta a una hoja de cálculo de Excel de todos modos, no creo que haya suficientes datos involucrados para hacer de Java una mala elección (Excel probablemente explotaría antes que su aplicación).
cmaster
18
@cmaster, la idea de que Java es prohibitivo para el cálculo pesado es una noción desactualizada. El peor punto de referencia enumerado aquí no es ni siquiera 4x (la mayoría son 2x o menos) y si un escalar de un solo dígito es su punto de ruptura, los ahorros en seguridad (que se traducen directamente en dólares del desarrollador) probablemente compensarán el impacto en el rendimiento .
corsiKa
8
@Alec cualquier idioma funcionará. VBA parece una buena opción porque ya se integra muy bien con Excel.
Capitán Man
44
@corsiKa Eso depende completamente de la escala de su aplicación. Si una sola ejecución consume varias decenas de miles de horas de CPU, un factor de 2 o 4 se vuelve prohibitivo: se traduce directamente en la cantidad de resultados que puede obtener de una máquina multimillonaria. Además, tales aplicaciones generalmente funcionan de manera sincronizada, por lo que la recolección de basura es un veneno puro para su desempeño, las pequeñas interrupciones se multiplicarían por la cantidad de procesos. Te digo que tales aplicaciones existen, y ciertamente no están escritas en Java. Simplemente no son utilizados por el negocio promedio de internet.
cmaster
77
@cmaster Estamos hablando de algunos cálculos simples, no de un motor de juego AAA completo con iluminación global en tiempo real, renderizado basado en la física, octrees voxel de sparce animados, simulación de campo de física universal y similares. Sin ofender, pero insertar cualquier argumento de rendimiento RE aquí es malo. La facilidad de uso debe ser la n. ° 1, y como alguien que ha estado usando C ++ durante algunos años, es el último idioma que recomendaría en este caso.
3

Hay empresas que se especializan en exactamente este tipo de problema. Usan código propietario para descompilar el código nativo en un lenguaje de alto nivel, luego aplican la experiencia humana para que sea útil (por ejemplo, dar nombres apropiados a las variables).

Hace algunos años, mi empleador usó esto para migrar un código de sistema principal S / 390 nativo a servidores Linux. Les dimos un binario, nos dieron el código fuente en C.

Si esto es necesario en su caso, depende de usted. Si solo le importa el formato de la salida, simplemente puede masajear la salida después de que se haya producido. Sin embargo, como otros han señalado, tener una lógica de negocios oculta en un blob binario podría ser un riesgo continuo.

Delgado
fuente
3

Escriba un contenedor simple alrededor del programa, capturando su salida. No es complejo hacer tantos lenguajes ( Java , C ++ , Python , .NET , por ejemplo) tienen medios para esto. Analice la salida y genere otra, en la forma deseada. El usuario llamará a su nuevo programa. El antiguo ejecutable permanecerá junto a él, o incluso se puede extraer automáticamente del recurso, antes de invocarlo.

Esta solución, por supuesto, funciona lo suficientemente bien solo cuando la salida está bien estructurada y es tan fácil de analizar.

Que es una aplicación GUI, no es un problema de bloqueo. Puede iniciarlo, generar resultados y luego publicarlo automáticamente cuando finalice esta GUI.

h22
fuente
3
¿Cómo es esto diferente de la respuesta más votada de Doc Brown?
Laf
No estoy de acuerdo con la suposición de que la respuesta de Doc está mal escrita. Es claro y conciso.
Mástil
1
Si examina el texto de esta respuesta, verá que la única parte informativa hace exactamente el final de la última oración "que llama a su legado" exe ", lleva el resultado y lo procesa más allá".
h22
2
No es un votante negativo, y no veo por qué esto obtuvo -3 ... ¿Meta está de nuevo? pero por separado, recomendaría no criticar la respuesta de otra persona para "contiene mucho bla que diluye el cerebro" cuando (A) es un juicio subjetivo y (B) en mi opinión subjetiva, ¡la tuya contiene exactamente eso!
underscore_d
Esto también se puede reescribir como "contiene charlas genéricas no informativas que solo distraen del tema que pierde el tiempo de los lectores", si esa forma parece más útil. Proporciona una pista sobre el enfoque correcto en la segunda mitad de la última oración. Esto no tenía intención de ser insultante. Comentario eliminado
h22
1

Escriba algunas pruebas que ejerciten tantos casos como sea posible en el código anterior. Encuentre casos de esquina, pruebe entradas incorrectas y pruebe entradas correctas.

Anote cuál es la salida correcta dados varios casos, y luego intente escribir una implementación que satisfaga las mismas pruebas .

No iría por la ruta de ingeniería inversa. Es increíblemente complicado invertir el código de la máquina, y ya debe saber cuál es el propósito del exe. La ingeniería inversa es demasiado trabajo para lo que buscas.

Si el software fue desarrollado por un tipo hace 20 años, probablemente no sea algo que requiera mucho poder moderno. Un programa GUI que extendió la máquina hace 20 años apenas se registrará en una máquina moderna, por lo que probablemente esté viendo algo que es relativamente simple de reproducir.

Carlos
fuente
0

Intenta realizar ingeniería inversa en el exe. Solo con el propósito de encontrar la lógica de cálculo o al menos para tener una idea clara de lo que realmente hace y si su ingeniería inversa puede llevarlo a ese punto, puede escribir una nueva aplicación basada en esa lógica de cálculo. Aparte de eso, no veo otra salida.

Es más fácil decirlo que hacerlo, la ingeniería inversa, un exe creado hace 20 años, es un verdadero desafío.

Mukesh Adhvaryu
fuente
12
La datación del ejecutivo no debería importar realmente
Ángel
1
De hecho, con los optimizadores cada vez más inteligentes, la ingeniería inversa solo se vuelve más difícil.
MSalters