바이트 코드 단순화기는 보호 된 보호 된 파이썬 스크립트를 퇴적하는 도구입니다. 이것은 나의 오래된 도구 pjorion deobfuscator를 완전히 다시 작성하는 것입니다.
다음 패키지가 사전 설치되어 있어야합니다.
두 패키지는 모두 pip 설치 가능합니다. 또한 GraphViz 실행 파일이 pydotplus 작동하는 경로에 있는지 확인하십시오. pydotplus 그래프를 그리는 데만 필요 하며이 기능을 원하지 않으면 deobfuscater.py 파일에서 deobfuscate 함수의 render_graph 호출을 주석 할 수 있습니다.
Pjorion은 원본 파일을 난독 화하고 그 위에 여러 래퍼 레이어를 소개합니다. 이 레이어의 목적은 단순히 다음 내부 레이어를 해독하고 EXEC_STMT 명령을 통해 실행하는 것입니다. 따라서이 도구는 난독 화 된 파일에서 사용할 수 없습니다. 먼저 래퍼 레이어를 제거하고 실제 난독 화 된 코드 개체를 잡아야합니다. 그런 다음 난독 화 된 코드를 마샬링하여 디스크를 마시고이 도구를 실행하여 Deobfuscated 코드를 되 찾을 수 있습니다.
자세한 내용은이 블로그 게시물을 참조하십시오.
바이트 코드 간단한 분석은 재귀 적 트래버스 분해 접근법을 사용하여 난독 화 코드를 분석합니다. 지침은 분해되어 기본 블록으로 결합됩니다. 기본 블록은 단일 항목과 단일 출구가있는 일련의 지침입니다.
기본 블록은 if 문과 같은 제어 흐름 명령으로 끝날 수 있습니다. if 문에는 True와 False의 두 가지 분기가 있습니다. 분기에 해당하는 기본 블록은 그 사이에 가장자리가 있습니다. 이 전체 구조는 지시 된 그래프로 표시됩니다. 우리는이 목적으로 networkx.DiGraph 사용합니다.
그래프의 노드는 기본 블록을 나타내며 노드 사이의 가장자리는 기본 블록 사이의 제어 흐름을 나타냅니다.
조건부 통제 전송 명령어는 두 개의 분기가있는 if (조건이 유지 될 때 실행되는 실제 분기)와 같은 것입니다. 이 분기는 if 문에 의해 명시 적으로 지정 되므로이 분기를 명시적인 가장자리로 태그합니다. 다른 지점 viz. 거짓은 논리적으로 추론되므로 암시 적 가장자리로 태그가 지정됩니다.
jump 와 같은 무조건 제어 전송 명령어는 명백한 가장자리 만 있습니다.
코드가 그래프 형식으로 있으면 코드에 대해 더 쉽게 추론 할 수 있습니다. 따라서 난독 화 된 코드의 단순화는이 그래프에서 수행됩니다.
두 가지 단순화 전략이 주로 사용됩니다.
전달기는 단일 무조건 제어 흐름 지침으로 구성된 기본 블록입니다. 전환기는 유용한 작업을 수행하지 않고 실행을 다른 기본 블록으로 전송합니다.
전환기 제거 전에

노란색으로 강조 표시된 기본 차단은 전환기 블록입니다. 아래의 다음 구조를 제공하도록 제거 할 수 있습니다.
전환기 제거 후

그러나 전달자가 암시적인 eDGES를 갖는 경우 전달자를 항상 구체적으로 제거 할 수는 없습니다. 세부 사항은 Simplifier.py를 참조하십시오
전임자가 정확히 하나 있고 전임자 가이 기본 블록을 고독한 후계자로 사용하는 경우에만 기본 블록을 전임자로 병합 할 수 있습니다.
병합하기 전에

기본 블록의 강조 표시된 지침은 병합되어 아래에 표시된 더 큰 기본 블록을 형성했습니다. 통제 전송 지침은 더 이상 필요하지 않으므로 제거되었습니다.
병합 후

그래프가 단순화되면 기본 블록을 평평한 코드로 다시 조립해야합니다. 이것은 File Assembler.py에서 구현됩니다.
조립 프로세스 자체는 하위 단계로 구성됩니다.
JUMP_FORWARD JUMP_ABSOLUTE 로 변경 : 기본 블록 A에 Block B에 상대 제어 흐름 명령이 있으면 Block B는 생성 된 레이아웃에서 블록 A 후에 위치해야합니다. 이는 상대 제어 흐름 지침이 일반적으로 위치한 주소를 참조하는 데 사용되기 때문입니다. 상대 CF 명령이 JUMP_FORWARD 인 경우 JUMP_ABSOLUTE 로 변경할 수 있습니다.SETUP_LOOP, SETUP_EXCEPT 등과 같은 다른 상대 CF 명령의 경우 Block B에 대한 절대 점프 명령으로 구성된 새로운 전달기 블록을 만들고 블록 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