【Python】Cythonでの難読化をやってみた

「.pyファイルと.pyxファイルの違いは?」

「.soファイルができるらしいけど、できたのは.pyd?」

「pyinstallerでのexe作成とcythonの順番は?」

Cythonとは

■cythonのインストール


pip install cython

.pyと.pyxの違いは?

.pyのままでよいという説明と、.pyxに名前を変えてから難読化するという説明があります。
どちらが正しいのですか?

■.pyと.pyx

項目 .py から.pyx から
利用目的主に難読化難読化 + 高速化
Cython構文の利用不可
型ヒントのサポート必須ではない可(高速化に寄与)
元ファイルの互換性元のPythonコードをそのまま利用Cython向けの変更が必要

Cythonでの難読化

■Cythonビルドスクリプト(setup.py)の作成例

from setuptools import setup
from Cython.Build import cythonize

setup(
ext_modules=cythonize(["module1.py", "module2.py"], compiler_directives={"language_level": "3"})
)

■コンパイルコマンドの実行 :setup.pyによる.so(もしくは.pyd)の作成

コンパイルのコマンド

python setup.py build_ext --inplace

.soができる上がるという説明があったけど、できたのは.pydなのですが?

.pyd ファイルとは
.pyd ファイルは Pythonの拡張モジュール です。
CまたはCythonでコンパイルされたコードをPythonから直接インポートできる形にしたもので、Windows環境では共有ライブラリ(DLL)に似ています。
通常、.so ファイル(LinuxやmacOS用)に相当します。
つまりMacでは.so、Winでは.pydということ

.soではなくて、.cというファイルもあるけど?

.c ファイルの役割
CythonはPythonコード(.py または .pyx)をC言語コード(.c)に変換。
その後、Cコンパイラで .pyd(Windows)または .so(Linux, macOS)を生成します。
.c ファイルはコンパイルプロセスの一部であり、Cコンパイラが必要とする中間生成物です。
つまり、ソフトの起動には関係がなく、私は削除しています

エラー

error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools

C関連のコンパイラが必要なため、インストールします。

・Build toolのダウンロード

Microsoft C++ Build Tools - Visual Studio

インストーラを起動。
「C++ によるデスクトップ開発」ワークロードを選択。
以下のコンポーネントを必ず含める
「MSVC v143 – VS 2022 C++ x64/x86 ビルドツール」
「Windows 11 SDK」

PyInstallerとCython

pyinstallerでのexe作成とcythonの順番は?
exe化を、メインのmain.pyだけにすることもできますか。

PyInstallerとCythonを併用してPythonスクリプトを難読化しつつ、最終的に実行可能なEXEファイルを作成することが可能です。
project/

├── main.py # メインスクリプト(難読化せずそのまま)
├── module1.py # 難読化したいモジュール
├── module1.pyd # 難読化されたモジュール
├── module2.py # 難読化したいモジュール
├── module1.pyd # 難読化されたモジュール
└── setup.py # Cython用のビルドスクリプト

先にCythonで難読化して、最後にPyInstallerでEXEファイルにする。

.pyd ファイルは通常「モジュール」として利用される設計のため、直接実行することはできない。
つまり、ランチャーとする難読化されていないmain.pyが必要。

作成の流れの例
①主な機能はmodule1.pyなどに含めて記述する。
 main.pyはそれらを読み込んで起動するだけの構成にしておく。
②module1.pyなどをCythonで難読化する。(main.pyはできない)
③PyInstallerでmain.pyをEXE化する。
 onefileにするかどうかは自由。

お読みいただきありがとうございます!

WordTOMOからのお知らせ

  • 当ブログの記事内容は、作成時点の情報に基づいています。そのため、記事が公開された後に情報が変更される場合があります。最新の情報は各自でご確認ください。
  • 記事の内容は筆者が調査した結果に基づいていますが、必ずしも完全・正確であるとは限りません。参考情報としてご活用いただき、最終的な判断はご自身の責任で行ってください。
  • 記事の内容に具体的な誤りや不足がある場合は、コメント欄またはお問い合わせフォームからお知らせいただければ幸いです。
  • 当ブログをお読みいただいた評価やコメントをお寄せいただけると励みになります。以下の投票ボタンからぜひご感想をお寄せください!
●投票結果●

まだ投票がありません。

コメント

タイトルとURLをコピーしました