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