Bytecode Simplifier - это инструмент для Deobfuscate Pjorion Protected Python Scripts. Это полное переписывание моего старого инструмента Pjorion deobfuscator
Вам необходимо предварительно установить следующие пакеты:
Оба пакета можно установить pip . Кроме того, убедитесь, что исполняемый файл Graphviz находится на вашем пути для работы pydotplus . pydotplus требуется только для графиков рисования, и если вы не хотите, чтобы эта функция вы можете комментировать вызовы render_graph в функции deobfuscate в файле deobfuscator.py
PJORION запутывает исходный файл и вводит несколько слоев обертки. Цель этих слоев состоит в том, чтобы просто (вроде) расшифровывать следующий внутренний слой и выполнить его через инструкцию EXEC_STMT . Следовательно, вы не можете использовать этот инструмент как есть в запутанном файле. Во -первых, вам нужно удалить слои обертки и получить фактический запутанный код. Затем вы сможете создать запутанный код для диска и запустить этот инструмент на нем, который, как мы надеемся, вернуть вам код DeobFuscated.
Обратитесь к этому сообщению в блоге для получения подробной информации.
Упрощающий анализ Bytecode Analysicated Code с использованием рекурсивного подхода к разборке обхода. Инструкции разобраны и объединяются в основные блоки. Основной блок - это последовательность инструкций с одной записью и одним выходом.
Базовый блок может заканчиваться инструкцией по потоку управления, такой как оператор if . Оператор if имеет две ветви - TRUE и FALSE. Соответствующие ветвями Основные блоки имеют края между ними. Вся эта структура представлена направленным графом. Мы используем networkx.DiGraph для этой цели.
Узлы на графике представляют основные блоки, тогда как края между узлами представляют собой поток управления между основными блоками.
Условная инструкция по передаче управления, if имеет две ветви - истинная ветвь, которая выполняется, когда условие удерживается. Мы отмечаем эту ветвь как явное край, так как эта ветвь явно указана оператором if . Другая ветвь, а именно. Ложно, помечается как неявный край, так как он логически выведен.
Безусловная инструкция по передаче управления, такая как jump имеет только явное преимущество.
Как только у нас есть код в форме графика, проще рассуждать о коде. Следовательно, упрощение запутанного кода осуществляется на этом графике.
В основном используются две стратегии упрощения:
Праворад - это базовый блок, который состоит из единых безусловных инструкций по потоку управления. Передорущик передает выполнение в какой -то другой основной блок, не выполняя какую -либо полезную работу.
Перед исключением экспедитора

Основная заблокированная в желтом цвете - это блок перспектива. Его можно устранить, чтобы дать следующую структуру ниже.
После устранения экспедитора

Тем не менее, перспективный не всегда может быть устранен конкретно в тех случаях, когда у первого направителя есть подразумевание в краях. Обратитесь к Simplifier.py для получения подробной информации
Основной блок может быть объединен на его предшественнике, если и только если есть ровно один предшественник, а предшественник имеет этот базовый блок в качестве единственного преемника.
Перед слиянием

Выделенные инструкции основных блоков были объединены, чтобы сформировать более крупный базовый блок, показанный ниже. Инструкции по передаче управления были удалены, так как они больше не нужны.
После слияния

Как только график был упрощен, нам нужно собрать основные блоки обратно в плоский код. Это реализовано в файловой Assembler.py.
Процесс сборки сам по себе состоит из подстановки:
JUMP_FORWARD на JUMP_ABSOLUTE : если базовый блок A имеет относительную инструкцию по потоку управления для блока B, то блок B должен быть расположен после блока A в сгенерированной компоновке. Это связано с тем, что относительные инструкции по потоку управления обычно используются для обозначения адресов, расположенных после него. Если относительная инструкция CF является JUMP_FORWARD мы можем изменить JUMP_ABSOLUTE .SETUP_LOOP, SETUP_EXCEPT и т. Д., Нам необходимо создать новый блок Fodgerer, состоящий из абсолютной инструкции для прыжков для блока B, и сделать инструкцию по потоку относительного управления в блоке A, чтобы указывать на блок Fodverer. Это работает, так как блок Forwarder, естественно, будет после блока 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