Come modificare l'output di un programma per il quale non si dispone del codice sorgente

89

Nella nostra azienda abbiamo un piccolo programma (dimensione .exe 500Kb) che esegue il calcolo matematico e alla fine sputa il risultato su un foglio di lavoro Excel che usiamo per continuare il nostro flusso di lavoro.

Voglio modificare le colonne, il formato di spaziatura e aggiungere la logica VBA, ecc. sul foglio di calcolo di Excel, ma poiché questi parametri non sono configurabili in quel programma, mi sembra che l'unico modo per modificarlo è quello di abbattere / decodificare l'exe

Nessuno sa in che lingua è stato programmato, l'unica cosa che sappiamo è:

  1. Sviluppato più di 20 anni fa
  2. Sviluppatore ritirato 10 anni fa
  3. Applicazione GUI
  4. Esegui standalone
  5. Dimensione 500 KB

Qualche suggerimento su quali opzioni devo affrontare questo tipo di problemi? Il reverse engineering è l'unica opzione o esiste un approccio migliore?

    
posta Alec 27.05.2016 - 16:03
fonte

8 risposte

233

Il reverse engineering può diventare molto difficile, ancora di più se non si vuole solo capire la logica del programma, ma cambiarlo e ricompilarlo. Quindi la prima cosa che proverei è cercare una soluzione diversa.

I want to modify the columns, spacing format and add VBA logic etc. on the Excel spreadsheet

Se quella è l'unica cosa che vuoi, e il calcolo fatto dal programma va bene, perché non scrivere un programma nella lingua che preferisci (forse una macro di Excel) che chiama la tua eredità "exe", prende l'output e lo elabora ulteriormente.

    
risposta data 27.05.2016 - 16:25
fonte
113

Oltre alle risposte già fornite da Doc Brown e Telastyn, vorrei suggerire un approccio alternativo (supponendo che sia mission critical).

Se non si conoscono i calcoli che esegue e i calcoli sono (in qualche modo) mission-critical: dedurre la logica originale nel file .exe con ogni mezzo necessario. Decodificarlo usando un decompilatore / disassemblatore come IDA se necessario. Assumere un consulente (o un gruppo di consulenti), se necessario.

Certo, aggiralo per ora usando la loro soluzione, ma non lasciartelo sfuggire.

La ragione che suggerisco è la seguente: hai ammesso che i calcoli sono molto complessi (secondo un ingegnere con cui hai parlato). È anche mission-critical. Quindi se in qualche modo il% originale co_de smette di funzionare a causa di cambiamenti nelle piattaforme che hai (forse il supporto a 16 bit viene rilasciato?), Hai appena perso un pezzo di conoscenza di importanza critica.

Ora, non sono preoccupato di perdere .exe , ma di perdere la conoscenza che codifica. Quella conoscenza deve essere recuperata.

Come prima: se questa conoscenza è già disponibile, assicurati di scriverla in un formato che non si perderà presto. Altrimenti, recuperalo e annotalo.

    
risposta data 27.05.2016 - 18:23
fonte
73

Chiedi al programmatore originale, se possibile.

Alcune settimane fa sono stato contattato da un'azienda che lavoravo 10 anni fa con la stessa domanda su un file mdb sviluppato a metà degli anni '90.

    
risposta data 27.05.2016 - 19:51
fonte
54

Any suggestions what options I have to deal with such kind of problems?

Se tutto quello che stai cercando di fare è modificare l'output, allora perché non usare semplicemente la composizione?

Invece di modificare la scatola nera a cui non puoi accedere facilmente, crei un nuovo programma che prende l'output di Excel, e la tua formattazione / colonna cambia anche . Quindi potresti creare un nuovo exe / script che richiami i due programmi in ordine, quindi all'utente finale risulta che c'è un solo programma che fa tutto il lavoro, anche se sono due passaggi distinti sotto il cofano.

    
risposta data 27.05.2016 - 16:25
fonte
3

Ci sono aziende specializzate esattamente in questo tipo di problema. Usano il codice proprietario per decompilare il codice nativo in un linguaggio di alto livello, quindi applicare l'esperienza umana per renderlo utile (ad esempio dando le variabili ai nomi appropriati).

Alcuni anni fa il mio datore di lavoro ha usato questo per migrare un codice mainframe S / 390 nativo su server Linux. Abbiamo dato loro un binario, ci hanno dato il codice sorgente in C.

Se questo è necessario nel tuo caso, dipende da te. Se ti interessa solo il formato dell'output, puoi semplicemente massaggiare l'output dopo che è stato prodotto. Tuttavia, come altri hanno sottolineato, la logica di business nascosta in un blob binario potrebbe rappresentare un rischio continuo.

    
risposta data 31.05.2016 - 12:40
fonte
3

Scrivi un semplice wrapper attorno al programma, catturandone l'output. Non è complicato fare il maggior numero di lingue ( Java , C ++ , Python , .NET , ad esempio) hanno mezzi per questo. Analizza l'output e genera un altro, nella forma desiderata. L'utente chiamerà il tuo nuovo programma. Il vecchio eseguibile rimarrà accanto ad esso, o addirittura può essere estratto automaticamente dalla risorsa, prima di invocarlo.

Questa soluzione, naturalmente, funziona abbastanza bene solo quando l'output è ben strutturato e facile da analizzare.

Che si tratta di un'applicazione GUI, non è un problema di blocco. Puoi avviarlo, generare output e quindi postarlo automaticamente quando termina questa interfaccia grafica.

    
risposta data 30.05.2016 - 16:21
fonte
1

Scrivi alcuni test che esercitano quanti più casi possibili sul vecchio codice. Trova casi d'angolo, verifica l'input sbagliato e verifica l'input corretto.

Riduci l'output corretto in vari casi, quindi prova a scrivere un'implementazione che soddisfi gli stessi test .

Non vorrei scendere lungo il percorso di reverse engineering. È incredibilmente complicato invertire il codice macchina e dovresti già sapere qual è lo scopo dell'exe. Il reverse engineering è un po 'troppo lavoro per quello che cerchi.

Se il software è stato sviluppato da un tizio 20 anni fa, probabilmente non è qualcosa che richiede molta potenza moderna. Un programma GUI che ha allungato la macchina 20 anni fa registrerà a malapena su una macchina moderna, quindi probabilmente stai guardando qualcosa che è relativamente semplice da riprodurre.

    
risposta data 31.05.2016 - 12:16
fonte
0

Prova a decodificare l'exe. Solo allo scopo di trovare la logica di calcolo o almeno avere un chiaro suggerimento su ciò che effettivamente fa e se il tuo reverse engineering può portarti a quel punto, puoi scrivere una nuova applicazione basata su quella logica di calcolo. A parte questo, non vedo altri wayout.

Più facile a dirsi che a farsi, il reverse engineering di un exe creato 20 anni fa è una vera sfida.

    
risposta data 27.05.2016 - 19:20
fonte

Leggi altre domande sui tag