해당 포스팅은 예전 사용하던
블로그(klonic.tistory.com)에서
이전한 글입니다.
목차
개요
pyinstaller는 파이썬으로 작성된 .py 확장자를 가진 파이썬 소스 파일을 .exe 파일로 변환할 때 쓰는 도구입니다.
pip install pyinstaller로 설치가 가능하고 설치가 되고 나면 cmd나 terminal에서 pyinstaller라는 명령어라는 명령을 내림으로써 사용이 가능합니다.
문득 이렇게 exe 파일로 변환된 프로그램을 다시 .py로 변경할 순 없을까라는 생각이 들었습니다.
Tool Setup
필요한 도구는 아래와 같습니다.
1. HxD
- 파일의 16진수 값을 보기 위한 헥사 에디터
- https://mh-nexus.de/en/hxd
2. pyinstxtractor.py
- pyinstaller로 만들어진 exe 파일을 디컴파일 해주는 툴입니다.
- https://sourceforge.net/projects/pyinstallerextractor
3. uncompyle6 - pip install uncompyle6 로 설치 가능합니다
How to ?
테스트해볼 파일은 solveit.exe 파일입니다. 간단히 제작한 python 스크립트 파일입니다. pyinstaller를 통해 exe로 변환된 파일이기도 합니다. 이 파일을 가지고 파이썬 소스를 열어보겠습니다.
2번 도구인 pyinstxtractor.py로 solveit.exe 파일을 열면 다음과 같이 하나의 폴더가 생성됩니다.
생성된 solveit.exe_extracted의 폴더는 다음과 같은 파일과 디렉터리를 가지고 있습니다.
눈 여겨볼 것은 이중에 MakeProblem이라는 파일입니다. 다른 파일들과 다르게 용량도 적고 확장자도 없습니다. 같은 파일로는 struct가 보이는데 이 글에서 다루는 문제를 해결하기 위해 분석해야 하는 파일은 MakeProblem입니다.
또 하나 python37.dll이라는 파일을 통해 해당 exe 파일 python3.7 버전으로부터 *. exe로 바꿔졌다고 볼 수 있습니다. 이 파일(MakeProblem)을 HxD를 써서 보면 E3부터 시작하는 파일의 구조가 보입니다.
여기서 하나 짚고 넘어가야 하는 점은 pyinstaller로 *. py을 *. exe 파일로 변환시켰을 때 pyinstaller는 매직 넘버를 자동으로 지운다고 합니다. 그러니 해당 소스 파일이 어느 버전인지 확인한 다음 그 매직 넘버를 HxD로 열어본 파일의 맨 앞에 추가해주면 소스를 열어 볼 수 있습니다.
하지만 이 매직 넘버는 쉽사리 추측하기 어렵습니다. 그래서 같은 경로에 있는 base_libraray.zip 파일을 압축 해제한 다음 아무 파일이나 HxD로 열어보면 매직넘버가 무엇인지 알 수 있습니다.
이 때 매직 넘버를 판단하는 근거는 "E3"가 어느 위치에서 시작됐는지입니다.
위 사진은 그 매직 넘버를 추측하는데 쓰인 다른 파일입니다. E3의 위치가 달라진 것을 확인할 수 있습니다. 매직 넘버를 복사해서 E3 위치 앞에 붙여 넣기 해준 다음 *. pyc 파일로 저장해줍니다. 저는 MakeProblem37 number.pyc로 저장한 뒤 uncompyle6을 통해 실행해 본 결과 소스코드가 확인됩니다.
'Language > Python' 카테고리의 다른 글
UserAssist 레지스트리 분석 (0) | 2022.04.03 |
---|---|
0은 False이다 !! (0) | 2022.04.03 |
pyJWT : encode /decode / registerd claim names (0) | 2021.08.13 |
Python의 Strip()은 재귀 호출 (0) | 2021.06.07 |
[Python][Excel] : Sheet to file (0) | 2020.11.06 |