From 27932f37b9374f0d388ca1f96d956d13a2ea38a0 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 3 Jun 2026 09:24:16 +0200 Subject: [PATCH 1/7] python3Packages.idapro: init at 0.0.9 IDA Library Python module https://pypi.org/project/idapro --- .../python-modules/idapro/default.nix | 40 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 42 insertions(+) create mode 100644 pkgs/development/python-modules/idapro/default.nix diff --git a/pkgs/development/python-modules/idapro/default.nix b/pkgs/development/python-modules/idapro/default.nix new file mode 100644 index 000000000000..76f5c11b1004 --- /dev/null +++ b/pkgs/development/python-modules/idapro/default.nix @@ -0,0 +1,40 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + nix-update-script, + setuptools, + writableTmpDirAsHomeHook, +}: + +buildPythonPackage (finalAttrs: { + pname = "idapro"; + version = "0.0.9"; + pyproject = true; + + __structuredAttrs = true; + + src = fetchPypi { + inherit (finalAttrs) pname version; + hash = "sha256-igQ6ic5QdTPlAuj2WBpPtYut4l6PpgSVRbeexjZ5LjU="; + }; + + build-system = [ setuptools ]; + + nativeBuildInputs = [ writableTmpDirAsHomeHook ]; + + # Module has no tests + doCheck = false; + + # Requires IDE to be installed + # pythonImportsCheck = [ "idapro" ]; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "IDA Library Python module"; + homepage = "https://pypi.org/project/idapro"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ fab ]; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 42f7e233afab..135ce8ef887d 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -7493,6 +7493,8 @@ self: super: with self; { id = callPackage ../development/python-modules/id { }; + idapro = callPackage ../development/python-modules/idapro { }; + idasen = callPackage ../development/python-modules/idasen { }; idasen-ha = callPackage ../development/python-modules/idasen-ha { }; From 0c4de8f4ae939dd765b8ad82e767904d4a9f9c27 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 3 Jun 2026 09:29:28 +0200 Subject: [PATCH 2/7] python3Packages.ida-domain: init at 0.5.0 Python interface for IDA Pro reverse engineering platform https://github.com/HexRaysSA/ida-domain --- .../python-modules/ida-domain/default.nix | 59 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 61 insertions(+) create mode 100644 pkgs/development/python-modules/ida-domain/default.nix diff --git a/pkgs/development/python-modules/ida-domain/default.nix b/pkgs/development/python-modules/ida-domain/default.nix new file mode 100644 index 000000000000..3574a4ee0c93 --- /dev/null +++ b/pkgs/development/python-modules/ida-domain/default.nix @@ -0,0 +1,59 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + graphviz, + idapro, + nix-update-script, + packaging, + pytest-cov-stub, + pytestCheckHook, + setuptools, + typing-extensions, + writableTmpDirAsHomeHook, +}: + +buildPythonPackage (finalAttrs: { + pname = "ida-domain"; + version = "0.5.0"; + pyproject = true; + + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "HexRaysSA"; + repo = "ida-domain"; + tag = "v${finalAttrs.version}"; + hash = "sha256-oa3VQgWDEr4tPQ166EugfS7QrW1DlRb/hwypwKP+Xv4="; + }; + + build-system = [ setuptools ]; + + dependencies = [ + idapro + packaging + typing-extensions + ]; + + nativeCheckInputs = [ + graphviz + pytest-cov-stub + pytestCheckHook + writableTmpDirAsHomeHook + ]; + + # Requires IDE to be installed + doCheck = false; + + # pythonImportsCheck = [ "ida_domain" ]; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "Python interface for IDA Pro reverse engineering platform"; + homepage = "https://github.com/HexRaysSA/ida-domain"; + changelog = "https://github.com/HexRaysSA/ida-domain/releases/tag/${finalAttrs.src.tag}"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ fab ]; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 135ce8ef887d..af9ef012f7fd 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -7493,6 +7493,8 @@ self: super: with self; { id = callPackage ../development/python-modules/id { }; + ida-domain = callPackage ../development/python-modules/ida-domain { }; + idapro = callPackage ../development/python-modules/idapro { }; idasen = callPackage ../development/python-modules/idasen { }; From 12da5015b03725d800d1c890c17d60fa68044026 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 3 Jun 2026 09:47:34 +0200 Subject: [PATCH 3/7] python3Packages.ida-hcli: init at 0.18.1 CLI for IDA plugin management and configuration https://github.com/HexRaysSA/ida-hcli --- pkgs/by-name/hc/hcli/package.nix | 1 + .../python-modules/ida-hcli/default.nix | 93 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 3 files changed, 96 insertions(+) create mode 100644 pkgs/by-name/hc/hcli/package.nix create mode 100644 pkgs/development/python-modules/ida-hcli/default.nix diff --git a/pkgs/by-name/hc/hcli/package.nix b/pkgs/by-name/hc/hcli/package.nix new file mode 100644 index 000000000000..58d31dd89d98 --- /dev/null +++ b/pkgs/by-name/hc/hcli/package.nix @@ -0,0 +1 @@ +{ python3Packages }: with python3Packages; toPythonApplication ida-hcli diff --git a/pkgs/development/python-modules/ida-hcli/default.nix b/pkgs/development/python-modules/ida-hcli/default.nix new file mode 100644 index 000000000000..5e43200e5e5e --- /dev/null +++ b/pkgs/development/python-modules/ida-hcli/default.nix @@ -0,0 +1,93 @@ +{ + lib, + buildPythonPackage, + click, + fetchFromGitHub, + httpx, + idapro, + nix-update-script, + packaging, + pexpect, + pip, + platformdirs, + pydantic, + pytest-asyncio, + pytest-httpx, + pytest-mock, + pytestCheckHook, + questionary, + rich-click, + rich, + semantic-version, + setuptools, + tenacity, + tomli, + writableTmpDirAsHomeHook, +}: + +buildPythonPackage (finalAttrs: { + pname = "ida-hcli"; + version = "0.18.1"; + pyproject = true; + + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "HexRaysSA"; + repo = "ida-hcli"; + tag = "v${finalAttrs.version}"; + hash = "sha256-p7nmibfasnkfvCDHp+luh3VYq7oZ843TfudN1Ce8mLY="; + }; + + build-system = [ setuptools ]; + + dependencies = [ + click + httpx + idapro + packaging + pip + platformdirs + pydantic + questionary + rich + rich-click + semantic-version + tenacity + tomli + ]; + + nativeCheckInputs = [ + pexpect + pytest-asyncio + pytest-httpx + pytest-mock + pytestCheckHook + writableTmpDirAsHomeHook + ]; + + pythonImportsCheck = [ "hcli" ]; + + disabledTestPaths = [ + # Tests require IDA to be installed and configured + "tests/integration/" + "tests/lib/test_ida_python.py" + "tests/lib/test_ida.py" + "tests/lib/test_plugin_bundle_install.py" + "tests/lib/test_plugin_collisions.py" + "tests/lib/test_plugin_install.py" + "tests/lib/test_plugin_records.py" + "tests/lib/test_plugin_settings.py" + ]; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "CLI for IDA plugin management and configuration"; + homepage = "https://github.com/HexRaysSA/ida-hcli"; + changelog = "https://github.com/HexRaysSA/ida-hcli/blob/${finalAttrs.src.rev}/CHANGELOG.md"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ fab ]; + mainProgram = "hcli"; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index af9ef012f7fd..ef5734a6bd4a 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -7495,6 +7495,8 @@ self: super: with self; { ida-domain = callPackage ../development/python-modules/ida-domain { }; + ida-hcli = callPackage ../development/python-modules/ida-hcli { }; + idapro = callPackage ../development/python-modules/idapro { }; idasen = callPackage ../development/python-modules/idasen { }; From b37656cd6afd4bc82f2483da57078eea0462c21e Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 3 Jun 2026 09:51:39 +0200 Subject: [PATCH 4/7] python3Packages.ida-settings: init at 3.4.1 Fetch and set configuration values for IDA Plugins https://github.com/williballenthin/ida-settings --- .../python-modules/ida-settings/default.nix | 47 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 49 insertions(+) create mode 100644 pkgs/development/python-modules/ida-settings/default.nix diff --git a/pkgs/development/python-modules/ida-settings/default.nix b/pkgs/development/python-modules/ida-settings/default.nix new file mode 100644 index 000000000000..609090e45e7e --- /dev/null +++ b/pkgs/development/python-modules/ida-settings/default.nix @@ -0,0 +1,47 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + uv-build, + ida-hcli, + nix-update-script, +}: + +buildPythonPackage (finalAttrs: { + pname = "ida-settings"; + version = "3.4.1"; + pyproject = true; + + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "williballenthin"; + repo = "ida-settings"; + tag = "v${finalAttrs.version}"; + hash = "sha256-YPkJ/yn7ZmEYZJART6oFLO7zIqzgPl2XCq5RfXasFV0="; + }; + + postPatch = '' + substituteInPlace pyproject.toml \ + --replace-fail "uv_build>=0.8.6,<0.9.0" "uv_build" + ''; + + build-system = [ uv-build ]; + + dependencies = [ ida-hcli ]; + + pythonImportsCheck = [ "ida_settings" ]; + + # Module has no tests + doCheck = false; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "Fetch and set configuration values for IDA Plugins"; + homepage = "https://github.com/williballenthin/ida-settings"; + changelog = "https://github.com/williballenthin/ida-settings/releases/tag/${finalAttrs.src.tag}"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ fab ]; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index ef5734a6bd4a..5657b4020b3a 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -7497,6 +7497,8 @@ self: super: with self; { ida-hcli = callPackage ../development/python-modules/ida-hcli { }; + ida-settings = callPackage ../development/python-modules/ida-settings { }; + idapro = callPackage ../development/python-modules/idapro { }; idasen = callPackage ../development/python-modules/idasen { }; From 72297ac714501108b4b339d2fd160acffa0a8d0f Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 3 Jun 2026 10:28:21 +0200 Subject: [PATCH 5/7] python3Packages.ida-netnode: init at 3.0.0 Humane API for storing and accessing persistent data in IDA Pro databases https://github.com/williballenthin/ida-netnode --- .../python-modules/ida-netnode/default.nix | 42 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 44 insertions(+) create mode 100644 pkgs/development/python-modules/ida-netnode/default.nix diff --git a/pkgs/development/python-modules/ida-netnode/default.nix b/pkgs/development/python-modules/ida-netnode/default.nix new file mode 100644 index 000000000000..42d75c4068c1 --- /dev/null +++ b/pkgs/development/python-modules/ida-netnode/default.nix @@ -0,0 +1,42 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + nix-update-script, + setuptools, + six, +}: + +buildPythonPackage (finalAttrs: { + pname = "ida-netnode"; + version = "3.0.0"; + pyproject = true; + + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "williballenthin"; + repo = "ida-netnode"; + tag = "v${finalAttrs.version}"; + hash = "sha256-hXApNeeDYHX41zuYDpSNqSXdM/c8DoVXuB6NMqYf7iU="; + }; + + build-system = [ setuptools ]; + + dependencies = [ six ]; + + # Module has no test and requires IDA to be installed + doCheck = false; + + # pythonImportsCheck = [ "netnode"]; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "Humane API for storing and accessing persistent data in IDA Pro databases"; + homepage = "https://github.com/williballenthin/ida-netnode"; + changelog = "https://github.com/williballenthin/ida-netnode/releases/tag/${finalAttrs.src.tag}"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ fab ]; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 5657b4020b3a..226b9a9593ab 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -7497,6 +7497,8 @@ self: super: with self; { ida-hcli = callPackage ../development/python-modules/ida-hcli { }; + ida-netnode = callPackage ../development/python-modules/ida-netnode { }; + ida-settings = callPackage ../development/python-modules/ida-settings { }; idapro = callPackage ../development/python-modules/idapro { }; From e3b1c9ac413306bfba329b50c2cb11e5c6aa3850 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 3 Jun 2026 10:40:38 +0200 Subject: [PATCH 6/7] python3Packages.python-flirt: migrate to finalAttrs --- pkgs/development/python-modules/python-flirt/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/development/python-modules/python-flirt/default.nix b/pkgs/development/python-modules/python-flirt/default.nix index 36578c6aa841..dc553a334dea 100644 --- a/pkgs/development/python-modules/python-flirt/default.nix +++ b/pkgs/development/python-modules/python-flirt/default.nix @@ -7,7 +7,7 @@ libiconv, }: -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "python-flirt"; version = "0.9.10"; pyproject = true; @@ -15,7 +15,7 @@ buildPythonPackage rec { src = fetchFromGitHub { owner = "williballenthin"; repo = "lancelot"; - rev = "v${version}"; + rev = "v${finalAttrs.version}"; hash = "sha256-fZZTEBkpCE5L4efcNGzAuxCWgOSqc2r77F5U6kpMU6M="; }; @@ -47,4 +47,4 @@ buildPythonPackage rec { license = lib.licenses.asl20; maintainers = [ ]; }; -} +}) From 6f63d84b1118f200b1c1a09612d6a5f954a528f7 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 3 Jun 2026 16:40:00 +0200 Subject: [PATCH 7/7] python3Packages.capa: init at 9.4.0 Tool to identify capabilities in executable files https://github.com/mandiant/capa --- pkgs/by-name/ca/capa/package.nix | 1 + .../python-modules/capa/default.nix | 131 ++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 3 files changed, 134 insertions(+) create mode 100644 pkgs/by-name/ca/capa/package.nix create mode 100644 pkgs/development/python-modules/capa/default.nix diff --git a/pkgs/by-name/ca/capa/package.nix b/pkgs/by-name/ca/capa/package.nix new file mode 100644 index 000000000000..fad27bfb2801 --- /dev/null +++ b/pkgs/by-name/ca/capa/package.nix @@ -0,0 +1 @@ +{ python3Packages }: with python3Packages; toPythonApplication capa diff --git a/pkgs/development/python-modules/capa/default.nix b/pkgs/development/python-modules/capa/default.nix new file mode 100644 index 000000000000..4aeb280f6ad1 --- /dev/null +++ b/pkgs/development/python-modules/capa/default.nix @@ -0,0 +1,131 @@ +{ + lib, + buildPythonPackage, + colorama, + deptry, + dncil, + dnfile, + fetchFromGitHub, + humanize, + ida-netnode, + ida-settings, + jschema-to-python, + msgspec, + mypy-protobuf, + mypy, + networkx, + pefile, + protobuf, + psutil, + pydantic, + pyelftools, + pyghidra, + pygithub, + pytest-instafail, + pytest-sugar, + pytestCheckHook, + python-flirt, + pyyaml, + requests, + rich, + ruamel-yaml, + sarif-om, + setuptools-scm, + setuptools, + stix2, + types-colorama, + types-protobuf, + types-psutil, + types-pyyaml, + types-requests, + viv-utils, + vivisect, + writableTmpDirAsHomeHook, + xmltodict, +}: + +buildPythonPackage (finalAttrs: { + pname = "capa"; + version = "9.4.0"; + pyproject = true; + + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "mandiant"; + repo = "capa"; + tag = "v${finalAttrs.version}"; + hash = "sha256-h9ML+TJe9NprBEy4W7XKahmUTM0d4vY0zIFs6MxYzZ8="; + fetchSubmodules = true; + }; + + build-system = [ + setuptools + setuptools-scm + ]; + + dependencies = [ + colorama + dncil + dnfile + humanize + ida-netnode + ida-settings + msgspec + networkx + pefile + protobuf + pydantic + pyelftools + python-flirt + pyyaml + rich + ruamel-yaml + viv-utils + vivisect + xmltodict + ]; + + optional-dependencies = { + ghidra = [ pyghidra ]; + scripts = [ + jschema-to-python + psutil + requests + sarif-om + stix2 + ]; + }; + + nativeCheckInputs = [ + pygithub + pytestCheckHook + pytest-instafail + pytest-sugar + types-colorama + types-protobuf + types-psutil + types-pyyaml + types-requests + writableTmpDirAsHomeHook + ]; + + pythonImportsCheck = [ "capa" ]; + + disabledTests = [ + # AssertionError + "test_is_dev_environment" + "test_rule_cache_dev_environment" + "test_scripts" + "test_binexport_scripts" + ]; + + meta = { + description = "Tool to identify capabilities in executable files"; + homepage = "https://github.com/mandiant/capa"; + changelog = "https://github.com/mandiant/capa/blob/${finalAttrs.src.tag}/CHANGELOG.md"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ fab ]; + mainProgram = "capa"; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 226b9a9593ab..e5da98b403e0 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -2508,6 +2508,8 @@ self: super: with self; { cantools = callPackage ../development/python-modules/cantools { }; + capa = callPackage ../development/python-modules/capa { }; + capstone = callPackage ../development/python-modules/capstone { inherit (pkgs) capstone; }; capstone_4 = callPackage ../development/python-modules/capstone/4.nix {