So ändern Sie die Ausgabe eines Programms, für das Sie nicht über den Quellcode verfügen

89

In unserem Unternehmen haben wir ein kleines Programm (.exe, 500 KB groß), das mathematische Berechnungen durchführt und am Ende das Ergebnis in einer Excel-Tabelle ausgibt, mit der wir unseren Workflow fortsetzen.

Ich möchte die Spalten, das Abstandsformat und die VBA-Logik usw. in der Excel-Tabelle ändern, aber da diese Parameter in diesem Programm nicht konfigurierbar sind, scheint es mir die einzige Möglichkeit zu sein, sie zu ändern, indem die EXE-Datei heruntergefahren / zurückentwickelt wird

Niemand weiß in welcher Sprache es programmiert wurde, das einzige was wir wissen ist:

  1. Vor über 20 Jahren entwickelt
  2. Developer ist vor 10 Jahren in den Ruhestand getreten
  3. GUI-Anwendung
  4. Läuft eigenständig
  5. Größe 500 KB

Irgendwelche Vorschläge, welche Optionen ich habe, um mit solchen Problemen umzugehen? Ist Reverse Engineering die einzige Option oder gibt es einen besseren Ansatz?

Alec
quelle
149
Wissen Sie, was die Berechnung ist, die sie durchführt? Wenn ja, schreibe eine neue App, schiebe einige Testdaten durch beide, um zu überprüfen, ob die neue gleich funktioniert, und wirf dann die alte weg. Nehmen Sie dann die gewünschten Änderungen vor.
David Arno
13
Der Kommentar von @DavidArno wäre eine gute Antwort. Reverse Engineering ist möglich, aber das Neuspezifizieren und Neuschreiben der App wird viel billiger / einfacher / schneller sein.
Dan Pichelman
44
Die andere Möglichkeit, dies zu ändern, besteht darin, das vom Originalprogramm erzeugte Ergebnis zu verwenden und es nach Ihren Wünschen zu filtern.
Blrfl
9
@Alec Wenn Sie die EXE-Datei mit einem Hex-Editor öffnen, erhalten Sie möglicherweise Hinweise darauf, in was sie geschrieben wurde. Beispielsweise kann der Compilername eingebettet sein. Von dort aus erfahren Sie mehr über mögliche Dekompilierungsoptionen.
GroßmeisterB
26
Alternativ können Sie versuchen, den Gentleman zu finden, der den Antrag geschrieben hat, und prüfen, ob er bereit ist, für ein oder zwei Tage (möglicherweise ein paar Stunden pro Tag) als Berater zu erscheinen. Wenn er ein pensionierter Entwickler ist, besteht eine mäßige Wahrscheinlichkeit, dass er ein wenig Geld in Höhe von 100-150 US-Dollar pro Stunde schätzt, während er tatsächlich den Moment genießt, ein bisschen Arbeit für eine kurze Zeit zu erledigen, wenn es Zeit ist.
RLH

Antworten:

234

Reverse Engineering kann sehr schwierig werden, umso mehr, wenn Sie die Logik des Programms nicht nur verstehen, sondern ändern und neu kompilieren möchten. Als erstes würde ich versuchen, nach einer anderen Lösung zu suchen.

Ich möchte die Spalten, das Abstandsformat und die VBA-Logik usw. in der Excel-Tabelle ändern

Wenn das das einzige ist, was Sie wollen und die Berechnung durch das Programm in Ordnung ist, warum schreiben Sie nicht ein Programm in der Sprache Ihrer Wahl (vielleicht ein Excel-Makro), das Ihr Erbe "exe" aufruft, die Ausgabe aufnimmt und verarbeitet des Weiteren.

Doc Brown
quelle
9
Warum muss das neue Programm die alte EXE aufrufen? Warum nicht einfach das neue Programm unabhängig machen und dann ein Skript schreiben, das beides aufruft und die Ausgabe und Eingabe koordiniert? Meiner Erfahrung nach ist es im Allgemeinen einfacher, Befehlszeilensprachen wie Bash, PowerShell oder die Eingabeaufforderung mit Prozesskoordinaten umgehen zu lassen, als zu versuchen, sie selbst in einer imperativen Sprache zu codieren. Andernfalls +1.
jpmc26
8
@ jpmc26: Das stimmt, bis du dich mit den absurden Zitierregeln von Bash auseinandersetzen musst. Ja, sie sind (meistens) POSIX-konform. Nein, sie ergeben keinen gottverdammten Sinn. Zum Beispiel sollte $ FOO kein Wort teilen.
Kevin
16
@ jpmc26: Ich hatte noch nie Probleme subprocess.run(), persönlich anzurufen .
Kevin
3
@ jpmc26: Welche Rohrleitungen? Es ist ein reines Kochbuch; Wenn Sie stdout wollen, übergeben Sie die magische PIPEKonstante. Andernfalls wird es verworfen. Was gibt es zu verstehen?
Kevin
3
... Ich sollte hinzufügen, dass ich Excel mit VBA in der Vergangenheit mehr als einmal sehr erfolgreich als Frontend für Befehlszeilendienstprogramme verwendet habe. Die Struktur ist immer dieselbe: ein Blatt zur Eingabe der Parameter als "Benutzeroberfläche für Arme", eine Schaltfläche "Start" auf diesem Blatt. Im VBA-Code ist ein ShellAufruf in Excel VBA wie folgt erforderlich : stackoverflow.com/questions/8902022/… . Sie können stdout / stderr vom Dienstprogramm cmd in separate Dateien umleiten und dann die Ausgabeformatierung anwenden.
Doc Brown
114

