PyInstaller false-positive 해결하기

DVRP·2022년 1월 19일
0

PyInstaller를 이용해 단일 파일을 생성했는데, 만들어지는 족족 Windows Defender가 Trojan:Win32/Wacatac.B!ml으로 인식하며 지워버리는 일이 발생했다. 갑자기 왜 이러나 싶어서 찾아보니 PyInstaller와 최근 버전의 윈도우에서 흔하게 일어나는 일이라고 한다.

여러 방법을 시도해봤지만 결국 단일 파일로 빌드한 게 문제였다.

PyInstaller 업데이트하기

기존에 설치된 PyInstaller를 삭제하고 pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz를 통해 5.0.dev0 버전으로 설치했다. 이후 다시 빌드해봤지만 여전히 바이러스로 인식됐다.

PyInstaller 부트로더 컴파일하기

미리 컴파일된 PyInstaller 부트로더가 문제일 수도 있다고 해서 이 분의 글을 참고해서 다시 컴파일했다. 이후 빌드해보니 감지된 개수는 줄었지만 여전히 Defender는 바이러스로 인식했다.

이후 build, dist, *.spec과 같은 파일을 삭제하고 계속 빌드하다 보니 딱 한 번 Defender에서 감지되지 않는 파일이 만들어졌다. 그런데 다시 빌드해보니 또 Defender에서 감지되는 이해할 수 없는 현상이 발생했다. 지치기도 했고 앞으로 빌드할 때마다 계속 이런 짓들을 할 수 없어서 그냥 PyInstaller를 버리기로 했다.

--onefile과 PyInstaller 버리기

사실 --onefile 플래그를 버리면 간단히 해결되는 문제다. 실제로 하나의 파일로 합치지 않고 그냥 빌드해보니 아무데서도 바이러스로 인식되지 않았다. 하지만 --onefile을 버리면 디렉토리가 너무나도 지저분하다는 것이 마음에 들지 않았다. 사용자가 보기에는 뭘 클릭해야할지 모르겠는 디렉토리보다는 깔끔하게 딱 정리된 디렉토리가 훨씬 좋을 것임이 당연하기 때문이다. 그래서 아예 PyInstaller를 버리고 cx_Freeze로 넘어갔다.

사용법은 PyInstaller가 더 간편했다. cx_Freeze는 별도의 setup.py 파일을 작성한 다음 python setup.py build 명령어를 통해 빌드해야 했다. 결과물의 크기 또한 PyInstaller가 약 두 배 가량 가벼웠다. 하지만 cx_Freeze의 깔끔함이 이 모든 걸 이겨버렸다.

만들어진 파일을 검사해보니 바이러스로 인식되지 않았다. 신기한 점은 누가 약 2주일 전에 이미 이 파일을 검사한 적이 있다고 나왔다는 것이다. 추정하건대 dll 파일이 실제 처리를 담당하고 exe 파일은 단순히 dll과 라이브러리를 이어주는 역할만 하기 때문에 그런 게 아닐까 싶다. 정말로 그런지는 잘 모르겠다.

왜 이번에만?

그동안 PyInstaller로 단일 실행 파일을 여러 번 만들었었는데, Defender에서 바이러스로 인식한 건 이번이 처음이다. 사실 마이크로소프트에 예외 신청을 넣는 방법도 있었는데 귀찮기도 했고 구글링하면서 단일 실행 파일의 속도가 느리다는 걸 알게 되어서 그냥 cx_Freeze로 넘어갔다.

보니까 .NET Core에도 단일 실행 파일을 만드는 기능이 있던데 괜히 파이썬으로 깔짝대지 말고 처음부터 C#으로 만들 걸 그랬다. GUI 버전은 WPF로 짤 것 같은데 그때 다시 알아봐야겠다.

profile
Dream Vyond Reachable Potential

0개의 댓글