Python

[리버스]Pyinstaller exe에서 py로 변환(23.04.04)

summerorange 2023. 4. 17. 22:15
반응형

하다보니 파일이 날라가서 복구하는데 리버스 엔지니어링이 필요했습니다. 작성한 스크립트 파일은 python 3.9 이기 때문에 디컴파일 프로그램 한 번으로 변환되지 않았습니다. de컴파일러와 버전 안 맞으면 복구 쉽지 않습니다. (안 될 수도) 이래저래 테스트해보기 위해서 여러 운영체제에서 테스트했습니다. 그 과정을 혹시나 싶어 정리... 

해당 과정은 실행파일을 바이너리 파일로 추출하고, 추출한 바이너리 파일을 다시 원본 스크립트로 변환하는 과정.

실행파일을 바이너리 파일로 추출하는 건 pyinstxtractor를 활용했습니다. 최신 버전 python과 pyinstaller version을 지원함.

# 실행
python pyinstxtractor.py {recover_file_name}.exe

제대로 되었다면 {recover_file_name}.exe_extracted 이라는 하위 폴더명이 생기고,

해당 폴더 안에 {recover_file_name} 이라는 실행 파일과 이름이 같지만 확장자가 없는 파일 하나와, base_library.zip 파일이 생성.

base_library.zip 을 windows는 HxD 프로그램이나 mac의 경우 Hex friend를 통해서 해당 압축 파일 내에 있는 Magic Number가 무엇인지 파악..  16진수로 되어 있는 파일에서 맨 첫 줄 16진수 숫자에서 앞의 8자리는 모두 동일함. 나머지 8자리는 0으로 표기해서, 확장자가 없었던 {recover_file_name}을 pyc 확장자로 수정후 해당 16진수를 넣기.

# 첫 번째 파일의 첫 줄
61 0D 0D 0A 01 00 00 00 72 9E 80 EC 1E 90 77 30
# 두 번째 파일의 첫 줄
61 0D 0D 0A 01 00 00 00 47 6B 1E BE 1E 39 D7 2E

# 바이너리 파일 첫 줄로 넣은 숫자
61 0D 0D 0A 01 00 00 00 00 00 00 00 00 00 00 00

(참고했던 블로그님 https://jaehoney.tistory.com/72)

magic number까지 넣어서 수정한 바이너리 파일을 py로 읽어들이면 되는데 이 de컴파일 과정이 쉽지 않았습니다. 지원되는 버전이 없어서 pycdc를 활용했습니다. c++ 디셈블러와 디컴파일러 프로그램이라서 이건 리눅스에서 돌렸습니다... mac에서는 python 버전 몬가 문제가 있었음

# 해당 파일들이 없을 경우 설치
sudo apt install cmake
sudo apt install git

# pycdc 
git clone https://github.com/zrax/pycdc.git
cd pycdc
cmake ./
make

혹은 windows인 경우에는 cmake ./ 하고 난 다음 MSBuild pydc.sln 이라는 방법도 있다고 하는데 빌드가 안되서 그냥 리눅스에서.

빌드 끝나면 해당 바이너리 파일에서 소스 코드를 볼 수 있습니다.

# source code 확인
./pycdc {recover_file_name}.pyc

이렇게 해서 볼 수 있고, py로 변환하기 위해서는

# py로 변환
./pycdc {recover_file_name}.pyc > {file_name}.py

로 하면 많이 날라갔지만 복구 성공.

# error...
Warning: block stack is not empty!
Unsupported opcode: JUMP_IF_NOT_EXC_MATCH
Warning: block stack is not empty!
Unsupported Node type: 27

decompile 말고 disassemble이 목적이라면

./pycdas {recover_file_name}.pyc 

Lucky me!

 

반응형