Vous avez baisé le bytecode Python 2.7 ? unfuck
-le.
unfuck est un utilitaire et une bibliothèque permettant de désobscurcir le bytecode Python 2.7 obscurci. Il s'agit essentiellement d'une réimplémentation de la machine virtuelle Python avec suivi des souillures. Certaines des choses que unfuck peut faire :
Les numéros 1 et 2 sont les deux éléments les plus importants sur lesquels les décompilateurs Python trébuchent lorsqu'ils tentent de reconstruire le code source Python original.
unfuck fait essentiellement passer votre bytecode de ceci à ceci :
Ou de ceci à ceci :
Oui, ce sont des exemples concrets.
unfuck peut être utilisé comme bibliothèque ou comme utilitaire de ligne de commande.
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
Pour débloquer un seul fichier :
# deobfuscated.pyc can also be a directory
unfuck obfuscated.pyc deobfuscated.pyc
Vous pouvez également fournir des indicateurs supplémentaires pour vider les chaînes dans un fichier ou pour vider des graphiques dot
pouvant être visualisés dans graphviz :
# -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 nécessite Python 2.7 dans PATH
de votre système. Après vous être assuré qu'il est présent, vous devriez pouvoir simplement cargo build
. Si, pour une raison quelconque, l'interpréteur correct ne peut pas être trouvé, essayez de définir la variable d'environnement PYTHON_SYS_EXECUTABLE
sur le chemin de votre interpréteur Python 2.7.
cargo install --force unfuck
REMARQUE : unfuck n'a pas été conçu à l'origine pour l'utilisation de la bibliothèque et apporte donc sa propre plate-forme multithread (dans ce cas, Rayon).
L'utilisation est assez simple :
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, les gens du disque WD, squif, ian, pie doom, saruhan