Sogen Windows user-space emulator bindings
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sogen-0.0.1.dev4099.tar.gz.
File metadata
- Download URL: sogen-0.0.1.dev4099.tar.gz
- Upload date:
- Size: 44.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab90357a0fd7c1f8dce64f957e2df4c25a6e2bbc1207886d102044823b88a30b
|
|
| MD5 |
87232e9da90203a8dea882e30c1679c0
|
|
| BLAKE2b-256 |
b3014138cabbbb3429d5a58fc5c824d8f0785001641c6aee94229a3b7fa26337
|
Provenance
The following attestation bundles were made for sogen-0.0.1.dev4099.tar.gz:
Publisher:
build-push.yml on momo5502/sogen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sogen-0.0.1.dev4099.tar.gz -
Subject digest:
ab90357a0fd7c1f8dce64f957e2df4c25a6e2bbc1207886d102044823b88a30b - Sigstore transparency entry: 1813391326
- Sigstore integration time:
-
Permalink:
momo5502/sogen@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/momo5502
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-push.yml@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sogen-0.0.1.dev4099-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: sogen-0.0.1.dev4099-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 4.9 MB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2417d29fd84032ca6824a22bdffee14c64efcb26ce92daa6d349dd918f5cf01
|
|
| MD5 |
d01c62afb400f3ce0dd9ac1d9f86b08f
|
|
| BLAKE2b-256 |
79cc2ef147790b790038347ea13d3d7fd5bf2a4330ddc002fedc2cbacfbd9933
|
Provenance
The following attestation bundles were made for sogen-0.0.1.dev4099-cp39-cp39-win_amd64.whl:
Publisher:
build-push.yml on momo5502/sogen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sogen-0.0.1.dev4099-cp39-cp39-win_amd64.whl -
Subject digest:
a2417d29fd84032ca6824a22bdffee14c64efcb26ce92daa6d349dd918f5cf01 - Sigstore transparency entry: 1813391466
- Sigstore integration time:
-
Permalink:
momo5502/sogen@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/momo5502
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-push.yml@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sogen-0.0.1.dev4099-cp39-cp39-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: sogen-0.0.1.dev4099-cp39-cp39-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 8.7 MB
- Tags: CPython 3.9, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
775e3346adaec2b0209595e6b5037ea4f34b7a07cef9bc97008ba11695776a17
|
|
| MD5 |
49ef2a42dfaa4895bccb9a1146d87c42
|
|
| BLAKE2b-256 |
ce731497f9203a7d474605479e266a912a23329f9179cbd21fd76468990e34c9
|
Provenance
The following attestation bundles were made for sogen-0.0.1.dev4099-cp39-cp39-manylinux_2_39_x86_64.whl:
Publisher:
build-push.yml on momo5502/sogen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sogen-0.0.1.dev4099-cp39-cp39-manylinux_2_39_x86_64.whl -
Subject digest:
775e3346adaec2b0209595e6b5037ea4f34b7a07cef9bc97008ba11695776a17 - Sigstore transparency entry: 1813391677
- Sigstore integration time:
-
Permalink:
momo5502/sogen@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/momo5502
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-push.yml@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sogen-0.0.1.dev4099-cp39-cp39-macosx_15_0_x86_64.whl.
File metadata
- Download URL: sogen-0.0.1.dev4099-cp39-cp39-macosx_15_0_x86_64.whl
- Upload date:
- Size: 6.8 MB
- Tags: CPython 3.9, macOS 15.0+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c8b7704204b62cb3ee456369a8a10258b4f1e45e006c972abc0e75ba3f6ba99f
|
|
| MD5 |
f8eaefc1039a94d9a3f4b654ed7edd4d
|
|
| BLAKE2b-256 |
6aa192edd157335d1dd4f94cce614f141304160d96014b0a5953f8c61fe52969
|
Provenance
The following attestation bundles were made for sogen-0.0.1.dev4099-cp39-cp39-macosx_15_0_x86_64.whl:
Publisher:
build-push.yml on momo5502/sogen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sogen-0.0.1.dev4099-cp39-cp39-macosx_15_0_x86_64.whl -
Subject digest:
c8b7704204b62cb3ee456369a8a10258b4f1e45e006c972abc0e75ba3f6ba99f - Sigstore transparency entry: 1813391603
- Sigstore integration time:
-
Permalink:
momo5502/sogen@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/momo5502
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-push.yml@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sogen-0.0.1.dev4099-cp39-cp39-macosx_15_0_arm64.whl.
File metadata
- Download URL: sogen-0.0.1.dev4099-cp39-cp39-macosx_15_0_arm64.whl
- Upload date:
- Size: 5.9 MB
- Tags: CPython 3.9, macOS 15.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d09a7eccc0052082d568f94505a73eb50bab52ef4c2bbd658e19478cf27c073
|
|
| MD5 |
c9f57b23e4bb139632152ebd5918f045
|
|
| BLAKE2b-256 |
00c2ca0433b7c1fb54f7dc658c77ec59cfbbc3974f4153333f98d12046fa23ad
|
Provenance
The following attestation bundles were made for sogen-0.0.1.dev4099-cp39-cp39-macosx_15_0_arm64.whl:
Publisher:
build-push.yml on momo5502/sogen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sogen-0.0.1.dev4099-cp39-cp39-macosx_15_0_arm64.whl -
Subject digest:
6d09a7eccc0052082d568f94505a73eb50bab52ef4c2bbd658e19478cf27c073 - Sigstore transparency entry: 1813391776
- Sigstore integration time:
-
Permalink:
momo5502/sogen@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/momo5502
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-push.yml@8fe499528c6343d6d051fcbba9876e82ac2571b6 -
Trigger Event:
push
-
Statement type: