This release is a pre-release and may not be stable for production use.
Sogen exposes Python bindings for its Windows userspace emulator. The Python API is meant for scripting runs, building small analysis helpers, and quickly iterating on callbacks and hooks without rebuilding C++.
Install from PyPI:
pip install sogen
Project links:
- PyPI: https://pypi.org/project/sogen/
- Repository: https://github.com/momo5502/sogen
- Ready-made emulation root: https://sogen.dev/root.zip
What you need
The Python package still needs an emulation root at runtime. Download ready-made root here:
Extract it somewhere convenient, for example:
./root
Most examples in this document use:
emulation_root="./root"
Quick start
import sogen
app = sogen.windows.create_application(
"c:/test-sample.exe",
emulation_root="./root",
)
app.callbacks.on_stdout = lambda text: print(text, end="")
app.start()
print("exit status:", app.process.exit_status)
Minimal example with file + port mappings
from pathlib import Path
import sogen
app = sogen.windows.create_application(
"c:/test-sample.exe",
emulation_root="./root",
path_mappings={"c:/a.txt": Path("./a.txt")},
port_mappings={28970: 28980},
)
app.callbacks.on_stdout = lambda text: print(text, end="")
app.start()
print("exit status:", app.process.exit_status)
Choosing backend
sogen.windows.create_empty() and sogen.windows.create_application() accept an explicit backend.
import sogen
emu = sogen.windows.create_empty(
emulation_root="./root",
backend=sogen.Backend.unicorn,
)
Available values:
sogen.Backend.unicornsogen.Backend.iciclesogen.Backend.whp
Default is sogen.Backend.unicorn.
High-level structure
Main entry points:
sogen.windows.create_empty(...)sogen.windows.create_application(...)
Compatibility aliases currently remain at top level:
sogen.create_empty(...)sogen.create_application(...)
Common objects exposed by the bindings:
sogen.windows.Emulator/sogen.windows.WindowsEmulatorProcessContextThreadMemoryManagerHooksCallbacks
Common things you will do:
- run application with
app.start() - watch output with
app.callbacks.on_stdout - react to module loads with
app.callbacks.on_module_load - intercept WinAPI calls with
app.hooks.apis[...] - read/write emulator memory with
read_memory()/write_memory() - save and restore state with
save_snapshot()/restore_snapshot()
Callbacks
Example: print loaded modules.
import sogen
app = sogen.windows.create_application(
"c:/test-sample.exe",
emulation_root="./root",
)
def on_module_load(module):
print(f"loaded {module.name} @ 0x{module.entry_point:x}")
app.callbacks.on_module_load = on_module_load
app.start()
Useful callback slots include:
app.callbacks.on_stdoutapp.callbacks.on_syscallapp.callbacks.on_memory_violateapp.callbacks.on_module_loadapp.callbacks.on_module_unload
API hooks
API hooks are registered through app.hooks.apis.
Use @sogen.windows.api_call(...) to describe calling convention and parameters.
Top-level sogen.api_call(...) remains as compatibility alias.
Observe API call, then run original
import ctypes
import sogen
app = sogen.windows.create_application(
"c:/test-sample.exe",
emulation_root="./root",
)
@sogen.windows.api_call(cc=sogen.CallingConvention.stdcall, params=[ctypes.c_uint32])
def on_sleep(call, params):
print(f"Sleep({params[0]})")
app.hooks.apis["Sleep"] = on_sleep
app.start()
Intercept API call and return custom value
import sogen
app = sogen.windows.create_application(
"c:/hook-sample.exe",
emulation_root="./root",
)
@sogen.windows.api_call(cc=sogen.CallingConvention.stdcall, params=[])
def on_get_current_process_id(call, params):
call.return_value = 0xC0FFEE01
return sogen.ApiContinuation.intercept
app.hooks.apis["GetCurrentProcessId"] = on_get_current_process_id
app.start()
print(app.process.exit_status)
Hook keys can be either:
- bare API name, for example
"Sleep" - qualified module form, for example
"kernel32!Sleep"
Memory and state
The emulator exposes direct state access.
import sogen
emu = sogen.windows.create_empty(emulation_root="./root")
base = emu.memory.allocate_memory(0x1000, sogen.MemoryPermission.read_write)
emu.write_memory(base, b"ABCD")
print(emu.read_memory(base, 4))
state = emu.serialize_state()
emu.write_memory(base, b"WXYZ")
emu.deserialize_state(state)
print(emu.read_memory(base, 4))
For checkpoint-style workflows, use snapshots:
emu.save_snapshot()
# ... mutate state ...
emu.restore_snapshot()
Examples
Small runnable example:
examples/python/basic_usage.py
Example setup notes:
examples/python/README.md
Current limitations / expectations
- bindings require an emulation root
- samples in this repo assume Windows-style guest paths like
c:/... - some workflows are easiest to validate against repo sample binaries such as
test-sample.exeandhook-sample.exe - backend availability depends on platform and how Sogen was built
Metadata
Release files for sogen 0.0.1.dev4275
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sogen-0.0.1.dev4275.tar.gz | 44.9 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| sogen-0.0.1.dev4275-cp39-cp39-win_amd64.whl | CPython 3.9 | CPython 3.9 | Windows x86-64 | Details |
| sogen-0.0.1.dev4275-cp39-cp39-manylinux_2_39_x86_64.whl | CPython 3.9 | CPython 3.9 | Linux glibc 2.39+ x86-64 | Details |
| sogen-0.0.1.dev4275-cp39-cp39-macosx_15_0_x86_64.whl | CPython 3.9 | CPython 3.9 | macOS 15.0+ x86-64 | Details |
| sogen-0.0.1.dev4275-cp39-cp39-macosx_15_0_arm64.whl | CPython 3.9 | CPython 3.9 | macOS 15.0+ ARM64 | Details |
Total release size: 71.3 MB
Release files / sogen-0.0.1.dev4275.tar.gz
| Download URL | sogen-0.0.1.dev4275.tar.gz |
|---|---|
| Size | 44.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ee4552b09ebc2e898a5a5a6c0fd16a4561f2b1de657b43d32bd5c2ec34fae267
|
|
BLAKE2b-256 checksum How to use checksums |
367da6b63d2d1fd9473aab5a434a37de1d594f84726f1e7349d9a357d98d69ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logRelease files / sogen-0.0.1.dev4275-cp39-cp39-win_amd64.whl
| Download URL | sogen-0.0.1.dev4275-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 5.0 MB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0bb60abebd97a40c0de9895bbf77236db79104a186e78d1d226d82dd8b92e0c0
|
|
BLAKE2b-256 checksum How to use checksums |
18774ca9247f4470c1712a3cf472848d7aa43c615e04149df15525403fede0f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logRelease files / sogen-0.0.1.dev4275-cp39-cp39-manylinux_2_39_x86_64.whl
| Download URL | sogen-0.0.1.dev4275-cp39-cp39-manylinux_2_39_x86_64.whl |
|---|---|
| Size | 8.7 MB |
| Tags | CPython 3.9 Linux glibc 2.39+ x86-64 |
|
SHA-256 checksum How to use checksums |
f8728ea3711057a3c39bdc36887eee65743cbc03b1a3fafe1962c60ef45bf441
|
|
BLAKE2b-256 checksum How to use checksums |
e93a5fb55d6a017931e5279f9411e867239cdc7ffb5d39b50b0e348f7add78ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logRelease files / sogen-0.0.1.dev4275-cp39-cp39-macosx_15_0_x86_64.whl
| Download URL | sogen-0.0.1.dev4275-cp39-cp39-macosx_15_0_x86_64.whl |
|---|---|
| Size | 6.9 MB |
| Tags | CPython 3.9 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
6b3ba0d965d28fd6dee41653afbac532851e368c54ca3076e1d2279b0b4be139
|
|
BLAKE2b-256 checksum How to use checksums |
29b360f607a322254f0b0780eedd60c884782ca9f7add45d1d7e25cb54050f35
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency logRelease files / sogen-0.0.1.dev4275-cp39-cp39-macosx_15_0_arm64.whl
| Download URL | sogen-0.0.1.dev4275-cp39-cp39-macosx_15_0_arm64.whl |
|---|---|
| Size | 5.9 MB |
| Tags | CPython 3.9 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
471a0f4b830e1a79049d051476b279f0700a8c9c7d1cb5dd6df74254f81bbecf
|
|
BLAKE2b-256 checksum How to use checksums |
829ee41acfde1ec74307571b5fc5ddd66c2f6f772bbd9418896d22afa24d8fef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.
Transparency log