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 hace 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 la 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 mediante la descomposición / ingeniería inversa. el .exe

Nadie sabe en qué idioma fue programado, lo único que sabemos es:

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

¿Alguna sugerencia sobre qué opciones tengo para enfrentar este tipo de problemas? ¿La ingeniería inversa es la única opción o existe un mejor enfoque?

    
pregunta Alec 27.05.2016 - 16:03

8 respuestas

233

La ingeniería inversa puede llegar a ser muy difícil, incluso más si no solo quieres entender la lógica del programa, sino cambiarla y recompilarla. Lo primero que intentaría es buscar una solución diferente.

  

Quiero modificar las columnas, el formato de espaciado y agregar la 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 la salida? y lo procesa aún más.

    
respondido por el Doc Brown 27.05.2016 - 16:25
113

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 archivo .exe por cualquier medio que sea necesario. Descodifíquelo utilizando un descompilador / desensamblador como IDA si es necesario. Contrate un consultor (o un lote de consultores) si es necesario.

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

La razón que sugiero es la siguiente: Usted 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 .exe original deja de funcionar debido a los cambios en las plataformas que tiene (¿se puede perder el soporte de 16 bits?), Acaba de perder una parte de conocimiento de misión crítica.

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

Igual que antes: si ese conocimiento ya está disponible, asegúrese de escribirlo en un formato que no se pierda en el corto plazo. De lo contrario, recupéralo y escríbelo.

    
respondido por el Sjoerd Job Postmus 27.05.2016 - 18:23
73

Pregunte al programador original, si es posible.

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

    
respondido por el Paolo 27.05.2016 - 19:51
54
  

¿Alguna sugerencia sobre qué opciones tengo para enfrentar este tipo de problemas?

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

En lugar de modificar la caja negra a la que no puede acceder fácilmente, crea un programa nuevo que toma la salida de Excel y realiza cambios de formato / columna también . Luego, podría crear un nuevo archivo exe / script que llame a los dos programas en orden, de modo que el usuario final se dé cuenta de que solo hay un programa que realiza todo el trabajo, aunque haya dos pasos distintos bajo el capó.

    
respondido por el Telastyn 27.05.2016 - 16:25
3

Hay empresas que se especializan en este tipo de problemas. Utilizan código de propiedad para descompilar el código nativo en un lenguaje de alto nivel, luego aplican la pericia humana para hacerlo útil (por ejemplo, dar nombres apropiados a las variables).

Hace algunos años, mi empleador usó esto para migrar algunos códigos nativos de mainframe S / 390 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, puede simplemente masajear la salida después de que se haya producido. Sin embargo, como han señalado otros, tener la lógica empresarial oculta en una burbuja binaria podría ser un riesgo continuo.

    
respondido por el slim 31.05.2016 - 12:40
3

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

Por supuesto, esta solución funciona lo suficientemente bien solo cuando la salida está bien estructurada, por lo que es fácil de analizar.

Que es una aplicación GUI, no es un problema de bloqueo. Puede iniciarlo, generar resultados y, a continuación, procesarlo de forma automática cuando finalice esta GUI.

    
respondido por el h22 30.05.2016 - 16:21
1

Escriba algunas pruebas que ejerzan tantos casos como sea posible en el código anterior. Encuentre casos de esquina, pruebe la entrada incorrecta y pruebe la entrada correcta.

Determine cuál es el resultado correcto en 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 debería 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 individuo 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 fácil de reproducir.

    
respondido por el Carlos 31.05.2016 - 12:16
0

Intenta aplicar ingeniería inversa al exe. Solo con el propósito de encontrar la lógica de cómputo o al menos obtener una pista justa 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ómputo. Aparte de eso, no veo otra salida.

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

    
respondido por el Mukesh Adhvaryu 27.05.2016 - 19:20

Lea otras preguntas en las etiquetas