-
Notifications
You must be signed in to change notification settings - Fork 283
Expand file tree
/
Copy pathpyproject.toml
More file actions
110 lines (95 loc) · 2.85 KB
/
pyproject.toml
File metadata and controls
110 lines (95 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
[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",
]
gdb = ["udbserver>=0.2.1"]
[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 = ["."]
[tool.setuptools.package-data]
speakeasy = [
"py.typed",
"resources/**/*",
"winenv/decoys/**/*",
]
[tool.ruff]
line-length = 120
target-version = "py310"
exclude = ["deps/"]
[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"]