Haben Sie Python 2.7 Bytecode gefickt? Lasst es unfuck
.
unfuck ist ein Dienstprogramm und eine Bibliothek zur Entschleierung von verschleiertem Python 2.7-Bytecode. Es handelt sich im Wesentlichen um eine Neuimplementierung der Python-VM mit Taint-Tracking. Einige der Dinge, die Unfuck tun kann:
Nr. 1 und Nr. 2 sind die beiden größten Punkte, über die Python-Decompiler stolpern, wenn sie versuchen, den ursprünglichen Python-Quellcode zu rekonstruieren.
unfuck bewirkt im Grunde, dass Ihr Bytecode von hier nach hier geht:
Oder von hier nach hier:
Ja, das sind Beispiele aus der Praxis.
unfuck kann entweder als Bibliothek oder als Befehlszeilenprogramm verwendet werden.
unfuck 0.2.0
USAGE:
unfuck [FLAGS] [OPTIONS] <input-obfuscated-file> <output-path> [graphs-dir] [SUBCOMMAND]
FLAGS:
--dry Dry run only -- do not write any files
-g Enable outputting code graphs to dot format
-h, --help Prints help information
-q Disable all logging
-V, --version Prints version information
-v Enable verbose logging
OPTIONS:
--decompiler <decompiler> Your favorite Python 2.7 bytecode decompiler. This program assumes the decompiler's
first positional argument is the file to decompile, and it prints the decompiled
output to stdout [env: UNFUCK_DECOMPILER=] [default: uncompyle6]
ARGS:
<input-obfuscated-file> Input obfuscated file
<output-path> Output file name or directory name. If this path is a directory, a file will be
created with the same name as the input. When the `strings-only` subcommand is
applied, this will be where the output strings file is placed
<graphs-dir> An optional directory for graphs to be written to [default: .]
SUBCOMMANDS:
help Prints this message or the help of the given subcommand(s)
strings-only
So entpacken Sie eine einzelne Datei:
# deobfuscated.pyc can also be a directory
unfuck obfuscated.pyc deobfuscated.pyc
Sie können auch zusätzliche Flags bereitstellen, um Zeichenfolgen in eine Datei auszugeben oder dot
auszugeben, die in graphviz angezeigt werden können:
# -g is for printing graphs
unfuck -g obfuscated.pyc deobfuscated.pyc
# use the strings-only subcommand for dumping just dumping strings -- no deobfuscation is performed
unfuck deobfuscated.pyc ./strings.csv strings-only
unfuck erfordert Python 2.7 im PATH
Ihres Systems. Nachdem Sie sichergestellt haben, dass es vorhanden ist, sollten Sie in der Lage sein, einfach cargo build
auszuführen. Wenn aus irgendeinem Grund der richtige Interpreter nicht gefunden werden kann, versuchen Sie, die Umgebungsvariable PYTHON_SYS_EXECUTABLE
auf den Pfad Ihres Python 2.7-Interpreters festzulegen.
cargo install --force unfuck
HINWEIS: Unfuck wurde ursprünglich nicht für die Nutzung von Bibliotheken entwickelt und bringt daher eine eigene Multithreading-Plattform mit (in diesem Fall Rayon).
Die Verwendung ist ziemlich einfach:
use std :: convert :: TryInto ;
use std :: fs :: File ;
let mut pyc_contents = vec ! [ ] ;
let pyc_file = File :: open ( "obfuscated.pyc" ) ? ;
pyc_file . read_to_end ( & mut pyc_contents ) ? ;
// magic/moddate are specific to the PYC header and are required to be
// a valid PYC file
let magic = u32 :: from_le_bytes ( pyc_contents [ 0 .. 4 ] . try_into ( ) . unwrap ( ) ) ;
let moddate = u32 :: from_le_bytes ( pyc_contents [ 4 .. 8 ] . try_into ( ) . unwrap ( ) ) ;
let pyc_contents = & pyc_contents [ 8 .. ] ;
// Use a standard Python 2.7 opcode table
let deobfuscator = unfuck :: Deobfuscator :: < pydis :: opcode :: py27 :: Standard > :: new ( pyc_contents ) ;
let deobfuscator = if enable_graphs {
deobfuscator . enable_graphs ( )
} else {
deobfuscator
} ;
let deobfuscated_code = deobfuscator . deobfuscate ( ) ? ;
let mut deobfuscated_file = File :: create ( "deobfuscated.pyc" ) ? ;
deobfuscated_file . write_all ( & magic . to_le_bytes ( ) [ .. ] ) ? ;
deobfuscated_file . write_all ( & moddate . to_le_bytes ( ) [ .. ] ) ? ;
deobfuscated_file . write_all ( deobfuscated_code . data . as_slice ( ) ) ? ;
gabe_k, yrp, lpcvoid, Leute von der WD-CD, Squif, Ian, Pie Doom, Saruhan