
BochsCPU用のPythonバインディング
@yrp の BochsCPU に対する Python バインディングです。FFI を使って、x86 コードを簡単かつ正確にエミュレートできます。
bochscpu-python は、Python 3.8 以降の環境のみが必要です。
何かを素早く動かす最も簡単な方法は、PyPI 上の 安定版パッケージ を使用することです。
python -m pip install bochscpu-python
リポジトリの GitHub Actions タブ から最新の動作するアーティファクトをダウンロードします。ZIP ファイルを展開し、wheel フォルダ内にある .whl ファイルをインストールします。
python -m pip install wheel/bochscpu-$version-$os-$arch.whl
かなり簡単です:
python -m pip install .
またはクローンなしで
python -m pip install git+https://github.com/hugsy/bochscpu-python.git#egg=bochscpu-python
この方法では、必要なビルドツールがすべてインストールされている必要があることに注意してください(後述)。
cmakepipcl、MacOS では clang++、Linux では g++ でテスト済み)build GitHub Actions からダウンロードできます。*.lib を bochscpu/lib/<BuildType> に移動します(BuildType は Debug、Release、RelWithDebInfo などにできます)。python -m pip install -r requirements.txtcmake でビルドします
bochscpu の pyd ファイル(およびその PDB)が生成され、Python セッションで import bochscpu によりインポートできるようになります。.whl を生成することもできます:python -m pip wheel .
bochscpu モジュールをインポートするだけで、楽しい時間の始まりです! パッケージをインストールするとインターフェースファイルもインストールされるため、最新の IDE(VSCode、PyCharm など)で便利な補完が提供されます。
非常に簡素なテンプレートは次のように作成できます:
import bochscpu, bochscpu.utils, bochscpu.cpu
sess = bochscpu.Session()
sess.missing_page_handler = bochscpu.utils.callbacks.missing_page_cb
state = bochscpu.State()
bochscpu.cpu.set_real_mode(state)
hook = bochscpu.Hook()
bochscpu.utils.callbacks.install_default_callbacks(hook)
sess.run([hook,])
これにより、bochscpu セッションが作成され、CPU の状態がリアルモードに設定され、フックには基本コールバック(実行時に print を行うのみ)が事前設定されます。このサンプルは、コードページを割り当てておらず、レジスタも正しく設定していないため、実際には何も行わないことに注意してください。
より完全なテンプレートは、examples/ フォルダ にあります。
https://github.com/hugsy/bochscpu-python/assets/590234/adc5ac5a-a8eb-4982-9537-5ece3f32f8f8
print("hello world") に似たアセンブリコードをエミュレートします
https://github.com/hugsy/bochscpu-python/assets/590234/eb06af06-4b10-490e-ae40-a1d0aed333ca
rand() 関数をエミュレートします
https://github.com/hugsy/bochscpu-python/assets/590234/2486adbc-0878-46f5-83ed-3bcf9774fd26