Skip to main content

Sogen Windows user-space emulator bindings

Project description

Sogen

Sogen exposes Python bindings for Windows and Linux userspace emulation. The Python API is meant for scripting runs, building small analysis helpers, and quickly iterating on callbacks; Windows bindings also expose hooks for deeper analysis.

Install from PyPI:

pip install sogen

Project links:

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)

Linux quick start:

import sogen

app = sogen.linux.create_application(
    "/bin/true",
    emulation_root="/",
    backend=sogen.Backend.unicorn,
)

app.start()
print("exit status:", app.process.exit_status)

sogen.linux does not use the root-level sogen.create_application(...) compatibility alias.

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(), sogen.windows.create_application(), and sogen.linux.create_application() accept backend=sogen.Backend.unicorn.

import sogen

emu = sogen.windows.create_empty(
    emulation_root="./root",
    backend=sogen.Backend.unicorn,
)

Available values:

  • sogen.Backend.unicorn
  • sogen.Backend.icicle
  • sogen.Backend.whp (Windows)
  • sogen.Backend.kvm (Linux x86_64)

Default is sogen.Backend.unicorn.

High-level structure

Windows entry points:

  • sogen.windows.create_empty(...)
  • sogen.windows.create_application(...)

Linux entry point:

  • sogen.linux.create_application(...)

Windows compatibility aliases currently remain at top level:

  • sogen.create_empty(...)
  • sogen.create_application(...)

Objects exposed by the Windows bindings:

  • sogen.windows.Emulator / sogen.windows.WindowsEmulator
  • ProcessContext
  • Thread
  • MemoryManager
  • Hooks
  • Callbacks

Linux-specific objects exposed by the bindings:

  • sogen.linux.Emulator / sogen.linux.LinuxEmulator
  • sogen.linux.ProcessContext
  • sogen.linux.MemoryManager
  • sogen.linux.Callbacks

Common Windows workflows:

  • 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_stdout
  • app.callbacks.on_syscall
  • app.callbacks.on_memory_violate
  • app.callbacks.on_module_load
  • app.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 examples:

  • examples/python/basic_usage.py for Windows
  • examples/python/linux_true.py for Linux

Example setup notes:

  • examples/python/README.md

Current limitations / expectations

  • Windows bindings require an emulation root
  • Windows samples in this repo assume Windows-style guest paths like c:/...
  • Windows workflows are easiest to validate against repo sample binaries such as test-sample.exe and hook-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

sogen-0.0.1.dev4397.tar.gz (46.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

sogen-0.0.1.dev4397-cp39-cp39-win_amd64.whl (5.1 MB view details)

Uploaded CPython 3.9Windows x86-64

sogen-0.0.1.dev4397-cp39-cp39-manylinux_2_39_x86_64.whl (8.9 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.39+ x86-64

sogen-0.0.1.dev4397-cp39-cp39-macosx_11_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

sogen-0.0.1.dev4397-cp39-cp39-macosx_10_13_x86_64.whl (7.0 MB view details)

Uploaded CPython 3.9macOS 10.13+ x86-64

File details

Details for the file sogen-0.0.1.dev4397.tar.gz.

File metadata

  • Download URL: sogen-0.0.1.dev4397.tar.gz
  • Upload date:
  • Size: 46.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for sogen-0.0.1.dev4397.tar.gz
Algorithm Hash digest
SHA256 2be31cae2712a2ac25e1df3b2934392559a86ff70323f569e5f0900f48162938
MD5 dfd6136b3b825950099950317f7e4c72
BLAKE2b-256 9603071c0a2c3cd7a01f8a244e7c1056dae087dfa12577289c6ed25a324ef4c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for sogen-0.0.1.dev4397.tar.gz:

Publisher: build-push.yml on momo5502/sogen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sogen-0.0.1.dev4397-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for sogen-0.0.1.dev4397-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 7f8dac5e4e7e62033c0760dc7251bcc4c48586027604659d2ebde72262d51dcf
MD5 c1d0efe3d8b32dcb5fe7c3258def33f2
BLAKE2b-256 29c6f83d74437bea4778ff4f344626702576bee4bba957194b4cac5ad69e71f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for sogen-0.0.1.dev4397-cp39-cp39-win_amd64.whl:

Publisher: build-push.yml on momo5502/sogen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sogen-0.0.1.dev4397-cp39-cp39-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for sogen-0.0.1.dev4397-cp39-cp39-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 660c86d8c27def2f6a817f8b182c2ebaa57c2e2a3192bda6296235c978753496
MD5 2d85df1685e59eeee53a83b56ded8dbd
BLAKE2b-256 0954e681608c589cdc92f3497f0b8d16aec859f0174a08cbe443b2f646621bd7

See more details on using hashes here.

Provenance

The following attestation bundles were made for sogen-0.0.1.dev4397-cp39-cp39-manylinux_2_39_x86_64.whl:

Publisher: build-push.yml on momo5502/sogen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sogen-0.0.1.dev4397-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sogen-0.0.1.dev4397-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 85e710f4c4a9f3c1a9d4c29ee43e9216ff435c485cb7e319b177142146f91fd0
MD5 a35e0a838de3ac1d39c1fa830e6d6b1f
BLAKE2b-256 b28f549745a6e16a030e69a8aa52bb363e0b6c251ef8ac934688935e69961f9f

See more details on using hashes here.

Provenance

The following attestation bundles were made for sogen-0.0.1.dev4397-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: build-push.yml on momo5502/sogen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sogen-0.0.1.dev4397-cp39-cp39-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for sogen-0.0.1.dev4397-cp39-cp39-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e60041ec1c54aaf86fca2f667f2aede52c8a96143eb00ba44854156191e3b8af
MD5 b1335cb7435f9e42d2aefed541393721
BLAKE2b-256 eb5e70435325004db3d7473baffd31e31fc596c241d6ed1025eff9263fe1a4c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for sogen-0.0.1.dev4397-cp39-cp39-macosx_10_13_x86_64.whl:

Publisher: build-push.yml on momo5502/sogen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page