2012-11-19 3 views
1

지금까지 python3에는 안정적인 작동 디 컴파일러가 없습니다. 가장 가까운 것은 가장 좋은 버그 인 unpyc3입니다. 나는 파이썬을 위해 일할 수있는 디 컴파일러를 만들고 싶지만, 어떻게 진행할 것인가? 내가 파이썬으로 만들고 싶지만 모든 언어에서 작동하는 전역 디 컴파일러를 사용할 수 있습니까? 프로그램이 주어진 언어의 모든 라이브러리에 액세스 할 수 있고 컴파일 된 파일이 주어진다면 컴퓨터가이를 수행 할 수 있습니까? 이것은 기계어와 함께 작동하므로 디 컴파일시이 문제가 발생합니까?Decompiler python et al

+0

파이썬이 컴파일되지 않았습니다 ... – mgilson

+1

파이썬 바이트 코드 (pyc 파일)를 파이썬 소스 코드로 변환하는 방법을 찾고 계십니까? – Michael0x2a

+0

네, 그게 내가 pyc 파일을 파이썬 소스 컴파일 된 일을하고 싶지 않아요? – user1775641

답변

0

uncompyle6 꽤 좋은 파이썬 3. 일반적으로이 작업을 수행 how it works 설명은 위키를 참조하기 위해 작성하는 방법에 대한 질문에 대해서는

작동합니다.

그러나 아래 단계를 대략적으로 설명하겠습니다.

먼저 특정 CPU 유형의 머신 코드 또는 가상 머신의 바이트 코드를 포함 할 수있는 "실행 파일"을 읽는 방법을 이해해야합니다. Uncompyle6은 문법을 사용하여 프로그램을 재구성합니다. 디스 어셈블 된 기계 명령어는 용어 "토큰"을 구문 분석 할 때 호출됩니다. 예를 들어 "token : number of value 5"대신 "LOAD_CONST instruction is value 5"를 사용합니다.

이 후에는 제어 흐름을 이해하고 싶을 것입니다. 그리고 일반적으로 기본 블록이나 직선 코드가 결정됩니다. 토큰이 점프 명령임을 grok하기 때문에 이제 할 수 있습니다.

uncompyle6이 사용하는 기본적인 아이디어는 문법에 제어 흐름을 감지 할 수 있도록 토큰을 추가하는 것입니다.

SETUP_LOOP 
JUMP_IF FALSE X 
... 
X: 

을 그리고 그 말의 나타 내기 위해 X에서 뭔가를 추가 : 그래서 약이 볼 수 있습니다 당신은 다음 추상 구문 트리 (AST)를 구축 할 수있는 각 기본 블록 내부

SETUP_LOOP 
JUMP_IF_FALSE X 
... 
COME_FROM_LOOP # this is added 

표현과 기본 블록 내부의 명령. uncompyle6에서 사용 된 접근법은 문맥 자유 문법을 사용하는 것입니다. pycdc과 같은 다른 Python3 프로그램이나 unpyc3 프로그램은 그렇게하지 않습니다. 대신 스택을 사용하여 트리를 빌드하고 지시 사항을 선형 스캔하십시오. 아마도 당신은 문법이 같은 일을 할 것입니다 방법을 볼 수있는이

LOAD a # tree/stack: | a 
LOAD b # tree/stack: | b, a 
LOAD c # tree/stack: | c, b, a 
ADD  # tree/stack: (c + b) | a 
MULTIPLY # tree/stack: (c + b) * a 
STORE d # tree/stack: d = (c + b) * a | 

의 몇 가지 아이디어를 제공합니다.

uncompyle6을 제안 했으니 까, 지금은 대단히 임시적인 제어 흐름 분석 부분에서 꽤 약하다고 말할 수 있습니다.

디 컴파일러 작성에 관심을 표명 했으므로 기존 컴파일러를 사용하여 더 나은 결과를 얻으려면 어떻게해야합니까?

관련 문제