Zusätzlich zu den bereits gegebenen Antworten von Doc Brown und Telastyn möchte ich einen alternativen Ansatz vorschlagen (unter der Annahme, dass dies geschäftskritisch ist).

Wenn Sie die durchgeführten Berechnungen nicht kennen und die Berechnungen (etwas) unternehmenskritisch sind: Schliessen Sie die ursprüngliche Logik in der .exeDatei mit allen erforderlichen Mitteln ab. Dekodieren Sie es ggf. mit einem Dekompilierer / Disassemblierer wie IDA . Stellen Sie bei Bedarf einen Berater (oder eine Reihe von Beratern) ein.

Sicher, umgehen Sie es jetzt mit ihrer Lösung, aber lassen Sie es nicht zu.

Der Grund, den ich vorschlage, ist folgender: Sie haben zugegeben, dass die Berechnungen sehr komplex sind (laut einem Ingenieur, mit dem Sie gesprochen haben). Es ist auch geschäftskritisch. Wenn also das Original .exeaufgrund von Änderungen auf Ihren Plattformen nicht mehr funktioniert (möglicherweise wird die 16-Bit-Unterstützung eingestellt?), Haben Sie gerade ein geschäftskritisches Wissen verloren .

Jetzt mache ich mir keine Sorgen, dass ich das verliere .exe, sondern dass ich das Wissen verliere, das es codiert. Dieses Wissen muss zurückgewonnen werden.

Wie zuvor: Wenn dieses Wissen bereits verfügbar ist, schreiben Sie es in einem Format auf, das nicht so schnell verloren geht. Andernfalls stellen Sie es wieder her und notieren Sie es.

Sjoerd Job Postmus
quelle
14
Moderne Dekompilierer erzeugen tatsächlich Code, der normalerweise gut lesbar ist, insbesondere wenn der ursprüngliche Quellcode in einfachem C oder Assembler und nicht in einer höheren Sprache vorliegt.
Phyrfox
4
Sehr guter Punkt. Außerdem: Nur das Patchen, damit es wieder funktioniert, funktioniert nur, bis das nächste Update implementiert werden muss.
Daniel Jour
33
@phyrfox 20 Jahre alt ... Entwickler vor 10 Jahren im Ruhestand ... nur die Ausgabe ist eine Excel-Tabelle ... Ich würde Geld darauf setzen, eine VB6-Anwendung zu sein.
J ...
10
@micaho: oder das Unternehmen existiert noch und die Person mit dem Know-how zur Überprüfung der Ergebnisse und versteckten Annahmen wurde gerade von einem LKW getroffen. Natürlich ist dies ein Geschäftsrisiko, sodass letztendlich die Stakeholder entscheiden sollten. Ich wollte nur betonen, dass der "Wrapper" jetzt funktioniert, aber nur die technische Verschuldung erhöht.
Sjoerd Job Postmus
22
@J ...: Wenn es VB6 ist, dann hat das Originalposter Glück. Sie können den Quellcode ziemlich einfach aus einer VB6-Kompilierung wiederherstellen.
Eric Lippert
74

Fragen Sie nach Möglichkeit den ursprünglichen Programmierer.

Vor ein paar Wochen wurde ich von einer Firma kontaktiert, die ich vor 10 Jahren mit der gleichen Frage zu einer Mitte der 90er Jahre entwickelten MDB-Datei bearbeitet hatte.

