Files
speakeasy/pyproject.toml
Willi Ballenthin 6b34be60ad Remove the decoy PE builder and decoy files
Synthetic API modules are built by build_api_image, and no module has
the decoy type any more. JitPeFile, the EMPTY_PE_32 and EMPTY_PE_64
husks, the exported function stubs and both is_decoy methods have no
callers.

The default_exe and default_driver PEs in speakeasy/winenv/decoys have
no loader since the decoy fallback was removed. The package, its
package-data entry and the default module_directory_x86/x64 values
that pointed into it are removed. get_native_module_path searches only
the configured module directory, and returns None when that directory
does not exist.
2026-10-11 20:08:51 +01:00

110 lines
2.9 KiB
TOML

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "speakeasy-emulator"
dynamic = ["version"]
description = "Speakeasy malware emulation framework"
readme = "README.md"
license = "MIT"
authors = [
{name = "Andrew Davis"}
]
requires-python = ">=3.10"
classifiers = [
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.13",
"Operating System :: OS Independent",
]
keywords = ["emulator", "malware", "windows", "reverse-engineering", "security"]
dependencies = [
"pefile",
"capstone",
"lznt1",
"unicorn>=2.1.4",
"pycryptodome",
"pydantic>=2.0",
"rich",
]
[project.optional-dependencies]
dev = [
"pytest",
"ruff",
"mypy",
]
[project.urls]
Homepage = "https://github.com/mandiant/speakeasy"
Repository = "https://github.com/mandiant/speakeasy"
Issues = "https://github.com/mandiant/speakeasy/issues"
[project.scripts]
speakeasy = "speakeasy.cli:main"
[tool.setuptools.dynamic]
version = {attr = "speakeasy.version.__version__"}
[tool.setuptools.packages.find]
where = ["."]
include = ["speakeasy*"]
[tool.setuptools.package-data]
speakeasy = [
"py.typed",
"resources/**/*",
]
[tool.ruff]
line-length = 120
target-version = "py310"
exclude = ["deps/", "tests/capa-testfiles/"]
[tool.ruff.lint]
select = ["E", "F", "I", "UP"]
[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_ignores = true
ignore_missing_imports = true
check_untyped_defs = true
# Windows struct definitions using ctypes - extremely dynamic, not worth typing
[[tool.mypy.overrides]]
module = "speakeasy.winenv.defs.*"
disable_error_code = ["attr-defined", "assignment", "var-annotated"]
# Object manager - heavily dynamic attribute access on ctypes structs
[[tool.mypy.overrides]]
module = "speakeasy.windows.objman"
disable_error_code = ["attr-defined", "union-attr", "var-annotated"]
# WDF driver framework - very dynamic dispatch and attribute access
[[tool.mypy.overrides]]
module = "speakeasy.winenv.api.kernelmode.wdfldr"
disable_error_code = ["attr-defined", "union-attr"]
# API handler modules - dynamic dispatch, Windows struct access
[[tool.mypy.overrides]]
module = [
"speakeasy.winenv.api.kernelmode.ntoskrnl",
"speakeasy.winenv.api.kernelmode.netio",
"speakeasy.winenv.api.usermode.kernel32",
"speakeasy.winenv.api.usermode.user32",
"speakeasy.winenv.api.usermode.ws2_32",
"speakeasy.winenv.api.usermode.rpcrt4",
"speakeasy.winenv.api.usermode.msvcrt",
"speakeasy.winenv.api.usermode.netapi32",
"speakeasy.winenv.api.usermode.wtsapi32",
"speakeasy.winenv.api.usermode.shlwapi",
"speakeasy.winenv.api.usermode.iphlpapi",
"speakeasy.winenv.api.usermode.dnsapi",
"speakeasy.windows.kernel_mods.volmgr",
]
disable_error_code = ["attr-defined", "assignment", "union-attr"]
[tool.ty.environment]
extra-paths = ["typings"]