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 calcoli matematici e alla fine sputa il risultato su un foglio di calcolo Excel che usiamo per continuare il nostro flusso di lavoro.

Voglio modificare le colonne, spaziare il formato 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 sia abbattere / decodificare il file .exe

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

  1. Sviluppato oltre 20 anni fa
  2. Lo sviluppatore si è ritirato 10 anni fa
  3. Applicazione GUI
  4. Funziona da solo
  5. Dimensione 500Kb

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


149
Sai qual è il calcolo che esegue? In tal caso, scrivi una nuova app, invia alcuni dati di test per verificare che quella nuova funzioni allo stesso modo, quindi elimina la vecchia. Quindi apporta le modifiche che desideri apportare.
David Arno,

13
Il commento di @DavidArno sarebbe una buona risposta. Il reverse engineering è possibile, ma riprogrammare e riscrivere l'app sarà molto più economico / facile / veloce.
Dan Pichelman,

44
L'altro modo per modificarlo sarebbe quello di prendere il risultato prodotto dal programma originale e filtrarlo in qualunque cosa tu voglia.
Blrfl,

9
@Alec se apri il file .exe con un editor esadecimale, potresti ottenere indizi su cosa è stato scritto. Ad esempio, il nome del compilatore potrebbe essere incorporato. Da lì saprai di più sulle possibili opzioni di decompilazione.
GrandmasterB,

26
In alternativa, potresti provare a trovare il signore che ha scritto la domanda e vedere se è disposto a entrare per un giorno o due (forse un paio d'ore al giorno) come consulente. Se è uno sviluppatore in pensione, c'è una moderata possibilità che possa apprezzare un po 'di soldi spesi al prezzo di $ 100-150 / ora mentre si sta godendo il momento di fare un po' di lavoro per un breve periodo se il tempo.
RLH,

Risposte:


234

Il reverse engineering può diventare molto difficile, anche di più se non si desidera solo comprendere la logica del programma, ma modificarla e ricompilarla. Quindi la prima cosa che vorrei provare è cercare una soluzione diversa.

Voglio modificare le colonne, il formato di spaziatura e aggiungere la logica VBA ecc. Sul foglio di calcolo di Excel

Se questa è 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 il tuo "exe" legacy, prende l'output e lo elabora ulteriore.


9
Perché il nuovo programma deve chiamare il vecchio EXE? Perché non rendere il nuovo programma indipendente e poi scrivere uno script che chiama entrambi e coordina l'output e l'input? La mia esperienza suggerisce che lasciare che i linguaggi della riga di comando come bash, PowerShell o prompt dei comandi gestiscano le coordinate del processo è generalmente più semplice che provare a codificarlo da soli in un linguaggio imperativo. Altrimenti, +1.
jpmc26,

8
@ jpmc26: è vero fino a quando non dovrai affrontare le assurde regole di quotazione di Bash. Sì, sono (principalmente) conformi a POSIX. No, non hanno alcun dannato senso. $ FOO non dovrebbe dividere le parole, per esempio.
Kevin,

16
@ jpmc26: non ho mai avuto problemi a chiamare subprocess.run(), personalmente.
Kevin,

3
@ jpmc26: quali tubazioni? È puro libro di cucina; se vuoi stdout, passi la PIPEcostante magica . Altrimenti, non lo fai e viene scartato. Cosa c'è da capire?
Kevin,

3
... dovrei aggiungere che ho usato Excel con VBA in passato come frontend per utility da riga di comando molto più volte. La struttura è sempre la stessa: un foglio per inserire i parametri come "UI di un uomo povero", un pulsante "Avvia" su quel foglio. Nel codice VBA, è necessario una Shellchiamata in Excel VBA come questa: stackoverflow.com/questions/8902022/… , è possibile reindirizzare lo stdout / stderr dall'utilità cmd in file separati e quindi applicare la formattazione dell'output.
Doc Brown,

114

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: ridurre la logica originale nel .exefile con ogni mezzo necessario. Decodificalo 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 lasciare che sia.

Il motivo che suggerisco è il seguente: hai ammesso che i calcoli sono molto complessi (secondo un ingegnere con cui hai parlato). È anche mission-critical. Quindi, se in qualche modo l'originale .exesmette di funzionare a causa di cambiamenti nelle piattaforme che hai (forse il supporto a 16 bit viene eliminato?), Hai appena perso una conoscenza mission-critical .

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

Come prima: se tale conoscenza è già disponibile, assicurati di scriverla in un formato che non andrà perso in qualunque momento presto. Altrimenti, recuperalo e scrivilo.


14
I decompilatori moderni in realtà producono codice che di solito è abbastanza leggibile, specialmente se l'origine originale era in semplice C o assemblatore e non in un linguaggio di livello superiore.
phyrfox,

4
Ottimo punto Inoltre: basta rattopparlo in modo che funzioni di nuovo funzionerà solo fino a quando non sarà necessario implementare la correzione successiva.
Daniel Jour,

33
@phyrfox 20 anni ... lo sviluppatore si è ritirato 10 anni fa ... solo l'output è un foglio di calcolo Excel ... ci metterei soldi su di esso essendo un'applicazione VB6.
J ...

10
@micaho: o la società esiste ancora e la persona con il know-how per verificare i risultati e le ipotesi nascoste è appena stata colpita da un camion. Naturalmente, si tratta di un rischio aziendale, quindi alla fine le parti interessate dovrebbero decidere. Volevo solo sottolineare che il "wrapper" funzionerà ora, ma si aggiunge solo al debito tecnico.
Sjoerd Job Postmus,

22
@J ...: Se è VB6, allora il poster originale è fortunato. È possibile recuperare il codice sorgente da una compilation VB6 abbastanza facilmente.
Eric Lippert,

74

Chiedi al programmatore originale, se possibile.

Qualche settimana 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.


52
Questo è il vero frutto appeso basso. Tutti (incluso me stesso) romanticizzano l'uso di dure capacità di programmazione come il reverse engineering, la reimplementazione della funzionalità del programma o l'aggiunta di livelli all'elaborazione dei dati. In realtà, il posto migliore da cui iniziare è un'e-mail amichevole che potrebbe tornare tra un'ora con la posizione del codice sorgente o qualche altra soluzione ideale.
user1717828,

2
Quando sono a casa con un'applicazione di 10 anni anche io accendo un disassemblatore ma durante l'orario di lavoro l'obiettivo è diverso ^^
Paolo

2
Ti ricordi qualcosa al riguardo? :)
Ángel,