Paolo
quelle
52
Dies ist die echte niedrig hängende Frucht. Jeder (einschließlich ich) romantisiert den Einsatz von Programmierkenntnissen wie Reverse Engineering, die Neuimplementierung der Programmfunktionalität oder das Hinzufügen von Ebenen zur Datenverarbeitung. In Wirklichkeit ist der beste Ausgangspunkt eine freundliche E-Mail, die in einer Stunde mit dem Ort des Quellcodes oder einer anderen idealen Lösung zurückkommt.
user1717828
2
Wenn ich mit einer 10 Jahre alten Anwendung zu Hause bin, zünde ich auch einen Disassembler an, aber während der Arbeitszeit ist das Ziel anders ^^
Paolo
2
Haben Sie sich an etwas erinnert? :)
Angel
2
Na sicher! Leider hat das Unternehmen 3 Akquisitionen und Zusammenführungen durchgeführt, sodass viele Informationen verloren gingen und ein Teil der Backups in der verlorenen Tasche lag.
Paolo
1
Durchsuchen Sie die EXE-Datei nach eingebetteten Zeichenfolgen, die möglicherweise den Namen eines Entwicklers oder Ähnliches enthalten. Das ist einfacher als eine vollständige Demontage!
JDługosz
55

Irgendwelche Vorschläge, welche Optionen ich habe, um mit solchen Problemen umzugehen?

Wenn Sie nur die Ausgabe ändern möchten, warum dann nicht einfach die Komposition verwenden?

Anstatt die Blackbox modifizieren können Sie nicht einfach zugreifen, erstellen Sie ein neues Programm, das die Excel - Ausgabe nimmt, und tut Ihre Formatierung / Spalte ändert sich auch . Dann könnten Sie eine neue exe / ein neues Skript erstellen, das die beiden Programme der Reihe nach aufruft. Für den Endbenutzer scheint es also nur ein einziges Programm zu geben, das die gesamte Arbeit erledigt - obwohl es sich um zwei verschiedene Schritte handelt.

Telastyn
quelle
2
@Alec Ob Java eine geeignete Sprache ist oder nicht, hängt hauptsächlich von der zu verarbeitenden Datenmenge und dem Rechenaufwand ab. Wenn beide niedrig sind, ist Java in Ordnung. Wenn eine davon kritisch ist, wechseln Sie besser zu C oder C ++. Da Sie ohnehin nur eine Datenmenge verwenden, die in eine Excel-Tabelle passt, sind meines Erachtens nicht genügend Daten vorhanden, um Java zu einer schlechten Wahl zu machen (Excel würde wahrscheinlich explodieren, bevor Ihre App dies tut).
cmaster
18
@cmaster die Idee, dass Java für schwere Berechnungen unzulässig ist, ist eine veraltete Vorstellung. Der schlechteste hier aufgeführte Benchmark ist nicht einmal 4x (die meisten sind 2x oder weniger) und wenn ein einstelliger Skalar Ihr Bruchpunkt ist, werden die Einsparungen bei der Sicherheit (die direkt in Entwicklerdollar umgerechnet werden) den Leistungseinbruch mehr als wahrscheinlich ausgleichen .
corsiKa
8
@ Alec jede Sprache wird funktionieren. VBA scheint eine gute Wahl zu sein, da es sich bereits so gut in Excel integrieren lässt.
Captain Man
4
@corsiKa Das hängt ganz vom Umfang Ihrer Bewerbung ab. Wenn ein einzelner Durchlauf mehrere Zehntausend CPU-Stunden in Anspruch nimmt, wird ein Faktor von 2 oder 4 untragbar: Dies führt direkt zu den Ergebnissen, die Sie mit einem Multi-Millionen-Computer erzielen können. Außerdem arbeiten solche Anwendungen normalerweise im Gleichschritt, sodass die Speicherbereinigung ein reines Gift für ihre Leistung ist. Die kleinen Unterbrechungen würden sich mit der Anzahl der Prozesse multiplizieren. Ich sage Ihnen, solche Anwendungen existieren und sie sind mit Sicherheit nicht in Java geschrieben. Sie werden vom durchschnittlichen Internet-Business einfach nicht genutzt.
cmaster
7
@cmaster Wir sprechen von einfachen Berechnungen, nicht von einer vollwertigen AAA-Spiel-Engine mit globaler Echtzeitbeleuchtung, physisch basiertem Rendering, animierten, sparsamen Voxel-Oktetten, universeller Physik-Feldsimulation und dergleichen. Keine Beleidigung, aber es ist schlecht, hier ein Argument für die RE-Leistung einzufügen. Die Benutzerfreundlichkeit sollte die Nummer 1 sein, und als jemand, der C ++ seit einigen Jahren verwendet, ist dies die letzte Sprache, die ich in diesem Fall empfehlen würde.
3

Es gibt Unternehmen, die sich auf genau diese Art von Problem spezialisiert haben. Sie verwenden proprietären Code, um systemeigenen Code in eine Hochsprache zu dekompilieren, und wenden dann menschliches Fachwissen an, um ihn nützlich zu machen (z. B. um Variablen geeignete Namen zu geben).

Vor einigen Jahren verwendete mein Arbeitgeber dies, um nativen S / 390-Mainframe-Code auf Linux-Server zu migrieren. Wir gaben ihnen eine Binärdatei, sie gaben uns Quellcode in C.

