¿Has jodido el código de bytes de Python 2.7? Vamos unfuck
.
unfuck es una utilidad y una biblioteca para desofuscar el código de bytes ofuscado de Python 2.7. Es esencialmente una reimplementación de Python VM con seguimiento de contaminación. Algunas de las cosas que unfuck puede hacer:
#1 y #2 son los dos elementos más importantes con los que tropiezan los descompiladores de Python cuando intentan reconstruir el código fuente original de Python.
unfuck básicamente hace que tu código de bytes vaya de esto a esto:
O de esto a esto:
Sí, estos son ejemplos del mundo real.
unfuck se puede utilizar como biblioteca o como utilidad de línea de comandos.
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
Para eliminar un solo archivo:
# deobfuscated.pyc can also be a directory
unfuck obfuscated.pyc deobfuscated.pyc
También puede proporcionar indicadores adicionales para volcar cadenas en un archivo o volcar gráficos dot
que se pueden ver en 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 requiere Python 2.7 en PATH
de su sistema. Después de asegurarse de que esté presente, debería poder simplemente cargo build
. Si por alguna razón no se puede encontrar el intérprete correcto, intente configurar la var de entorno PYTHON_SYS_EXECUTABLE
en la ruta de su intérprete de Python 2.7.
cargo install --force unfuck
NOTA: unfuck no se diseñó originalmente teniendo en cuenta el uso de la biblioteca y, por lo tanto, trae su propia plataforma multiproceso (en este caso, Rayon).
El uso es bastante sencillo:
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, gente del disco WD, squif, ian, pie doom, saruhan