Sudah mengacaukan bytecode Python 2.7? Mari kita unfuck
itu.
unfuck adalah utilitas dan perpustakaan untuk mengaburkan bytecode Python 2.7 yang dikaburkan. Ini pada dasarnya adalah implementasi ulang dari VM Python dengan pelacakan noda. Beberapa hal yang dapat dilakukan unfuck:
#1 dan #2 adalah dua item terbesar yang tersandung oleh dekompiler Python ketika mencoba merekonstruksi kode sumber Python asli.
unfuck pada dasarnya membuat bytecode Anda berubah dari ini ke ini:
Atau dari ini ke ini:
Ya, ini adalah contoh dunia nyata.
unfuck dapat digunakan sebagai perpustakaan atau utilitas baris perintah.
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
Untuk melepaskan satu file:
# deobfuscated.pyc can also be a directory
unfuck obfuscated.pyc deobfuscated.pyc
Anda juga dapat memberikan tanda tambahan untuk membuang string ke file, atau membuang grafik dot
yang dapat dilihat di 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 membutuhkan Python 2.7 di PATH
sistem Anda. Setelah memastikannya ada, Anda seharusnya bisa langsung cargo build
. Jika karena alasan tertentu juru bahasa yang benar tidak dapat ditemukan, coba atur PYTHON_SYS_EXECUTABLE
env var ke jalur juru bahasa Python 2.7 Anda.
cargo install --force unfuck
CATATAN: unfuck awalnya tidak dirancang dengan mempertimbangkan penggunaan perpustakaan, dan oleh karena itu membawa platform multithreadingnya sendiri (dalam hal ini, Rayon).
Penggunaannya cukup mudah:
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, orang-orang dari disk WD, squif, ian, pie doom, saruhan