Ob dies in Ihrem Fall notwendig ist, liegt bei Ihnen. Wenn Sie sich nur für das Format der Ausgabe interessieren, können Sie die Ausgabe einfach nach der Produktion massieren. Wie andere bereits betont haben, könnte die versteckte Geschäftslogik in einem binären Blob ein anhaltendes Risiko darstellen.

schlank
quelle
3

Schreiben Sie einen einfachen Wrapper um das Programm und erfassen Sie die Ausgabe. Es ist nicht kompliziert, so viele Sprachen ( z. B. Java , C ++ , Python , .NET ) zu beherrschen. Analysieren Sie die Ausgabe und generieren Sie eine andere in der gewünschten Form. Der Benutzer ruft Ihr neues Programm auf. Die alte ausführbare Datei bleibt daneben oder kann sogar automatisch aus der Ressource extrahiert werden, bevor sie aufgerufen wird.

Diese Lösung funktioniert natürlich nur dann gut genug, wenn die Ausgabe gut strukturiert und so einfach zu analysieren ist.

Dass es sich um eine GUI-Anwendung handelt, ist kein Blockierungsproblem. Sie können es starten, eine Ausgabe generieren und dann automatisch nachbearbeiten, wenn diese GUI beendet wird.

h22
quelle
3
Inwiefern unterscheidet sich das von der von Doc Brown am häufigsten gewählten Antwort?
Laf
Ich bin nicht einverstanden mit der Annahme, dass Docs Antwort schlecht geschrieben ist. Es ist klar und prägnant.
Mast
1
Wenn Sie sich den Text dieser Antwort ansehen, werden Sie feststellen, dass der einzige informative Teil genau das Ende des letzten Satzes bildet, "der Ihr Erbe" exe "nennt, die Ausgabe aufnimmt und weiter verarbeitet."
22.
2
Kein Downvoter und weiß nicht, warum das -3 ist ... ist Meta wieder dabei? Aber getrennt davon würde ich davon abraten, die Antwort eines anderen auf "enthält viel hirnverdünnendes Blabla" zu verwenden, wenn (A) dies ein subjektives Urteil ist und (B) meiner subjektiven Meinung nach Ihre Antwort genau dies enthält!
Underscore_d
Dies kann auch umgeschrieben werden als "enthält nicht informative allgemeine Vorträge, die nur vom Thema ablenken, das die Leser Zeit verschwendet", wenn dies hilfreicher aussieht. Gibt einen Hinweis auf die richtige Vorgehensweise in der zweiten Hälfte des letzten Satzes. Dies hatte nicht die Absicht, beleidigend zu sein. Kommentar entfernt.
22.
1

Schreiben Sie einige Tests, in denen möglichst viele Fälle mit dem alten Code ausgeführt werden. Finden Sie Eckfälle, testen Sie die falsche Eingabe und testen Sie die korrekte Eingabe.

Legen Sie fest, welche Ausgabe in verschiedenen Fällen korrekt ist, und versuchen Sie dann, eine Implementierung zu schreiben, die dieselben Tests erfüllt .

Ich würde nicht den Reverse Engineering-Weg gehen. Es ist unglaublich kompliziert, Maschinencode umzukehren, und Sie sollten bereits wissen, was der Zweck der exe ist. Reverse Engineering ist ein bisschen zu viel Arbeit für das, was Sie suchen.

Wenn die Software vor 20 Jahren von einem einzigen Entwickler entwickelt wurde, benötigt sie wahrscheinlich nicht viel moderne Energie. Ein GUI-Programm, mit dem die Maschine vor 20 Jahren ausgelastet war, registriert sich kaum auf einer modernen Maschine, sodass Sie wahrscheinlich etwas suchen, das relativ einfach zu reproduzieren ist.

Carlos
quelle
0

Versuchen Sie, die exe zurückzuentwickeln. Nur zum Zweck, die Berechnungslogik zu finden oder zumindest einen angemessenen Hinweis darauf zu erhalten, was sie tatsächlich tut, und wenn Ihr Reverse Engineering Sie zu diesem Punkt bringt, können Sie eine neue Anwendung schreiben, die auf dieser Berechnungslogik basiert. Abgesehen davon sehe ich keinen anderen Ausweg.

Einfacher gesagt als getan, Reverse Engineering einer vor 20 Jahren erstellten Exe ist eine echte Herausforderung.

Mukesh Adhvaryu
quelle
12
Die Datierung der Exe sollte eigentlich keine Rolle spielen
Angel:
1
Tatsächlich wird das Reverse Engineering immer schwieriger, da Optimierer von Jahr zu Jahr intelligenter werden.
MSalters