Pyinstaller で作成した Python プログラムの EXE ファイルを
ウイルスと誤認識された時の回避方法を紹介します。
目次
Python で作成したプログラムをフリーソフトとして公開しています。
EXE の作成には Pyinstaller を使用しています。
-F
と -w
オプションを指定して一般のアプリの様に起動するものを作成した場合に、
作った EXE ファイルをウイルスと誤認識されることがあります。
回避方法を紹介します。
大変申し訳ございません。
本記事を投稿した時点では、 -w
オプションで誤認識されたものが、-c
オプションで回避できていました。
しかし、2024/09/06 に実施したところ、どちらの場合でも誤認識されました。
アンチウイルスソフトも更新されているので、明確な原因は分かっていません。
本記事の内容は、回避できることもある方法としてお読みいただけると幸いです。
追加:2024-09-06
追加:2024-10-18
◆症状とアンチウイルスソフト
◇アンチウイルスソフトの挙動
アンチウイルスソフトには無料版の「アバスト無料アンチウイルス」を使っています。
このソフトには検疫機能が付いており、ウイルスに感染しているファイルを見つけると自動的に隔離します。
この隔離機能ですが、私の PC だと(遅いせいか)通知が出ない時があります。
通知が出ないと突然ファイルにアクセスできなくなり、
何が起きているのか判断できず、原因追究に時間を取られます。
更に悪いことにファイルが隔離されると、同じファイル名のファイルを同じフォルダに作成することができません。
ファイルが無くなった上にフォルダのプロパティが変更されたのかと勘違いしていました。
「アバスト無料アンチウイルス」の場合、検疫されたファイルは、次の4つの処理を施すことができます。
- データを復元する :ファイルを元の場所に戻します
- 復元して例外に追加:ファイルを元の場所に戻し、同じウイルスを検出しないようにします
- 抽出 :ファイルを選択した場所に移動します
- 分析に送る :アバスト脅威研究所にファイルを送信
検疫されたことに気が付いて「復元して例外に追加」を実施すれば、そのPCではその後、検疫されることはありません。
しかし、今回問題にしているファイルは Pyinstaller で作成した EXE ファイルです。
他の PC で実行してもらうために作っているファイルです。
他の PC にコピーして、そこでアンチウイルスソフトに検出されては、信用を失います。
なので、検出されない方法を見つけなければなりません。
※もちろんウイルスが本当に入っていないことが前提です
◇Pyinstallerのエラー
Pyinstaller では、デフォルトで dist フォルダに EXE ファイルが作成されます。
誤検出された場合、dist フォルダの xxx.exe.notanexecutable
あるいは xxx.exe
ファイルが検疫されます。
Pyinstaller では、それらのファイルが存在しないため次のエラーが出ます。
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
◆EXEファイルがウイルスと誤認識される問題の回避方法
◇回避策
【 -c オプションを使う】
このオプションは、--console
オプションと同じです。
アプリの実行時にコマンドプロンプト表示します。
-w
または --noconsole
オプションを指定するとコマンドプロンプトが出なくなります。
-c
と -w
はどちらかを指定します。どちらも指定しない場合、-c
が指定されたとみなされます。
Tkinter などの UI を持ったアプリは、起動後にコマンドプロンプトを表示する必要がないので、-w
オプションを使用します。
しかし、そのことがウイルスと誤検出される要因になっているようです。
-c
オプションを使用してコマンドプロンプトを表示すると、本来必要のないものを表示しているので何とかしたくなります。
幸いに、コマンドプロンプト画面は、次のオプションを指定することで、いったん出てもすぐに見えなくすることができます。
【 --hide-console hide-early オプションを合わせて使う】
するとコンソール画面がすぐに消えるので煩わしく感じません。
--hide-console
オプションは値を一つとります。
hide-early
, minimize-late
, hide-late
, minimize-early
から選びます。
minimize-xx
を選ぶとタスクバーに表示が2つ出ることになります。
この目的のために指定するのであれば、hide-early
で問題ないと思います。
使用例:pyinstaller -F -c --hide-console hide-early myscript.py
◇上手くいかなかった回避策
-c
オプションを使う回避策の前に試した回避策を参考に紹介します。
ネット上で紹介されていた方法ですが、全然うまくいかなかったり、時々うまくいったりして安定しませんでした。
-D
オプションで作成する
上手く行く時といかない時があります
結果が異なる理由は分かっていません
Pyinstallerのバージョンによって結果が変わることもあるようですブートローダーをローカルの環境でビルドし直し、Pyinstallerのインストールをやり直す
Pyinstaller が提供しているブートローダーが要因になる場合、ローカルの環境でビルドし直すことで回避できることがあるようです
一度回避できてもしばらくすると誤検出されたり、安定しませんでした
参考までにブートローダーの作り方を紹介しているサイトを紹介します
◆さいごに
フリーソフトをリリースした後に、自分のパソコンの EXE ファイルがアンチウイルスソフトの検疫に掛かり、焦りました。
今のところウイルスに関する問い合わせは来ていないので、ご迷惑をおかけしないで済んでいるのかもしれません。
そもそもそれほど使われていないだけかもしれませんし、アンチウイルスソフトによっては誤検出されないのかもしれません。
もし迷惑をかけていたらと思うとぞっとします。
実際にはウイルスは入っていないので、感染させる心配はないのですが・・・
◇ご注意
本記事は次のバージョンの下で動作した内容を基に記述しています。
- Python 3.8.5
- pyinstaller 6.8.0
◇免責事項
ご利用に際しては、『免責事項』をご確認ください。
お気づきの点がございましたら『お問い合わせ』からお問い合わせください。