2
ovviamente! sfortunatamente la società subisce 3 acquisizioni e unisce così tante informazioni andate perse e parte dei backup era nella borsa persa ... lo sviluppo era sul sito sui loro computer, quindi non ho una copia della fonte e il gioco è fatto.
Paolo,

1
Effettua la scansione di EXE per stringhe incorporate che potrebbero includere il nome di uno sviluppatore o qualcosa del genere. È più facile di un disassemblaggio completo!
JDługosz,

55

Qualche suggerimento quali opzioni ho per affrontare questo tipo di problemi?

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

Invece di modificare la casella nera a cui non è possibile accedere facilmente, si crea un nuovo programma che accetta l'output di Excel e modifica anche la formattazione / colonna . Quindi potresti creare un nuovo exe / script che chiama i due programmi in ordine, quindi all'utente finale sembra che ci sia un solo programma che fa tutto il lavoro, anche se sono due passaggi distinti sotto il cofano.


2
@Alec Il fatto che java sia un linguaggio adatto o meno dipende principalmente dalla quantità di dati che è necessario gestire / dalla quantità di calcolo che è necessario eseguire. Se entrambi sono bassi, java va bene. Se uno dei due è critico, è meglio passare a C o C ++. Ma poiché sembra che tu stia utilizzando solo una quantità di dati che si adatta comunque a un foglio di calcolo Excel, non penso che ci siano abbastanza dati coinvolti per rendere java una cattiva scelta (Excel probabilmente esploderà prima che la tua app lo faccia).
cmaster

18
@cmaster l'idea che Java sia proibitiva per il calcolo pesante è una nozione obsoleta. Il peggior benchmark elencato qui non è nemmeno 4x (la maggior parte è 2x o meno) e se uno scalare a una cifra è il tuo punto di rottura, i risparmi in termini di sicurezza (che si traducono direttamente in dollari degli sviluppatori) probabilmente compenseranno il calo delle prestazioni .
corsiKa

