字节码简化器是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