diff --git a/.github/ruff.toml b/.github/ruff.toml index 1f72e122..1a7634de 100644 --- a/.github/ruff.toml +++ b/.github/ruff.toml @@ -81,9 +81,6 @@ lint.ignore = [ "B904", # Raise exceptions within except clause using raise from "UP028", # Replace yield over for loop with yield from "C409", # Unnecessary list comprehension passed to tuple() - # TODO(mike-hunhoff): address circular dependencies - # https://github.com/mandiant/capa/issues/2996 - "F401", # Unused imports ] [lint.per-file-ignores] diff --git a/capa/capabilities/dynamic.py b/capa/capabilities/dynamic.py index 2605f578..67f3aaea 100644 --- a/capa/capabilities/dynamic.py +++ b/capa/capabilities/dynamic.py @@ -17,7 +17,6 @@ import itertools import collections from dataclasses import dataclass -import capa.perf import capa.engine import capa.helpers import capa.features.freeze as frz diff --git a/capa/capabilities/static.py b/capa/capabilities/static.py index 6c09f1ed..68b5245c 100644 --- a/capa/capabilities/static.py +++ b/capa/capabilities/static.py @@ -18,7 +18,6 @@ import itertools import collections from dataclasses import dataclass -import capa.perf import capa.engine import capa.helpers import capa.features.freeze as frz diff --git a/capa/features/extractors/binexport2/extractor.py b/capa/features/extractors/binexport2/extractor.py index 502a0c42..9b7d5de3 100644 --- a/capa/features/extractors/binexport2/extractor.py +++ b/capa/features/extractors/binexport2/extractor.py @@ -15,7 +15,6 @@ import logging from typing import Iterator -import capa.features.extractors.elf import capa.features.extractors.common import capa.features.extractors.binexport2.file import capa.features.extractors.binexport2.insn diff --git a/capa/features/extractors/binexport2/file.py b/capa/features/extractors/binexport2/file.py index 6b2aa8a7..7d2e96c5 100644 --- a/capa/features/extractors/binexport2/file.py +++ b/capa/features/extractors/binexport2/file.py @@ -19,7 +19,6 @@ from typing import Iterator import pefile from elftools.elf.elffile import ELFFile -import capa.features.common import capa.features.extractors.common import capa.features.extractors.pefile import capa.features.extractors.elffile diff --git a/capa/features/extractors/binexport2/helpers.py b/capa/features/extractors/binexport2/helpers.py index 976c4230..69d66d41 100644 --- a/capa/features/extractors/binexport2/helpers.py +++ b/capa/features/extractors/binexport2/helpers.py @@ -18,7 +18,6 @@ from collections import defaultdict from dataclasses import dataclass import capa.features.extractors.helpers -import capa.features.extractors.binexport2.helpers from capa.features.common import ARCH_I386, ARCH_AMD64, ARCH_AARCH64 from capa.features.extractors.binexport2.binexport2_pb2 import BinExport2 diff --git a/capa/features/extractors/binja/extractor.py b/capa/features/extractors/binja/extractor.py index 100526f1..3101be66 100644 --- a/capa/features/extractors/binja/extractor.py +++ b/capa/features/extractors/binja/extractor.py @@ -16,7 +16,6 @@ from typing import Iterator import binaryninja as binja -import capa.features.extractors.elf import capa.features.extractors.binja.file import capa.features.extractors.binja.insn import capa.features.extractors.binja.global_ diff --git a/capa/features/extractors/binja/file.py b/capa/features/extractors/binja/file.py index 3d794be8..cff6ac97 100644 --- a/capa/features/extractors/binja/file.py +++ b/capa/features/extractors/binja/file.py @@ -16,9 +16,7 @@ from typing import Iterator from binaryninja import Segment, BinaryView, SymbolType, SymbolBinding -import capa.features.extractors.common import capa.features.extractors.helpers -import capa.features.extractors.strings from capa.features.file import Export, Import, Section, FunctionName from capa.features.common import ( FORMAT_PE, diff --git a/capa/features/extractors/common.py b/capa/features/extractors/common.py index c418af63..86c7e649 100644 --- a/capa/features/extractors/common.py +++ b/capa/features/extractors/common.py @@ -21,7 +21,6 @@ from typing import Iterator import pefile -import capa.features import capa.features.extractors.elf import capa.features.extractors.pefile import capa.features.extractors.strings diff --git a/capa/features/extractors/dnfile/extractor.py b/capa/features/extractors/dnfile/extractor.py index 72c26fd0..fcf73a09 100644 --- a/capa/features/extractors/dnfile/extractor.py +++ b/capa/features/extractors/dnfile/extractor.py @@ -21,7 +21,6 @@ from pathlib import Path import dnfile from dncil.cil.opcode import OpCodes -import capa.features.extractors import capa.features.extractors.dotnetfile import capa.features.extractors.dnfile.file import capa.features.extractors.dnfile.insn diff --git a/capa/features/extractors/ghidra/file.py b/capa/features/extractors/ghidra/file.py index 5f87a663..cf3651a6 100644 --- a/capa/features/extractors/ghidra/file.py +++ b/capa/features/extractors/ghidra/file.py @@ -18,7 +18,6 @@ from typing import Iterator from ghidra.program.model.symbol import SourceType, SymbolType -import capa.features.extractors.common import capa.features.extractors.helpers import capa.features.extractors.strings import capa.features.extractors.ghidra.helpers diff --git a/capa/features/extractors/ida/extractor.py b/capa/features/extractors/ida/extractor.py index b139f2f3..463f4876 100644 --- a/capa/features/extractors/ida/extractor.py +++ b/capa/features/extractors/ida/extractor.py @@ -17,7 +17,6 @@ from typing import Iterator import idaapi import capa.ida.helpers -import capa.features.extractors.elf import capa.features.extractors.ida.file import capa.features.extractors.ida.insn import capa.features.extractors.ida.global_ diff --git a/capa/features/extractors/ida/file.py b/capa/features/extractors/ida/file.py index 5331eb60..b37dae79 100644 --- a/capa/features/extractors/ida/file.py +++ b/capa/features/extractors/ida/file.py @@ -23,7 +23,6 @@ import ida_entry import ida_loader import capa.ida.helpers -import capa.features.extractors.common import capa.features.extractors.helpers import capa.features.extractors.strings import capa.features.extractors.ida.helpers diff --git a/capa/features/extractors/pefile.py b/capa/features/extractors/pefile.py index e1d5dbb4..f24f730e 100644 --- a/capa/features/extractors/pefile.py +++ b/capa/features/extractors/pefile.py @@ -18,11 +18,8 @@ from pathlib import Path import pefile -import capa.features.common -import capa.features.extractors import capa.features.extractors.common import capa.features.extractors.helpers -import capa.features.extractors.strings from capa.features.file import Export, Import, Section from capa.features.common import OS, ARCH_I386, FORMAT_PE, ARCH_AMD64, OS_WINDOWS, Arch, Format, Characteristic from capa.features.address import NO_ADDRESS, FileOffsetAddress, AbsoluteVirtualAddress diff --git a/capa/features/extractors/viv/file.py b/capa/features/extractors/viv/file.py index 4caef75e..4d795e25 100644 --- a/capa/features/extractors/viv/file.py +++ b/capa/features/extractors/viv/file.py @@ -19,10 +19,8 @@ import vivisect import viv_utils import viv_utils.flirt -import capa.features.insn import capa.features.extractors.common import capa.features.extractors.helpers -import capa.features.extractors.strings from capa.features.file import Export, Import, Section, FunctionName from capa.features.common import Feature, Characteristic from capa.features.address import Address, FileOffsetAddress, AbsoluteVirtualAddress diff --git a/capa/features/extractors/vmray/extractor.py b/capa/features/extractors/vmray/extractor.py index 27eeed48..471a6265 100644 --- a/capa/features/extractors/vmray/extractor.py +++ b/capa/features/extractors/vmray/extractor.py @@ -16,7 +16,6 @@ import logging from typing import Iterator from pathlib import Path -import capa.helpers import capa.features.extractors.vmray.call import capa.features.extractors.vmray.file import capa.features.extractors.vmray.global_ diff --git a/capa/features/freeze/__init__.py b/capa/features/freeze/__init__.py index 9ee6a8b2..c6440dbc 100644 --- a/capa/features/freeze/__init__.py +++ b/capa/features/freeze/__init__.py @@ -24,13 +24,8 @@ from typing import Union, Literal, TypeAlias from pydantic import Field, BaseModel, ConfigDict -import capa.helpers import capa.version -import capa.features.file -import capa.features.insn -import capa.features.common import capa.features.address -import capa.features.basicblock import capa.features.extractors.null as null from capa.helpers import assert_never from capa.features.freeze.features import Feature, feature_from_capa diff --git a/capa/ghidra/helpers.py b/capa/ghidra/helpers.py index 8be4c376..c71fbd88 100644 --- a/capa/ghidra/helpers.py +++ b/capa/ghidra/helpers.py @@ -17,9 +17,7 @@ import datetime import contextlib from pathlib import Path -import capa import capa.version -import capa.features.common import capa.features.freeze import capa.render.result_document as rdoc import capa.features.extractors.elf diff --git a/capa/ghidra/plugin/capa_explorer.py b/capa/ghidra/plugin/capa_explorer.py index 550cb989..fa2a8362 100644 --- a/capa/ghidra/plugin/capa_explorer.py +++ b/capa/ghidra/plugin/capa_explorer.py @@ -30,7 +30,6 @@ from ghidra.util.exception import CancelledException from ghidra.program.flatapi import FlatProgramAPI from ghidra.program.model.symbol import Namespace, SourceType, SymbolType -import capa import capa.main import capa.rules import capa.version diff --git a/capa/ida/plugin/form.py b/capa/ida/plugin/form.py index b639d9fc..0395bd65 100644 --- a/capa/ida/plugin/form.py +++ b/capa/ida/plugin/form.py @@ -25,7 +25,6 @@ import ida_kernwin import ida_settings import capa.rules -import capa.engine import capa.loader import capa.version import capa.ida.helpers diff --git a/capa/loader.py b/capa/loader.py index 5b86ac1a..344f7929 100644 --- a/capa/loader.py +++ b/capa/loader.py @@ -22,12 +22,10 @@ from pathlib import Path from rich.console import Console import capa.rules -import capa.helpers import capa.version import capa.features.common import capa.features.freeze as frz import capa.features.address -import capa.features.extractors import capa.render.result_document as rdoc import capa.features.extractors.common from capa.rules import RuleSet diff --git a/capa/main.py b/capa/main.py index c549edb0..8869195a 100644 --- a/capa/main.py +++ b/capa/main.py @@ -30,9 +30,7 @@ from pefile import PEFormatError from rich.logging import RichHandler from elftools.common.exceptions import ELFError -import capa.perf import capa.rules -import capa.engine import capa.loader import capa.helpers import capa.version diff --git a/capa/render/default.py b/capa/render/default.py index 283fb5c4..d9d59c1e 100644 --- a/capa/render/default.py +++ b/capa/render/default.py @@ -16,7 +16,6 @@ import collections import urllib.parse -import rich import rich.table from rich.console import Console diff --git a/capa/rules/__init__.py b/capa/rules/__init__.py index 3f1ac273..9e8eedb6 100644 --- a/capa/rules/__init__.py +++ b/capa/rules/__init__.py @@ -34,7 +34,6 @@ import yaml.parser import capa.perf import capa.engine as ceng -import capa.features import capa.optimizer import capa.features.com import capa.features.file diff --git a/capa/rules/cache.py b/capa/rules/cache.py index 2239e9a0..a4619976 100644 --- a/capa/rules/cache.py +++ b/capa/rules/cache.py @@ -23,7 +23,6 @@ from pathlib import Path from dataclasses import dataclass import capa.rules -import capa.helpers import capa.version logger = logging.getLogger(__name__) diff --git a/scripts/bulk-process.py b/scripts/bulk-process.py index 936bfc87..7c84d779 100644 --- a/scripts/bulk-process.py +++ b/scripts/bulk-process.py @@ -70,11 +70,8 @@ import multiprocessing import multiprocessing.pool from pathlib import Path -import capa import capa.main -import capa.rules import capa.loader -import capa.render.json import capa.capabilities.common import capa.render.result_document as rd diff --git a/scripts/capa-as-library.py b/scripts/capa-as-library.py index 1d935a8e..cbf2fb50 100644 --- a/scripts/capa-as-library.py +++ b/scripts/capa-as-library.py @@ -21,9 +21,7 @@ from pathlib import Path import capa.main import capa.rules -import capa.engine import capa.loader -import capa.features import capa.render.json import capa.render.utils as rutils import capa.render.default diff --git a/scripts/capa2yara.py b/scripts/capa2yara.py index 87614593..44a5b170 100644 --- a/scripts/capa2yara.py +++ b/scripts/capa2yara.py @@ -46,9 +46,6 @@ from pathlib import Path import capa.main import capa.rules -import capa.engine -import capa.features -import capa.features.insn logger = logging.getLogger("capa2yara") diff --git a/scripts/detect-binexport2-capabilities.py b/scripts/detect-binexport2-capabilities.py index 583216ad..8ad29148 100644 --- a/scripts/detect-binexport2-capabilities.py +++ b/scripts/detect-binexport2-capabilities.py @@ -38,12 +38,8 @@ import logging import argparse import capa.main -import capa.rules import capa.loader -import capa.exceptions import capa.render.proto -import capa.render.verbose -import capa.features.freeze import capa.capabilities.common import capa.render.result_document as rd from capa.loader import FORMAT_BINEXPORT2, BACKEND_BINEXPORT2 diff --git a/scripts/detect_duplicate_features.py b/scripts/detect_duplicate_features.py index 6d41eab1..3ecc12db 100644 --- a/scripts/detect_duplicate_features.py +++ b/scripts/detect_duplicate_features.py @@ -17,7 +17,6 @@ import logging import argparse from pathlib import Path -import capa.main import capa.rules from capa.features.common import Feature diff --git a/scripts/match-function-id.py b/scripts/match-function-id.py index dfcfb72a..9c679a60 100644 --- a/scripts/match-function-id.py +++ b/scripts/match-function-id.py @@ -64,11 +64,6 @@ import viv_utils import viv_utils.flirt import capa.main -import capa.rules -import capa.engine -import capa.helpers -import capa.features -import capa.features.freeze from capa.loader import BACKEND_VIV logger = logging.getLogger("capa.match-function-id") diff --git a/scripts/profile-time.py b/scripts/profile-time.py index 09560450..5159d037 100644 --- a/scripts/profile-time.py +++ b/scripts/profile-time.py @@ -57,13 +57,7 @@ from rich.console import Console import capa.main import capa.perf -import capa.rules -import capa.engine -import capa.loader import capa.helpers -import capa.features -import capa.features.common -import capa.features.freeze import capa.capabilities.common logger = logging.getLogger("capa.profile") diff --git a/scripts/proto-to-results.py b/scripts/proto-to-results.py index 4888fdb3..27b86994 100644 --- a/scripts/proto-to-results.py +++ b/scripts/proto-to-results.py @@ -44,10 +44,8 @@ import argparse from pathlib import Path import capa.main -import capa.render.json import capa.render.proto import capa.render.proto.capa_pb2 -import capa.render.result_document logger = logging.getLogger("capa.proto-to-results-json") diff --git a/scripts/show-capabilities-by-function.py b/scripts/show-capabilities-by-function.py index 188d1917..556a578c 100644 --- a/scripts/show-capabilities-by-function.py +++ b/scripts/show-capabilities-by-function.py @@ -65,10 +65,8 @@ import colorama import capa.main import capa.rules import capa.loader -import capa.exceptions import capa.render.utils as rutils import capa.render.verbose -import capa.features.freeze import capa.capabilities.common import capa.render.result_document as rd from capa.features.freeze import Address diff --git a/scripts/show-features.py b/scripts/show-features.py index 8858f72d..a5ad8f2c 100644 --- a/scripts/show-features.py +++ b/scripts/show-features.py @@ -76,12 +76,7 @@ import logging import argparse import capa.main -import capa.rules -import capa.engine -import capa.loader import capa.helpers -import capa.features -import capa.exceptions import capa.render.verbose as v import capa.features.freeze import capa.features.address diff --git a/scripts/show-unused-features.py b/scripts/show-unused-features.py index 45277ccb..25086a26 100644 --- a/scripts/show-unused-features.py +++ b/scripts/show-unused-features.py @@ -25,8 +25,6 @@ from rich.table import Table import capa.main import capa.rules import capa.helpers -import capa.features -import capa.exceptions import capa.render.verbose as v import capa.features.common import capa.features.freeze diff --git a/tests/fixtures.py b/tests/fixtures.py index 3494946b..11c812c2 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -20,7 +20,6 @@ from functools import lru_cache import pytest -import capa.loader import capa.features.file import capa.features.insn import capa.features.common @@ -101,7 +100,6 @@ def xfail(condition, reason: str = ""): # need to limit cache size so GitHub Actions doesn't run out of memory, see #545 @lru_cache(maxsize=1) def get_viv_extractor(path: Path): - import capa.main import capa.loader import capa.features.extractors.viv.extractor @@ -311,7 +309,6 @@ def get_ghidra_extractor(path: Path): import capa.loader import capa.features.extractors.ghidra.context - import capa.features.extractors.ghidra.extractor if path in GHIDRA_CACHE: extractor, program, flat_api, monitor = GHIDRA_CACHE[path] diff --git a/tests/test_binexport_accessors.py b/tests/test_binexport_accessors.py index bc365c0b..73645f87 100644 --- a/tests/test_binexport_accessors.py +++ b/tests/test_binexport_accessors.py @@ -833,7 +833,6 @@ def test_arm_add_two_operand_does_not_crash(): ], "operand_indices": [0, 1], }) - from capa.features.insn import Number features = list(extract_insn_number_features(fh, bbh, ih)) values = {f.value for f, _ in features} diff --git a/tests/test_binexport_features.py b/tests/test_binexport_features.py index 25b13a80..4e107dcc 100644 --- a/tests/test_binexport_features.py +++ b/tests/test_binexport_features.py @@ -20,7 +20,6 @@ import fixtures import capa.features.file import capa.features.insn import capa.features.common -import capa.features.basicblock from capa.features.common import ( OS, OS_LINUX, diff --git a/tests/test_binja_features.py b/tests/test_binja_features.py index d8a2f20a..413d9da4 100644 --- a/tests/test_binja_features.py +++ b/tests/test_binja_features.py @@ -19,8 +19,6 @@ import pytest import fixtures import capa.main -import capa.features.file -import capa.features.common logger = logging.getLogger(__file__) diff --git a/tests/test_cape_features.py b/tests/test_cape_features.py index d3cc4bdd..a93b9bc7 100644 --- a/tests/test_cape_features.py +++ b/tests/test_cape_features.py @@ -15,11 +15,9 @@ import fixtures -import capa.main import capa.features.file import capa.features.insn import capa.features.common -import capa.features.basicblock DYNAMIC_CAPE_FEATURE_PRESENCE_TESTS = sorted( [ diff --git a/tests/test_drakvuf_features.py b/tests/test_drakvuf_features.py index 9f5115ae..8fc89d63 100644 --- a/tests/test_drakvuf_features.py +++ b/tests/test_drakvuf_features.py @@ -15,7 +15,6 @@ import fixtures -import capa.main import capa.features.file import capa.features.insn import capa.features.common diff --git a/tests/test_dynamic_span_of_calls_scope.py b/tests/test_dynamic_span_of_calls_scope.py index 29cadb50..a9d906e3 100644 --- a/tests/test_dynamic_span_of_calls_scope.py +++ b/tests/test_dynamic_span_of_calls_scope.py @@ -38,7 +38,6 @@ from functools import lru_cache import pytest import fixtures -import capa.main import capa.rules import capa.capabilities.dynamic from capa.features.extractors.base_extractor import ThreadFilter, DynamicFeatureExtractor diff --git a/tests/test_freeze_dynamic.py b/tests/test_freeze_dynamic.py index 20580a28..1afb6e48 100644 --- a/tests/test_freeze_dynamic.py +++ b/tests/test_freeze_dynamic.py @@ -19,7 +19,6 @@ import fixtures import capa.main import capa.rules -import capa.features.file import capa.features.insn import capa.features.common import capa.features.freeze diff --git a/tests/test_freeze_static.py b/tests/test_freeze_static.py index 60b05328..173cc1ef 100644 --- a/tests/test_freeze_static.py +++ b/tests/test_freeze_static.py @@ -19,7 +19,6 @@ import pytest import capa.main import capa.rules -import capa.helpers import capa.features.file import capa.features.insn import capa.features.common @@ -27,7 +26,6 @@ import capa.features.freeze import capa.features.basicblock import capa.features.extractors.null import capa.features.freeze.features -import capa.features.extractors.base_extractor from capa.features.address import Address, AbsoluteVirtualAddress from capa.features.extractors.base_extractor import ( BBHandle, diff --git a/tests/test_main.py b/tests/test_main.py index 9cb385ec..5f3ac7b6 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -21,8 +21,6 @@ import fixtures import capa.main import capa.rules -import capa.engine -import capa.features def test_main(z9324d_extractor): diff --git a/tests/test_proto.py b/tests/test_proto.py index 09fe4355..85b4f6d0 100644 --- a/tests/test_proto.py +++ b/tests/test_proto.py @@ -18,9 +18,7 @@ from typing import Any import pytest import capa.rules -import capa.render import capa.render.proto -import capa.render.utils import capa.features.freeze import capa.features.address import capa.render.proto.capa_pb2 as capa_pb2 diff --git a/tests/test_render.py b/tests/test_render.py index 316ea145..bb9e7dac 100644 --- a/tests/test_render.py +++ b/tests/test_render.py @@ -27,7 +27,6 @@ import capa.features.common import capa.features.freeze import capa.render.vverbose import capa.features.address -import capa.features.basicblock import capa.render.result_document import capa.render.result_document as rd import capa.features.freeze.features diff --git a/tests/test_result_document.py b/tests/test_result_document.py index 0dab9f0f..e4468494 100644 --- a/tests/test_result_document.py +++ b/tests/test_result_document.py @@ -18,7 +18,6 @@ import textwrap import pytest import fixtures -import capa import capa.rules import capa.engine as ceng import capa.features.file diff --git a/tests/test_rules.py b/tests/test_rules.py index f8172ee6..6b1be70a 100644 --- a/tests/test_rules.py +++ b/tests/test_rules.py @@ -19,7 +19,6 @@ import pytest import capa.rules import capa.engine -import capa.rules.cache import capa.features.common import capa.features.address from capa.engine import Or diff --git a/tests/test_scripts.py b/tests/test_scripts.py index dea4ee43..4d67512c 100644 --- a/tests/test_scripts.py +++ b/tests/test_scripts.py @@ -266,7 +266,6 @@ def test_missing_static_dynamic_scope_no_crash_when_scopes_absent(): import lint as lint_module import capa.engine - import capa.features.common scopes = capa.rules.Scopes(static=capa.rules.Scope.FUNCTION, dynamic=capa.rules.Scope.PROCESS) statement = capa.engine.And([]) diff --git a/tests/test_vmray_features.py b/tests/test_vmray_features.py index bf035b83..7638f2e4 100644 --- a/tests/test_vmray_features.py +++ b/tests/test_vmray_features.py @@ -15,7 +15,6 @@ import fixtures -import capa.main import capa.features.file import capa.features.insn import capa.features.common diff --git a/web/rules/scripts/build_rules.py b/web/rules/scripts/build_rules.py index 951de134..3d8a8513 100644 --- a/web/rules/scripts/build_rules.py +++ b/web/rules/scripts/build_rules.py @@ -13,11 +13,9 @@ # limitations under the License. -import os import sys import logging import urllib.parse -from glob import glob from pathlib import Path import pygments