字節碼簡化器是DEOBFUSCATE PJORION受保護的Python腳本的工具。這是我較舊的工具pjorion deobfuscator的完整重寫
您需要預裝以下軟件包:
兩個軟件包都是pip安裝的。此外,請確保GraphViz可執行文件在您的路徑中以使pydotplus工作。 pydotplus僅用於繪製圖形需要,如果您不希望此功能您可以在文件deobfuscator.py中的deobfuscate函數中評論render_graph呼叫。
Pjorion混淆了原始文件,並在其頂部引入了幾層包裝層。這些層的目的只是(某種)解密下一個內部層,並通過EXEC_STMT指令執行它。因此,您不能在混淆文件上使用此工具。首先,您需要刪除包裝層並掌握實際的混淆代碼對象。然後,您可以將混淆的代碼合併到磁盤上並在其上運行此工具,這應該希望您將DEOBFUSCAT的代碼還給您。
有關詳細信息,請參閱此博客文章。
字節碼簡化器使用遞歸遍歷拆卸方法分析了混淆的代碼。說明被拆卸並合併為基本塊。基本塊是一系列指令,具有單個條目和單個出口。
基本塊可以以控制流指令(例如if語句)結尾。 if語句有兩個分支機構 - 真和錯誤。對應於分支的基本塊之間的邊緣。整個結構由有向圖表示。為此,我們使用networkx.DiGraph 。
圖中的節點表示基本塊,而節點之間的邊緣表示基本塊之間的控制流。
有條件的控制轉移指令,例如if兩個分支 - 條件下時執行的真分支。我們將此分支標記為顯式邊緣,因為該分支由if語句明確指定。另一個分支。由於邏輯推導,假一個被標記為隱式邊緣。
像jump這樣的無條件控制傳輸指令只有明確的邊緣。
一旦我們以圖形形式獲得代碼,就更容易理解代碼。因此,在此圖上完成了混淆的代碼的簡化。
主要使用了兩種簡化策略:
轉發器是一個基本塊,由單個無條件控制流指令組成。轉發器將執行轉移到其他基本塊的情況下,而無需進行任何有用的工作。
在撤離之前

黃色突出顯示的基本阻塞是一個轉發器塊。可以消除以下以下結構。
撤離後

但是,在轉貨具有隱式內部的情況下,不一定要特別淘汰貨物。有關詳細信息,請參閱Simplifier.py
當且僅當有一個前身且前身俱有此基本塊作為其唯一的後繼者時,才可以將基本塊合併到其前身。
合併之前

已經合併了基本塊的突出顯示指令,以形成下面顯示的更大的基本塊。控制轉移說明已被刪除,因為它們不再需要。
合併後

簡化圖表後,我們需要將基本塊組裝回平面代碼中。這是在file assembler.py中實現的。
組裝過程本身包括子階段:
JUMP_FORWARD到JUMP_ABSOLUTE :如果基本塊A具有對B塊的相對控制流指令,則必須在生成的佈局中塊A後塊B位置。這是因為相對控制流指令通常用於引用其後的地址。如果相對CF指令是JUMP_FORWARD我們可以更改為JUMP_ABSOLUTE 。SETUP_LOOP, SETUP_EXCEPT等,我們需要創建一個由絕對跳躍指令組成的新透明塊以塊block b塊,並將相對控制流量指令在abl a塊中以a的相對控制流量指示指向向前塊。這可以起作用,因為遠期塊自然會在生成的佈局中a塊A之後,並且可以始終使用相對說明指向位於其之後的塊,即具有較高的地址。JUMP_FORWARD & SETUP_LOOP之類的指令使用操作數來參考其他說明。該引用是表示目標的偏移/絕對地址的整數。 $ 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