Einzelnen Beitrag anzeigen

Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#12

Re: Quelltext aus compillierter exe wiederherstellen?

  Alt 29. Apr 2004, 09:00
Hallo!

Zitat von Chewie:
Zitat von Bernhard Geyer:
Mit D8 (und .NET IL-Code) ist es sehr einfach den Quellcode herauszubekommen
Wieso eigentlich? Bug oder Feature? Und krieg ich den Code dann in der Sprache, in der er geschrieben ist, oder kann ich z.B. ein in VB.NET geschriebenes Assembly in C#-Code decompilen?
Feature, weil D8 das Programm in eine Zwischensprache umwandelt. Wenn diese Zwischensprache auch solche Kontrollstrukturen wie WHILE, REPEAT..UNTIL und FOR kann, ist natürlich ein Rückübersetzen (auch in eine andere Ausgangssprache) möglich.

Die klassischen Windows-Programme (.EXE) werden jedoch in Maschinensprache umgesetzt. Die kann nur GOTO und CALL - dadurch wird die Struktur des Originals verworfen. Luckies Hackfleich-Vergleich ist da sehr passend.

An der Umkehrcompilierung haben sich schon etliche Universitäts-Projektgruppen (Ruck Zuck PUC - Projektgruppe Umkehr-Compilierung) die Zähne ausgebissen - man muß ja versuchen, aus den Maschinenbefehlen (bzw. ihren Assembler-Entsprechungen) die Original-Struktur zurückgewinnen.

Im Prinzip kann man das Ganze rekonstruieren. Der Umkehrcompiler muß "nur" in der Lage sein, die Instruktionen zur Bereitstellung von Parametern bei Prozedur/Funktionsaufrufen zu erkennen und dann den Aufruf mit Parametern daraus zu erstellen. Man muß dann nur damit leben, daß man Variablennamen der Bauart I1, I2 etc. bei Integern hat und daß alles mit GOTO abläuft.

Aus
Delphi-Quellcode:
for lauf:=1 to 10 do
  unterprogramm(lauf);
oder
Delphi-Quellcode:
lauf:=1;
while lauf <= 10 do
begin
  unterprogramm(lauf);
  inc(lauf);
end
oder
Delphi-Quellcode:
lauf:=1;
repeat
  unterprogramm(lauf);
  inc(lauf);
until lauf>10;
würde dann ein Spitzen-Umkehrcompiler erzeugen:
Delphi-Quellcode:
i1:=1;
l1:
p1(i1);
inc(i1)
if i1<=10 then
  goto l1;
Der Rest ist dann Handarbeit.
Normalerweise erhält man allerdings Assembler - im absoluten Notfall kann ein Super-Programmierer (das wird TEUER!) vielleicht einen Fehler beheben.

Fazit: Ein Backup des Sources ist durch nichts zu ersetzen - außer durch mehrere Backups!

Gruß

Dietmar Brüggendiek
Dietmar Brüggendiek
  Mit Zitat antworten Zitat