Bytecode Simplifier adalah alat untuk menghilangkan skrip python yang dilindungi pjorion. Ini adalah penulisan ulang lengkap dari alat lama saya Pjorion Deobfuscator
Anda perlu memiliki paket berikut yang sudah dipasang sebelumnya:
Kedua paket dapat diinstal pip . Selain itu, pastikan Executable GraphViz ada di jalur Anda untuk pydotplus untuk bekerja. pydotplus diperlukan hanya untuk menggambar grafik dan jika Anda tidak ingin fitur ini, Anda dapat mengomentari panggilan render_graph dalam fungsi deobfuscate di file deobfuscator.py
Pjorion mengaburkan file asli dan memperkenalkan beberapa lapisan pembungkus di atasnya. Tujuan dari lapisan -lapisan ini hanyalah untuk (semacam) mendekripsi lapisan dalam berikutnya dan menjalankannya melalui instruksi EXEC_STMT . Oleh karena itu Anda tidak dapat menggunakan alat ini apa adanya pada file yang dikalahkan. Pertama, Anda perlu menghapus lapisan pembungkus dan mendapatkan objek kode yang dikaburkan yang sebenarnya. Kemudian Anda dapat mengarsipkan kode yang dikaburkan untuk disk dan menjalankan alat ini di atasnya yang semoga akan memberi Anda kembali kode deobfuscated.
Lihat posting blog ini untuk detailnya.
Bytecode Simplifier menganalisis kode yang dikaburkan menggunakan pendekatan pembongkaran traversal rekursif. Instruksi dibongkar dan digabungkan menjadi blok dasar. Blok dasar adalah urutan instruksi dengan entri tunggal dan keluar tunggal.
Blok dasar dapat diakhiri dengan instruksi aliran kontrol seperti pernyataan if . Pernyataan if memiliki dua cabang - benar dan salah. Sesuai dengan cabang blok dasar memiliki tepi di antara mereka. Seluruh struktur ini diwakili oleh grafik terarah. Kami menggunakan networkx.DiGraph untuk tujuan ini.
Node dalam grafik mewakili blok dasar sedangkan tepi antara node mewakili aliran kontrol antara blok dasar.
Instruksi transfer kontrol bersyarat seperti if memiliki dua cabang - cabang sejati yang dieksekusi saat kondisi berlaku. Kami menandai cabang ini sebagai tepi eksplisit karena cabang ini secara eksplisit ditentukan oleh pernyataan if . Cabang lainnya yaitu. Yang salah ditandai sebagai tepi implisit, karena disimpulkan secara logis.
Instruksi transfer kontrol tanpa syarat seperti jump hanya memiliki tepi eksplisit.
Setelah kami memiliki kode dalam formulir grafik, lebih mudah untuk bernalar tentang kode tersebut. Oleh karena itu penyederhanaan kode yang dikalahkan dilakukan pada grafik ini.
Dua strategi penyederhanaan terutama digunakan:
Forwarder adalah blok dasar yang terdiri dari instruksi aliran kontrol tanpa syarat tunggal. Forwarder mentransfer eksekusi ke beberapa blok dasar lainnya tanpa melakukan pekerjaan yang berguna.
Sebelum eliminasi maju

Dasar diblokir yang disorot dengan warna kuning adalah blok ke depan. Dapat dihilangkan untuk memberikan struktur berikut di bawah ini.
Setelah eliminasi forwarder

Namun, seorang forwarder tidak selalu dapat dihilangkan secara khusus dalam kasus-kasus di mana forwarder memiliki edges implisit. Lihat Simplifier.py untuk detailnya
Blok dasar dapat digabungkan ke pendahulunya jika dan hanya jika ada persis satu pendahulu dan pendahulu memiliki blok dasar ini sebagai penerus tunggal.
Sebelum bergabung

Instruksi yang disorot dari blok dasar telah digabungkan untuk membentuk blok dasar yang lebih besar yang ditunjukkan di bawah ini. Instruksi transfer kontrol telah dihapus karena tidak diperlukan lagi.
Setelah menggabungkan

