Nuitkaでウイルス誤判定を回避しつつ実行ファイル「exe」をつくる方法


Python Nuitkaの説明

Pythonで以前にSSLのキー出力とSSLサーバーを作りました。
両ソフトともGUI付きですのでWindowsの実行ファイルである「exe」に変更してみようと思います。
PythonがなくともPythonアプリが起動できるようになるソフトはPyinstallerなどが一番有名ですが一つ大きな問題があります。
それはウイルスソフトの誤判定によりVirusTotalなどでウイルス判定されてしまう事です。
この手の.py⇒.exe系のソフトはどうしても誤判定が伴うようです。それだけウィルス作成者がPythonを使いだしたという査証かもしれません。
但しexeにしただけで誤判定されるのは自作ソフト制作者にとっては不利益でしかありません。
今回は上記の理由によりメジャーなPyinstallerを避けてNuitekaによる「exe」化の方法を説明しようと思います。


Nuitkaによる.pyから.exeの変換方法

このソフトはPythonまるごとコンパイルして実行ファイルを作ります。
その為、ファイル容量が重くなりがちですので新規で仮想環境を作り,いらないパッケージをそぎ落としておきます。
Pycharmのターミナルより


conda create -n nuitka python=3.9

Pycharmの設定

python_env

上記のように最低限のパッケージの仮想環境を整えます。
この状態で実行ファイルを起動し必要があれば各パッケージを個別にPipでインストールします。 パイソンプログラムが問題なければNuitekaをインストールします。

pip install nuitka



Nuitkaのコマンド

python -m nuitka --msvc=14.2 --lto=no --standalone --onefile --onefile-tempdir-spec=ssl_server_tempdir --plugin-enable=pylint-warnings --plugin-enable=tk-inter --windows-disable-console --windows-product-name=server --windows-file-description="local server" --windows-product-version=0.0.0.1 --windows-company-name="BooleanEffect" --windows-icon-from-ico=C:\sk.ico ssl_server.py

python -m nuitka --msvc=14.2 --lto=no --standalone --onefile --onefile-tempdir-spec=ssl_server_tempdir --plugin-enable=pylint-warnings --plugin-enable=tk-inter --windows-disable-console --windows-product-name=server --windows-file-description="local server" --windows-product-version=0.0.0.1 --windows-company-name="BooleanEffect" --windows-icon-from-ico=C:\sk.ico ssl_server.py


今回は上記のコマンドを使いました。

まず--msvc=14.2ですがこれでコンパイラーの種類を決めます。
デフォルトは--mingw64と思われますがまぁ人があまり使わない方がウイルス誤検出になりづらいかなとおもいmsvcにしました。
他には--clang、--mingwなどが使えます。但しclangとmsvcはVisualStudioInstallerより変更を押し個別のコンポーネントからインストールが必要となります。
最終的に誤検出が出た場合この4種類のコンパイラーで作り直して試してみるのもいいかもしれません。

VSコンポーネント

「--standalone --onefile --onefile-tempdir-spec=ssl_server_tempdir」でスタンドアローンのdistフォルダを作り圧縮しワンファイル「exe」を作ります。
(--onefile-tempdir-spec)で実行ファイル解凍場所を指定します。このコマンドがない場合は%TEMP%内のフォルダに解凍されそこから実行されるようです。ソフト終了時フォルダごと自動で消します。
(--plugin-enable=tk-inter)今回はtkinterを使っていますのでこのコマンドをいれます。
(--windows-disable-console)で実行時コンソールが立ち上がるのを防止します。但しこれによりprintコマンドで不具合でますのでPythonプログラムのほうでコメントアウトしておくのがよいそうです。
あとはwindowsからはじまるコマンドで誤検出防止目的でソフトのディスクリプションを細かく記入します。

discription

誤判定の解決方法

それでは出来上がった実行ファイルをVirusTotalでチェックしてみます。

discript

13件の誤判定がでてしまいました。日本で有名なソフトも一部入っています。まぁそれだけウイルス制作にPythonおよびNuitekaが使われているということですかね。



それでは解決作としてSSL証明書作成アプリにより作られた証明書でウイル判定されたサーバーソフトにデジタル署名をしてみます。

discription

もともとSSLサーバー向けの証明書でTESTとして未記入で証明書を出力したのでところどころ記載がおかしいですが無事デジタル署名されました。
これをVirusTotalでテストしてみます。

VirusZero

まだある問題点

見事に今回はウイルスゼロとなりました。
まぁデジタル証明しただけで消えるようならもともと誤判定しないようにしてほしいのはやまやまですが、一応誤判定は駆逐できました。
しかしここまで対策しても1つくらいは誤判定されることもあります、また経験上Nuitkaのヴァージョンが浸透してくると誤判定が増える事もあるようです。 回避策としては少し古いヴァージョンのNuitekaを使う方法があります。

今回デジタル署名は自前の自己証明書127.0.0.1.crt/.keyと「osslsigncode」というソフトを使ったのですが署名後のOnefile化したEXEは解凍するとき日本語のフォルダがあると失敗するようでした。署名前の実行ファイルは問題ありません。 ここら辺も課題としてありますが回避にはOnefile化前のdistフォルダを使うという方法もあります。
※127.0.0.1.pfxとsigntool.exeも試しましたが同様でした。


参考リンク Spcial thanks GitHub Nuitka
logo