
Python-Bindungen für BochsCPU
Python-Bindings für @yrps BochsCPU unter Verwendung von FFI, um x86-Code einfach und präzise zu emulieren.
bochscpu-python erfordert lediglich eine Python-Umgebung ab Version 3.8.
Der mit Abstand einfachste Weg, alles zum Laufen zu bringen, ist die Verwendung der stabilen Paketversion auf PyPI
python -m pip install bochscpu-python
Lade das neueste funktionierende Artefakt vom GitHub-Actions-Tab des Repositorys herunter. Entpacke die ZIP-Datei und installiere die .whl-Datei, die du im Ordner wheel findest.
python -m pip install wheel/bochscpu-$version-$os-$arch.whl
Ziemlich unkompliziert:
python -m pip install .
Oder ohne Klonen:
python -m pip install git+https://github.com/hugsy/bochscpu-python.git#egg=bochscpu-python
Beachte, dass für diesen Ansatz alle erforderlichen Build-Tools installiert sein müssen (wie unten beschrieben).
cmakepipcl für Windows, clang++ für macOS und g++ für Linux)build GitHub Actions heruntergeladen werden*.lib-Dateien in bochscpu/lib/<BuildType> (wobei BuildType Debug, Release, RelWithDebInfo usw. sein kann)python -m pip install -r requirements.txtcmake
Dadurch wird die bochscpu-pyd-Datei (und ihre PDB) erzeugt, die du aus einer Python-Sitzung mit import bochscpu importieren kannst..whl aus dem Projektstammverzeichnis erzeugen:python -m pip wheel .
Importiere einfach das Modul bochscpu und der Spaß kann beginnen! Beim Installieren des Pakets werden auch Schnittstellendateien installiert, sodass moderne IDEs (VSCode, PyCharm usw.) nützliche Vervollständigung anbieten können.
Ein sehr einfaches Grundgerüst kann wie folgt erstellt werden:
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,])
Dadurch wird eine bochscpu-Sitzung erstellt, der CPU-Zustand für den Real Mode festgelegt und Hooks mit einfachen Callbacks vorbelegt (die bei der Ausführung lediglich ein print ausführen). Beachte, dass dieses Beispiel tatsächlich nichts tun wird, da wir keine Codepages alloziert und die Register nicht korrekt darauf gesetzt haben.
Eine vollständigere Vorlage findest du im examples/-Ordner.
https://github.com/hugsy/bochscpu-python/assets/590234/adc5ac5a-a8eb-4982-9537-5ece3f32f8f8
print("hello world")-artigen Assembler-Code im 16-Bit-Real Mode
https://github.com/hugsy/bochscpu-python/assets/590234/eb06af06-4b10-490e-ae40-a1d0aed333ca
rand()-Funktion der Linux-Glibc auf x64
https://github.com/hugsy/bochscpu-python/assets/590234/2486adbc-0878-46f5-83ed-3bcf9774fd26