- 작성시간 : 2016/12/14 16:09
- 퍼머링크 : mcchae.egloos.com/11243826
- 덧글수 : 1
윈도우에서 파이썬 스크립트는 py2exe를 이용하여 exe 실행코드를 만들 수가 있습니다.


몇년 전에 만들어 놓았던 것인데 원 소스는 어디에 있는지 까 먹어 버렸습니다.
이런 경우 파이썬은 역어셈블을 통하여 원 소스를 구할 수 있습니다.
구글링과 시행착오를 거쳐 다음과 같이 작업을 진행하였습니다.
1) unpy2exe를 이용하여 exe에서 pyc 추출
$ python unpy2exe.py foo.exe
Magic value: 78563412
Code bytes length: 30698
Archive name: -
Extracting C:\Python27\lib\site-packages\py2exe\boot_common.py.pyc
Extracting foo.py.pyc
위와 같이 간단한 명령으로 해당 exe를 ...py.pyc 로 변환시킵니다.
맥에서 파이썬 2.7 VirtualEnv 환경에서 돌렸는데 아주 잘 됩니다.
2) uncompyle2 를 이용하여 pyc 에서 py 소스 얻기
위의 패키지를 설치하면 uncompyle2 라는 명령어를 실행할 수 있습니다.
$ uncompyle2 -d foo.pyc > foo.py
라고 저장합니다.
마지막에
+++ okay decompyling foo.py.pyc
# decompiled 1 files: 1 okay, 0 failed, 0 verify failed
라고 나오는데
#+++ okay decompyling foo.py.pyc
# decompiled 1 files: 1 okay, 0 failed, 0 verify failed
라고 끝에서 두번 째 줄을 코맨트로 막았습니다.
그런데 확인해 보니,
py 소스 안에 있던 한글이
\xec\x9d...
와 같은 식으로 Hex 문자열로 나옵니다.
이것도 다음과 같은 간단한 파이썬 스크립트를 이용하여
#!/usr/bin/env python
# coding=utf8
# noinspection PyBroadException
import re
def byte2bin(byte_hex):
return bin(int(byte_hex, 16))[2:].zfill(8)
def byte2ch(byte_hex):
return chr(int(byte_hex, 16))
def asciirepl(match):
s = match.group()
return byte2ch(s[2:])
def reformat_content(data):
p = re.compile(r'\\x([0-9a-f]{2})')
return p.sub(asciirepl, data)
with open('foo.py') as ifp:
py = ifp.read()
with open('bar.py', 'w') as ofp:
ofp.write(reformat_content(py))
원본으로 깔끔하게 복원할 수 있었습니다.
3) 난독화 (obfuscation)
파이썬, C#, JavaScript 등은 위와 같이 쉽게 소스로 환원을 시킬 수 있기 때문에
원 소스 자체의 로직은 변경되지 않지만 사람이 읽기에 아주 어려게 하는 것을
난독화라고 합니다.
JavaScript 같은 경우에는 악성코드가 시그니쳐 등을 회피하기 위하여 이 난독화
기법을 이용하기도 하는데요, 암튼 파이썬도 원 소스 난독화 프로젝트가 있더군요.
어느분께는 도움이 되셨기를...



덧글
전혀 반응이 없는데 원인이 뭘까요..?
파이썬 3.5.3버전이고 그 탓에 import imp는 안되는것 같아서 importlib.util 로 바꿔 사용해봐도
에러가 아니라 그냥 반응이 없이 한줄 띄우고 c:>가 나옵니다;