우선 pyinstxtractor이 무엇이냐면 pyinstaller로 패키징된 exe를 언패키징 해주는 프로그램이라 보면 된다.
본론으로 가서 pyinstaller는 py를 패키징할 때 exe에 매직 넘버를 심어놓는다.
class CArchiveWriter: _COOKIE_MAGIC_PATTERN = b'MEI\014\013\012\013\016'
# For cookie and TOC entry structure, see `PyInstaller.archive.readers.CArchiveReader`. _COOKIE_FORMAT = '!8sIIII64s' _COOKIE_LENGTH = struct.calcsize(_COOKIE_FORMAT)
_TOC_ENTRY_FORMAT = '!IIIIBc' _TOC_ENTRY_LENGTH = struct.calcsize(_TOC_ENTRY_FORMAT)
_COMPRESSION_LEVEL = 9 # zlib compression levelclass CArchiveReader: """ Reader for PyInstaller's CArchive (PKG) archive. """
# Cookie - holds some information for the bootloader. C struct format definition. '!' at the beginning means network # byte order. C struct looks like: # # typedef struct _archive_cookie # { # char magic[8]; # uint32_t pkg_length; # uint32_t toc_offset; # uint32_t toc_length; # uint32_t python_version; # char python_libname[64]; # } ARCHIVE_COOKIE; # _COOKIE_MAGIC_PATTERN = b'MEI\014\013\012\013\016'
_COOKIE_FORMAT = '!8sIIII64s' _COOKIE_LENGTH = struct.calcsize(_COOKIE_FORMAT)이런 구조이다. 이것을 한 번 확인해보기 위해 pyinstaller로 간단한 프로그램을 패키징 한 뒤
hxd로 파일을 살펴보면

이런 식으로 매직 넘버가 있는 것을 확인 할 수 있다.
pyinstxtractor는 이 매직 넘버를 감지하고 언패키징 하는데 이 매직 넘버를 바꾼다면 어떻게 될까?
바로 시도 해보자.
우선 매직 넘버는 RFG\011\031\019\068\056 이렇게 바꿔보도록 하자.
우선 pyinstaller를 clone 해준다.
git clone --branch v6.16.0 https://github.com/pyinstaller/pyinstaller.git아까 서술한 Pyinstaller/archive/readers.py와 Pyinstaller/archive/writers.py에 있는 매직 넘버를 각각 바꿔준다.
그리고 bootloader/src/pyi_utils.c에서 MAGIC_BASE 부분을 바꿔준다.
const unsigned char MAGIC_BASE[8] = { 0x52, 0x46, 0x47, 0x00, 0x1F, 0x13, 0x44, 0x38};이렇게 바꿔주면 된다. 혹시나 다른 매직 넘버를 사용하고 싶은 경우 매직 헤더의 헥스값을 넣으면 된다.
또 pyi_archive.c에서
magic[3] += 0x0C; /* 0x00 -> 0x0C */이 부분을 바꿔주어야 한다. 매직의 4번째 바이트를 설정하는데 원하는 매직의 4번째 바이트 값에 맞춰주어야 한다.
magic[3] += 0x0B; /* 0x00 -> 0x0B */이렇게 바꿔주었다.
이제 pyinstaller\bootloader로 가서 다음 명령어를 실행해준다.
python .\waf all이후 한칸 상위로 가서 pip install -e . 해주면 재빌드가 끝난다.
이제 매직 넘버가 바뀌었는지 테스트해보자.
python -m PyInstaller -F app.py이런 식으로 패키징 한 뒤 hxd로 살펴보자.

매직넘버가 바뀐걸 볼 수 있다. 이제 pyinstxtractor가 정말로 안먹히는지 테스트해보자.

진짜로 탐지가 안된다.
참고로 정상적인 매직 넘버에서 hxd로 그냥 매직 넘버만 바꿔치기 한다면
[PYI-27436:ERROR] Could not load PyInstaller's embedded PKG archive from the executable (C:\Users\user\test\dist\app.exe)
이런 오류 나면서 프로그램이 뻗는다.
아무튼 pyinstxtractor 우회 방법에 대해서 알아봤다.
끗.