Python 2.7 바이트코드를 망쳤나요? 그걸 unfuck
.
unfuck은 난독화된 Python 2.7 바이트코드를 해독하기 위한 유틸리티이자 라이브러리입니다. 이는 본질적으로 오염 추적을 사용하여 Python VM을 다시 구현한 것입니다. unfuck이 할 수 있는 일 중 일부는 다음과 같습니다.
#1과 #2는 Python 디컴파일러가 원본 Python 소스 코드를 재구성하려고 할 때 넘어지는 가장 큰 두 가지 항목입니다.
unfuck은 기본적으로 바이트코드를 다음과 같이 만듭니다:
또는 이것부터 이것까지:
예, 이는 실제 사례입니다.
unfuck은 라이브러리나 명령줄 유틸리티로 사용할 수 있습니다.
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
단일 파일을 제거하려면:
# deobfuscated.pyc can also be a directory
unfuck obfuscated.pyc deobfuscated.pyc
문자열을 파일로 덤프하거나 graphviz에서 볼 수 있는 dot
그래프를 덤프하기 위해 추가 플래그를 제공할 수도 있습니다.
# -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을 사용하려면 시스템의 PATH
에 Python 2.7이 필요합니다. 그것이 존재하는지 확인한 후에는 cargo build
만 할 수 있어야 합니다. 어떤 이유로 올바른 인터프리터를 찾을 수 없는 경우 PYTHON_SYS_EXECUTABLE
환경 변수를 Python 2.7 인터프리터 경로로 설정해 보세요.
cargo install --force unfuck
참고: unfuck은 원래 라이브러리 사용을 염두에 두고 설계되지 않았으므로 자체 멀티스레딩 플랫폼(이 경우 Rayon)을 제공합니다.
사용법은 매우 간단합니다.
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, WD 디스크 사람들, squif, ian, 파이 둠, 사루한