Setelah grafik disederhanakan, kita perlu merakit blok dasar kembali ke kode datar. Ini diimplementasikan dalam file assembler.py.
Proses perakitan itu sendiri terdiri dari sub-tahap:
JUMP_FORWARD ke JUMP_ABSOLUTE : Jika Basic Block A memiliki instruksi aliran kontrol relatif untuk memblokir B, maka blok B harus ditempatkan setelah blok A di tata letak yang dihasilkan. Ini karena instruksi aliran kontrol relatif biasanya digunakan untuk merujuk pada alamat yang terletak setelahnya. Jika instruksi CF relatif adalah JUMP_FORWARD kita dapat berubah menjadi JUMP_ABSOLUTE .SETUP_LOOP, SETUP_EXCEPT dll, kita perlu membuat blok forwarder baru yang terdiri dari instruksi lompatan absolut untuk blok B, dan membuat instruksi aliran kontrol relatif di blok A untuk menunjuk ke blok forwarder. Ini berfungsi karena blok forwarder secara alami akan mengejar blok A dalam tata letak yang dihasilkan dan instruksi relatif dapat selalu digunakan untuk menunjuk ke blok yang terletak setelahnya, yaitu memiliki alamat yang lebih tinggi.JUMP_FORWARD & SETUP_LOOP menggunakan operan untuk merujuk pada instruksi lain. Referensi ini adalah bilangan bulat yang menunjukkan alamat offset/absolut dari target. $ python main.py --ifile=obfuscated.pyc --ofile=deobfuscated.pyc
INFO:__main__:Opening file obfuscated.pyc
INFO:__main__:Input pyc file header matched
DEBUG:__main__:Unmarshalling file
INFO:__main__:Processing code object x0bx08x0cx19x0bx0ex03
DEBUG:deobfuscator:Code entrypoint matched PjOrion signature v1
INFO:deobfuscator:Original code entrypoint at 124
INFO:deobfuscator:Starting control flow analysis...
DEBUG:disassembler:Finding leaders...
DEBUG:disassembler:Start leader at 124
DEBUG:disassembler:End leader at 127
.
<snip>
.
DEBUG:disassembler:Found 904 leaders
DEBUG:disassembler:Constructing basic blocks...
DEBUG:disassembler:Creating basic block 0x27dc5a8 spanning from 13 to 13, both inclusive
DEBUG:disassembler:Creating basic block 0x2837800 spanning from 5369 to 5370, end exclusive
.
<snip>
.
DEBUG:disassembler:461 basic blocks created
DEBUG:disassembler:Constructing edges between basic blocks...
DEBUG:disassembler:Adding explicit edge from block 0x2a98080 to 0x2aa88a0
DEBUG:disassembler:Adding explicit edge from block 0x2aa80f8 to 0x2a9ab70
DEBUG:disassembler:Basic block 0x2aa8dc8 has xreference
.
<snip>
.
INFO:deobfuscator:Control flow analysis completed.
INFO:deobfuscator:Starting simplication of basic blocks...
DEBUG:simplifier:Eliminating forwarders...
INFO:simplifier:Adding implicit edge from block 0x2aa8058 to 0x2a9ab70
INFO:simplifier:Adding explicit edge from block 0x2b07ee0 to 0x2a9ab70
DEBUG:simplifier:Forwarder basic block 0x2aa80f8 eliminated
.
<snip>
.
INFO:
INFO:simplifier:307 basic blocks merged.
INFO:deobfuscator:Simplication of basic blocks completed.
INFO:deobfuscator:Beginning verification of simplified basic block graph...
INFO:deobfuscator:Verification succeeded.
INFO:deobfuscator:Assembling basic blocks...
DEBUG:assembler:Performing a DFS on the graph to generate the layout of the blocks.
DEBUG:assembler:Morphing some JUMP_ABSOLUTE instructions to make file decompilable.
DEBUG:assembler:Verifying generated layout...
INFO:assembler:Basic block 0x2b0e940 uses a relative control transfer instruction to access block 0x2abb3a0 located before it.
INFO:assembler:Basic block 0x2ab5300 uses a relative control transfer instruction to access block 0x2ada918 located before it.
DEBUG:assembler:Successfully verified layout.
DEBUG:assembler:Calculating addresses of basic blocks.
DEBUG:assembler:Calculating instruction operands.
DEBUG:assembler:Generating code...
INFO:deobfuscator:Successfully assembled.
INFO:__main__:Successfully deobfuscated code object main
INFO:__main__:Collecting constants for code object main
INFO:__main__:Generating new code object for main
INFO:__main__:Generating new code object for x0bx08x0cx19x0bx0ex03
INFO:__main__:Writing deobfuscated code object to disk
INFO:__main__:Success