665 words
3 minutes
pyinstxtractor 우회하기
2026-02-19

우선 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 level
class 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 해준다.

Terminal window
git clone --branch v6.16.0 https://github.com/pyinstaller/pyinstaller.git

아까 서술한 Pyinstaller/archive/readers.pyPyinstaller/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 우회 방법에 대해서 알아봤다.

끗.

pyinstxtractor 우회하기
https://blog-temp.vercel.app/posts/pyisxx/
Author
byte256
Published at
2026-02-19
License
CC BY-NC-SA 4.0