[Python] py2exe로 생성된 exe에서 py 소스 구하기 및 \xec... 문자열 변환 Develop Tip

윈도우에서 파이썬 스크립트는 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 같은 경우에는 악성코드가 시그니쳐 등을 회피하기 위하여 이 난독화
기법을 이용하기도 하는데요, 암튼 파이썬도 원 소스 난독화 프로젝트가 있더군요.




어느분께는 도움이 되셨기를...


덧글

  • cm 2017/08/02 11:04 # 삭제 답글

    python unpy2exe.py 대상파일명.exe 를 실행해도

    전혀 반응이 없는데 원인이 뭘까요..?

    파이썬 3.5.3버전이고 그 탓에 import imp는 안되는것 같아서 importlib.util 로 바꿔 사용해봐도

    에러가 아니라 그냥 반응이 없이 한줄 띄우고 c:>가 나옵니다;
댓글 입력 영역

구글애드텍스트