8
@Alec qualsiasi lingua funzionerà. VBA sembra una buona scelta perché si integra già così bene con Excel.
Captain Man,

4
@corsiKa Dipende interamente dalla scala della tua applicazione. Se una singola corsa consuma diverse decine di migliaia di ore di CPU, un fattore 2 o 4 diventa proibitivo: si traduce direttamente nella quantità di risultati che è possibile ottenere da una macchina multi-milioni. Inoltre, tali applicazioni in genere funzionano in sequenza, quindi la garbage collection è un vero veleno per le loro prestazioni, le piccole interruzioni si moltiplicerebbero per il numero di processi. Vi dico che esistono tali applicazioni e sicuramente non sono scritte in Java. Non vengono utilizzati dal business medio di Internet.
cmaster

7
@cmaster Stiamo parlando di alcuni semplici calcoli, non di un vero e proprio motore di gioco AAA con illuminazione globale in tempo reale, rendering basato fisicamente, occhioni di voxel sparce animati, simulazione del campo di fisica universale e simili. Senza offesa, ma inserire qualsiasi argomento Le prestazioni di RE qui sono cattive. La facilità d'uso dovrebbe essere la numero 1 e come persona che utilizza C ++ da alcuni anni è l'ultima lingua che consiglierei in questo caso.

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 applicano le competenze umane per renderlo utile (ad esempio dando alle variabili nomi appropriati).

Alcuni anni fa il mio datore di lavoro lo ha usato 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, avere la logica aziendale nascosta in un BLOB binario potrebbe essere un rischio continuo.


3

Scrivi un semplice wrapper attorno al programma, catturandone l'output. Non è complesso fare come molti linguaggi ( Java , C ++ , Python , .NET , per esempio) hanno mezzi per questo. Analizzare l'output e generarne un altro, nella forma desiderata. L'utente chiamerà il tuo nuovo programma. Il vecchio eseguibile rimarrà vicino ad esso, o può anche essere estratto automaticamente dalla risorsa, prima di invocarlo.

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

Che si tratti di un'applicazione GUI, non è un problema di blocco. È possibile avviarlo, generare output e quindi postarlo automaticamente al termine di questa GUI.


3
In cosa differisce dalla risposta più votata di Doc Brown?
Laf,

Non sono d'accordo con l'ipotesi che la risposta di Doc sia stata scritta male. È chiaro e succinto.
Albero

1
Se guardi nel testo di questa risposta, vedrai che l'unica parte informativa fa esattamente la fine dell'ultima frase "che chiama il tuo exe" exe ", prende l'output e lo elabora ulteriormente".
h22,

2
Non è un downvoter, e non capisco perché questo abbia -3 ... Meta è di nuovo? ma separatamente, sconsiglioi di infrangere la risposta di qualcun altro per "contiene molti blah che diluiscono il cervello" quando (A) è un giudizio soggettivo e (B) secondo la mia opinione soggettiva, la tua contiene proprio questo!
underscore_d

Questo può anche essere riscritto come "contiene discorsi generici non informativi che distraggono dall'argomento sprecando il tempo dei lettori", se in questo modo sembra più utile. Fornisce un suggerimento per l'approccio giusto nella seconda metà dell'ultima frase. Questo non aveva intenzione di essere offensivo. Commento rimosso.
h22

1

Scrivi alcuni test che esercitano il maggior numero possibile di casi sul vecchio codice. Trova casi angolari, prova input errato e test input corretto.

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

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

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


0

Prova a decodificare l'exe. Solo allo scopo di trovare la logica di calcolo o almeno per ottenere un giusto suggerimento su ciò che effettivamente fa e se il tuo reverse engineering può arrivare a quel punto, puoi scrivere una nuova applicazione basata su quella logica di calcolo. A parte questo, non vedo altra via d'uscita.

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


12
La datazione dell'ex non dovrebbe davvero importare
Ángel,

1
In effetti, con gli ottimizzatori che diventano più intelligenti ogni anno, il reverse engineering diventa solo più difficile.
Sali
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.