[Anti-Virus] Python 파일 배포

SMONGS·2024년 4월 5일

백신

목록 보기
4/4

백신 프로그램 배포

Pyinstaller

파이썬으로 작성된 소스코드를 윈도우 실행 파일인 exe로 변환하는 도구로 Pyinstaller가 있다.

Pyinstaller는 파이썬으로 작성한 소스코드를 하나의 실행 파일로 만들어준다.

설치

Github 링크

해당 링크에서 확인해 보면 된다.

필자는 vscode에서 바로 사용하기 위해 하단의 명령어를 사용해서 설치해주었다.

pip install pyinstaller

사용

실행 파일로 마들 파이썬 코드가 있는 디렉터리로 이동한 후에 명령어를 사용해줘야 한다.

pyinstaller -F <파이썬 파일명>.py

  • -F를 사용하면 하나의 실행 파일로 만들어 줌
  • -w도 있는데, 콘솔 창 미출력 파일로 만들때 사용
    (ex. pyinstaller -w -F 파일제목.py) <- 띄어쓰기로 구분, w를 먼저 입력해야 하는 듯

실행하면 dist라는 디렉터리에 생성된다.

악성코드 진단/치료 모듈 외부 로딩

배치파일을 만들때 핵심 파일 1개만 배치파일로 만들었는데, 배치파일로 만들었던 py 파일에서 import를 했다면, 그 모듈들은 윈도우 실행 파일 안에 내장된다.

그래서 모듈로 따로 분리했던 파일들을 같이 배치파일로 하지 않아도 문제가 없다.

왜 굳이 분리를 하는가?
백신에서 업데이트가 가장 빈번한 것은 악성코드 패턴이다. 다양한 악성코드를 분석하다 보면 악성코드 중에는 기존의 진단 방식으로는 진단되지 않는 악성코드도 있고, 기존 치료 방식으로 치료되지 않는 악성코드도 존재한다.

그렇기에 새로운 진단 방식과 치료 방식을 설계해서 반영을 할 수 있게 해야 한다.

try:
    m = 'scanmod'
    f, filename, desc = imp.find_module(m, [''])
    module = imp.load_module(m, f, filename, desc)

    cmd = 'ret, vname = module.ScanVirus(~)'
    exec(cmd)
except ImportError:
    ret, vname = scanmod.ScanVirus(~)

이와 같은 형식으로 동적 로딩할 모듈의 파일명을 정해서 그 정보로 찾은 모듈을 로딩해서 명령어를 실행하는 코드이다.

해당 코드에서 imp 라는 별도의 모듈을 사용했다.
해당 모듈은 외부 모듈을 동적으로 import 하기 위해서 사용된다는 것만 기억하자.

py파일 컴파일

치료/진단 파이썬 파일 자체를 배포하는 것은 문제가 맞다.

소스코드를 분석해서 백신의 진단을 우회하는 악성코드를 만들 수 있기 때문이다.

그래서 좀 더 안전한 배포 방법이 소스코드를 컴파일하는 것이다.

import py_compile
import sys
from glob import glob
import shutil
import os


# 파일명 받기 및 pyc 생성
# filename = sys.argv[1]
filename = input()
py_compile.compile(filename)

# pyc파일 가져오기
folder_path = os.path.dirname(filename)
filename = os.path.basename(filename).split(".")[0]

pyc_path = glob(os.path.join(folder_path, "__pycache__") + "/" + filename+"*")[0]


# pyc 파일 이동
shutil.move(pyc_path, os.path.join(folder_path, "./%s.pyc"%filename))


# original 디렉토리 생성
original_dir = os.path.join(folder_path, "original")
if not os.path.exists(original_dir):
    os.makedirs(original_dir)

# # py 파일 이동
shutil.move(os.path.join(folder_path, "%s.py" % filename), os.path.join(original_dir, "%s.py" % filename))

# 원본 pyc 삭제
os.remove(pyc_path)

해당 코드는 python.pyc 파일 생성 이 분의 코드를 보고 조금 수정해서 사용하였다.

정리

PyInstaller를 이용해서 파이썬으로 개발한 백신 위도우 실행파일로 바꾸었다.
악성코드 진단/치료 모듈이 윈도우 실행 파일 내부에 위치하는 것도 확인할 수 있었다.

파이썬의 동적 import 방법을 이용해서 내부에 위치한 악성코드 진단/치료 모듈 이외에 외부에 악성코드 진단/치료 모듈을 둘 수 있다는 것도 알 수 있었다.

profile
반갑습니당~😄

0개의 댓글