카테고리 없음
파이준 코드 난독화 및 보호 방법
에이스28
2025. 3. 17. 00:12
1. 왜 파이썬 코드 보호가 필요할까?
파이썬은 인터프리터 언어이기 때문에 스크립트가 그대로 존재하여 로컬에서 실행 시 코드가 모두 보이는 문제가 있습니다. 보안성을 강화하기 위해 다양한 방법을 적용해야 합니다.
보호할 수 있는 이유
- 현재 프로그램의 무단 복제 및 배포 방지
- 프로그램의 역공학(리버스 엔지니어링) 방지
- 코드 변조 및 보안 강화
2. 파이썬 코드 난독화(코드 인코딩) 방법
파이썬 코드를 난독화하여 사람이 읽기 어렵게 만들기 위해 다양한 방법을 사용할 수 있습니다.
2.1 PyArmor 사용 (추천)
PyArmor는 파이썬 코드 난독화 및 라이선스 관리 기능을 제공하는 강력한 도구입니다.
설치 및 사용법
pip install pyarmor
pyarmor obfuscate my_script.py
난독화 전
print("이 코드는 난독화 전입니다.")
난독화 후 (예시)
__pyarmor__(b'\x12\x34\x56\x78\x90...')
2.2 Cython을 이용한 코드 보호
Cython을 사용하면 파이썬 코드를 C 확장 모듈로 변환하여 성능을 향상시키고 보안을 강화할 수 있습니다.
설치
pip install cython
Cython 코드 변환
- setup.py 파일 생성:
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("my_script.py")
)
- 변환 실행:
python setup.py build_ext --inplace
- 생성된 .so 또는 .pyd 파일을 사용하면 원본 소스 없이 실행 가능합니다.
3. 실행 환경 제한을 통한 보호
난독화만으로는 완벽한 보안을 제공할 수 없기 때문에 특정 환경에서만 실행되도록 설정할 수 있습니다.
3.1 하드웨어 바인딩 (Machine ID)
import subprocess
def get_cpu_id():
result = subprocess.run("wmic cpu get ProcessorId", capture_output=True, text=True)
return result.stdout.split("\n")[1].strip()
REGISTERED_CPU_ID = "BFEBFBFF000306A9"
if get_cpu_id() != REGISTERED_CPU_ID:
print("❌ 인증 실패: 등록된 CPU에서만 실행 가능합니다.")
exit(1)
4. 반복 복제 방지를 위한 추가 보호 방법
- Nuitka를 사용하여 파이썬 코드를 실행 파일로 변환
- 하드웨어 바인딩을 적용하여 특정 환경에서만 실행 가능하게 설정
- 파이썬 코드 무결성 검증 및 보안 검사를 추가하여 복제 여부를 확인할 수 있도록 설정
5. 난독화된 코드 복원 가능성
난독화된 파이썬 코드를 완벽하게 원본 코드로 되돌리는 것은 어렵지만, 일부 방법을 통해 복원할 가능성이 있습니다. 하지만 난독화 방식과 적용된 보호 기법에 따라 역컴파일이 쉽거나 어렵게 됩니다.
5.1 난독화된 코드의 리버스 엔지니어링 가능성
난독화 방법 복원 난이도 리버스 엔지니어링 기법
PyArmor | 보통 | 메모리 덤프, 디버깅 |
Cython | 어려움 | 바이너리 분석, 디스어셈블링 |
Nuitka | 매우 어려움 | 실행 파일 디컴파일 |
하지만, 이러한 리버스 엔지니어링 기법은 일반적인 사용자가 실행하기 어려우며, 법적 문제도 발생할 수 있습니다.
5.2 코드 복원을 방지하는 추가 보안 조치
코드 보호를 더욱 강화하려면 다음과 같은 추가적인 방법을 적용할 수 있습니다.
다층 난독화 적용
- PyArmor + Cython을 함께 사용하여 복원 가능성을 낮춥니다.
- 예제:
pyarmor obfuscate my_script.py nuitka --onefile --follow-imports dist/my_script.py
실행 환경 제한
- 특정 하드웨어에서만 실행되도록 제한합니다.
- 예제:
import socket allowed_hostname = "MyServer" if socket.gethostname() != allowed_hostname: print("❌ 인증 실패!") exit(1)
원본 코드 체크섬 검증
- 코드 변조 여부를 감지하고 실행 차단합니다.
- 예제:
import hashlib original_hash = "abc123" with open(__file__, "r", encoding="utf-8") as f: if hashlib.md5(f.read().encode()).hexdigest() != original_hash: print("❌ 코드 변조 감지됨!") exit(1)
이러한 보호 기법을 조합하여 적용하면 코드 복원을 더욱 어렵게 만들 수 있습니다.
반응형