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:
- Desarrollado hace más de 20 años
- Desarrollador retirado hace 10 años
- Aplicación GUI
- Corre independiente
- 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?
Respuestas:
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.
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.
fuente
subprocess.run()
, personalmente.PIPE
constante mágica . De lo contrario, no lo hace y se descarta. ¿Qué hay para entender?Shell
llamada 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.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
.exe
archivo 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
.exe
deja 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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente