mirror of
https://github.com/mandiant/speakeasy.git
synced 2026-10-12 02:18:47 +00:00
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.
110 lines
2.9 KiB
TOML
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"]
|