Wie kann ich ein Perl-Programm zurückentwickeln, das mit perlcc kompiliert wurde?

8

Ich habe eine Umgebung mit einem "kompilierten" Perl-Skript unter Unix geerbt. Ist es möglich, den Code zu dekompilieren, zurückzuentwickeln (was auch immer der Begriff ist) und den Quellcode aus dem kompilierten Objektcode zu erhalten?

Vielleicht nicht möglich, aber dachte ich würde eher fragen als anzunehmen.

Danke, -Kevin.

    
bubbly 29.10.2010, 02:44
quelle

3 Antworten

9

Oh mein Gott!

Wenn und nur wenn über perlcc -B in ausführbaren Byte-Code kompiliert wurde, könnten Sie dann kompilieren, genauso wie B :: Deparse. Sie würden die gesamte Quelle zurückerhalten, die auf diese Weise nicht optimiert wurde. Es könnte ein bisschen komisch aussehen, aber es wäre ein gleichwertiges Programm.

Wenn es jedoch vollständig in C-Code und von dort in Assembler- und Maschinensprache kompiliert wurde und durch ld für eine richtige a.out -Datei läuft, werden Sie nichts in der Lage sein, etwas Ähnliches zu tun. Es wäre so, als würde man versuchen, /bin/cat zu zerlegen.

Also gut, du könntest es zerlegen, aber es gibt keine Freude dort zu sein. Selbst wenn Sie den ursprünglichen, generierten C-Code herausholen könnten - was nicht möglich ist - wäre er praktisch unbrauchbar.

Ich nehme an, Sie könnten Strings (1) darauf laufen lassen, um zu sehen, ob irgendetwas Nützliches irgendwo bleibend herumliegen gelassen wurde, aber ich würde nicht darauf zählen.

Entschuldigung.

    
tchrist 29.10.2010, 03:51
quelle
13

Wenn wir das Bytecode-Backend tchrist bereits ausgelassen haben und nur über das C Backend sprechen, übersetzt %%_co_de% das optiere des kompilierten Perl-Programms in ein C-Programm, das es dann kompiliert. Dieses C-Programm wird dann, wenn es ausgeführt wird, dieses Bild in den Speicher zurückverwandeln und es im Grunde wie Perl ausführen. Der Sinn davon ist, die Kompilierzeit von normalem Perl-Code zu beschleunigen.

Diese Option Ihres Programms ist dann in der globalen Variable perlcc verfügbar. Wir haben bereits ein Modul namens PL_main_root , das in der Lage ist, Optrees zu verwenden und sie in Quellcode umzuwandeln, der in etwa dem ursprünglichen Code entspricht, aus dem der optree kompiliert wurde. Es hat zufällig eine B::Deparse -Methode, die eine Coderef zurückgibt, die, wenn sie ausgeführt wird, das deparse-Ergebnis von compile ausgibt.

Außerdem gibt es die C-Funktion PL_main_root , mit der Sie Perl-Snippets aus C-Space auswerten können.

%Vor%

Natürlich gelten die üblichen Vorbehalte von B :: Deparse, aber das wird sicherlich für das Reverse Engineering hilfreich sein. Tatsächlich ist es in den meisten Fällen nicht möglich, den ursprünglichen Quellcode zu rekonstruieren, selbst wenn es für das obige Beispiel funktioniert hat.

Die genaue gdb-Magie, die du tun musst, um B :: Deparse dazu zu bringen, dir etwas Sinnvolles zu geben, hängt auch stark von deiner Perl ab. Ich benutze eine Perl mit iThreads und daher Multiplizität. Deshalb gebe ich die Variable Perl_eval_pv weiter. Andere Perls brauchen das vielleicht nicht. Auch wenn jemand die Binärdatei, die von perlcc kompiliert wurde, entfernt hat, werden die Dinge etwas schwieriger, aber die gleiche Technik wird immer noch funktionieren.

Sie können das auch verwenden, um jede Option zu kompilieren, die Sie während der Programmausführung jederzeit erhalten können. Sehen Sie sich den Compiler von B :: Deparse an und machen Sie etwas Ähnliches, außer dass Sie ihm ein my_perl -Objekt für die Option zur Verfügung stellen, die Sie anstelle von B ausgeben möchten.

Das gleiche gilt für das erwähnte Bytecode-Backend von perlcc. Ich bin nicht ganz sicher über das optimierte C-Backend namens B::main_root .

    
rafl 29.10.2010 04:09
quelle
0

Verwenden Sie 7-zip. Klicken Sie mit der rechten Maustaste auf die EXE-Datei, und führen Sie dann 7zip & gt; Öffnen Sie Archive und dann die Perl-Datei.

    
Neal Ravindran 14.02.2012 12:26
quelle

Tags und Links