codevanta 0.1.0__tar.gz → 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codevanta-0.1.0 → codevanta-0.1.1}/CHANGELOG.md +19 -0
- {codevanta-0.1.0/src/codevanta.egg-info → codevanta-0.1.1}/PKG-INFO +69 -46
- {codevanta-0.1.0 → codevanta-0.1.1}/README.md +68 -45
- codevanta-0.1.1/docs/assets/callgraph.png +0 -0
- codevanta-0.1.1/docs/assets/cli.png +0 -0
- codevanta-0.1.1/docs/assets/gui.png +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/install.md +4 -3
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/repository-settings.md +2 -2
- {codevanta-0.1.0 → codevanta-0.1.1}/pyproject.toml +1 -1
- codevanta-0.1.1/src/codevanta/analysis/debug_session.py +1504 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/cli/main.py +179 -1
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/mcp_server/server.py +43 -1
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/mcp_server/tools.py +64 -0
- {codevanta-0.1.0 → codevanta-0.1.1/src/codevanta.egg-info}/PKG-INFO +69 -46
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/SOURCES.txt +5 -0
- codevanta-0.1.1/tests/test_debug_session.py +925 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_mcp_tools.py +2 -1
- {codevanta-0.1.0 → codevanta-0.1.1}/LICENSE +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/MANIFEST.in +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/api.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/architecture.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/attribution.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2b.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2c.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2d.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2e.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2f.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2g.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2h.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2i.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2j.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2k.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase3.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase6.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/release-checklist.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/docs/samples.md +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/requirements.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/agent_commit.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/bench.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/bench_gate.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/check_decompiler_backends.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/fuzz_parsers.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/install.ps1 +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/install.sh +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/make_samples.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/scripts/report_bundle.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/setup.cfg +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/binary_diff.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/callgraph.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/cfg.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/dataflow.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/debugger.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/debuginfo.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompile.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompilers/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompilers/angr_backend.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompilers/base.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompilers/ghidra_backend.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/dynamic.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/emulate.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/evidence_bundle.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/function_hash.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/graph_export.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/html_view.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/jump_tables.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/solver.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/symbolic.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/trace.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/type_propagation.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/type_recovery.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/vtables.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/xrefs.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/api/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/cli/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/disassembler.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/entropy.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/functions.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/loader.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/report.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/strings.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/evidence/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/evidence/confidence.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/evidence/models.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/evidence/provenance.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/gui/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/gui/layout.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/gui/server.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/ir/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/ir/adapters/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/ir/base.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/ir/instruction.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/mcp_server/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/plugins/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/apply.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/clients.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/plan.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/verify.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/storage/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/storage/session.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/dependency_links.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/entry_points.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/requires.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/top_level.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/conftest.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_agent_commit.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_bench.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_bench_gate.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_binary_diff.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_callgraph.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cfg.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cfg_recursive.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_gui.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2b.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2d.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2e.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2f.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2g.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2h.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2i.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2j.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2k.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase3.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase7.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_trace.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_dataflow.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_debugger.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_debuginfo.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_decompile.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_decompile_backends.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_decompiler_parity.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_disassembler.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_dynamic.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_emulate.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_entropy.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_evidence.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_evidence_bundle.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_function_hash.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_functions.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_fuzz_parsers.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_graph_export.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_gui.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_html_view.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_jump_tables.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_loader.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_plugins.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_report_bundle.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_report_callgraph.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_report_phase2.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_samples.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_session.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_setup_plan.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_solver.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_strings.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_symbolic.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_symbolic_parity.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_tooling_config.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_trace.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_trace_samples.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_type_propagation.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_type_recovery.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_vtables.py +0 -0
- {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_xrefs.py +0 -0
|
@@ -4,6 +4,25 @@ All notable changes to CODEVANTA are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.1.1] - 2026-11-13
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Live gdb debug sessions** (`codevanta.analysis.debug_session` + `codevanta debug`
|
|
12
|
+
+ MCP tool `codevanta_debug`): the layer now owns a real `gdb --interpreter=mi2`
|
|
13
|
+
process - launch, break-at (symbol or address), continue, step/next, register
|
|
14
|
+
reads, bounded memory reads, backtrace frames, verified quit - each result typed,
|
|
15
|
+
JSON-safe and evidence-backed (`gdb.mi2`, HIGH, one-run provenance). A missing gdb
|
|
16
|
+
is a typed `AnalysisError` with an install hint, never a traceback.
|
|
17
|
+
- MCP tool count is now 23; the MCP `INSTRUCTIONS` document `debug` as the one
|
|
18
|
+
explicit execution exception.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- README is fully de-hardcoded: real screenshots of the CLI, the loopback dashboard
|
|
23
|
+
and a 97-node call graph export; installation starts from PyPI; volatile counts
|
|
24
|
+
and Windows-only example paths removed; docs describe the actual CI gates.
|
|
25
|
+
|
|
7
26
|
## [Unreleased]
|
|
8
27
|
|
|
9
28
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codevanta
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: CODEVANTA — Advanced Code Intelligence: AI-Powered Reverse Engineering & Binary Analysis Platform
|
|
5
5
|
Author: kevindoni
|
|
6
6
|
License-Expression: MIT
|
|
@@ -49,8 +49,20 @@ Dynamic: license-file
|
|
|
49
49
|
|
|
50
50
|
# CODEVANTA
|
|
51
51
|
|
|
52
|
+
[](https://pypi.org/project/codevanta/)
|
|
53
|
+
|
|
52
54
|
> **Advanced Code Intelligence** — Decode. Analyze. Understand.
|
|
53
55
|
|
|
56
|
+
<p align="center">
|
|
57
|
+
<img src="docs/assets/cli.png" width="840" alt="CODEVANTA CLI - real output of info, functions and xrefs against a committed PE sample"><br>
|
|
58
|
+
<em>CLI - info, functions, xrefs on a committed PE sample</em><br><br>
|
|
59
|
+
<img src="docs/assets/gui.png" width="840" alt="CODEVANTA read-only web dashboard served on loopback"><br>
|
|
60
|
+
<em>Read-only web dashboard (codevanta gui)</em><br><br>
|
|
61
|
+
<img src="docs/assets/callgraph.png" width="840" alt="Self-contained HTML call graph export with pan and zoom"><br>
|
|
62
|
+
<em>HTML call graph export - 97 nodes (codevanta callgraph --format html)</em>
|
|
63
|
+
</p>
|
|
64
|
+
|
|
65
|
+
|
|
54
66
|
CODEVANTA is an AI-powered code intelligence, reverse engineering, and binary
|
|
55
67
|
analysis platform. It helps engineers, security researchers, and analysts
|
|
56
68
|
understand software faster — from source code to executables with missing
|
|
@@ -218,7 +230,7 @@ Phase 2 adds the first reverse-engineering views on top of the phase 1 engine:
|
|
|
218
230
|
`codevanta_diff`, `codevanta_jump_table`, `codevanta_function_hash`,
|
|
219
231
|
`codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`,
|
|
220
232
|
`codevanta_session_save`, and `codevanta_session_list`, alongside the five
|
|
221
|
-
phase 1 tools
|
|
233
|
+
phase 1 tools. `codevanta_diff` takes `max_functions`,
|
|
222
234
|
`deep`, `semantic`, and `threshold`, so the phase 2j pairing pass is reachable
|
|
223
235
|
from an agent without a separate `codevanta_similarity` call.
|
|
224
236
|
- **`analyze` integration** (`core/report.py`) — the `codevanta analyze` JSON
|
|
@@ -267,10 +279,10 @@ tools. Phase 2i adds the `alignment`/`array_groups` layout hints on a struct
|
|
|
267
279
|
suggestion, the `function_similarity`/`normalized_tokens` API, and the
|
|
268
280
|
`codevanta_struct` MCP tool. Phase 2j adds the opt-in semantic pairing pass on the
|
|
269
281
|
binary diff (`semantic=True`, `threshold` defaulting to `0.9`), the
|
|
270
|
-
`codevanta_similarity` MCP tool
|
|
282
|
+
`codevanta_similarity` MCP tool, and the `signed` mnemonic hint on
|
|
271
283
|
struct fields, reachable as `diff --semantic --threshold` and as the
|
|
272
284
|
`codevanta struct` footer `signed:` line. Phase 2k adds the `deep` / `semantic` /
|
|
273
|
-
`threshold` arguments to the `codevanta_diff` MCP tool (
|
|
285
|
+
`threshold` arguments to the `codevanta_diff` MCP tool (no new
|
|
274
286
|
registration), the semantic pass's cross-architecture guard — the pass is skipped
|
|
275
287
|
with a warning naming both `BinaryInfo.architecture` tokens, which are compared
|
|
276
288
|
after trimming whitespace and lower-casing only, so a hand-built `AMD64` does not
|
|
@@ -290,8 +302,17 @@ scope, confidence semantics, and limitations.
|
|
|
290
302
|
|
|
291
303
|
## Installation
|
|
292
304
|
|
|
305
|
+
**From PyPI** (recommended):
|
|
306
|
+
|
|
307
|
+
```powershell
|
|
308
|
+
python -m pip install codevanta
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**From source** (development install with the dev extras):
|
|
312
|
+
|
|
293
313
|
```powershell
|
|
294
|
-
|
|
314
|
+
git clone https://github.com/kevindoni/CODEVANTA.git
|
|
315
|
+
cd CODEVANTA
|
|
295
316
|
python -m pip install -e ".[dev]"
|
|
296
317
|
```
|
|
297
318
|
|
|
@@ -307,47 +328,46 @@ installs, and the full setup/uninstall reference.
|
|
|
307
328
|
## Usage
|
|
308
329
|
|
|
309
330
|
```powershell
|
|
310
|
-
codevanta info
|
|
311
|
-
codevanta functions
|
|
312
|
-
codevanta strings
|
|
313
|
-
codevanta entropy
|
|
314
|
-
codevanta disasm
|
|
315
|
-
codevanta analyze samples\elf64_text.bin --output
|
|
331
|
+
codevanta info samples\pe64_text.bin
|
|
332
|
+
codevanta functions samples\pe64_text.bin --limit 8
|
|
333
|
+
codevanta strings samples\macho64_text.bin --min-length 8
|
|
334
|
+
codevanta entropy samples\pe64_text.bin --threshold 7.2
|
|
335
|
+
codevanta disasm samples\pe64_text.bin --count 40
|
|
336
|
+
codevanta analyze samples\elf64_text.bin --output report.json
|
|
316
337
|
|
|
317
338
|
# Phase 2
|
|
318
|
-
codevanta analyze
|
|
319
|
-
codevanta analyze
|
|
320
|
-
codevanta analyze
|
|
321
|
-
codevanta xrefs
|
|
322
|
-
codevanta cfg
|
|
323
|
-
codevanta cfg
|
|
324
|
-
codevanta cfg
|
|
325
|
-
codevanta jump-table
|
|
326
|
-
codevanta jump-table
|
|
327
|
-
codevanta diff samples\
|
|
328
|
-
codevanta diff samples\
|
|
329
|
-
codevanta diff samples\
|
|
330
|
-
codevanta diff samples\
|
|
331
|
-
codevanta callgraph
|
|
332
|
-
codevanta callgraph
|
|
333
|
-
codevanta callgraph
|
|
339
|
+
codevanta analyze samples\pe64_text.bin --xrefs --cfg # report + xrefs + cfg
|
|
340
|
+
codevanta analyze samples\pe64_text.bin # phase 1 only
|
|
341
|
+
codevanta analyze samples\pe64_text.bin --xref-limit 200 --xrefs -o report.json
|
|
342
|
+
codevanta xrefs samples\pe64_text.bin --limit 40
|
|
343
|
+
codevanta cfg samples\pe64_text.bin # entry point, linear traversal
|
|
344
|
+
codevanta cfg samples\pe64_text.bin --traversal recursive
|
|
345
|
+
codevanta cfg samples\pe64_text.bin --traversal recursive --resolve-indirect
|
|
346
|
+
codevanta jump-table samples\pe64_text.bin --address 0x140001000
|
|
347
|
+
codevanta jump-table samples\pe64_text.bin --address 0x140001000 --entries 64 --json
|
|
348
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin
|
|
349
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --max-functions 20000 --json
|
|
350
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic
|
|
351
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic --threshold 0.75 --json
|
|
352
|
+
codevanta callgraph samples\pe64_text.bin --format dot -o callgraph.dot
|
|
353
|
+
codevanta callgraph samples\pe64_text.bin --format graphml -o callgraph.graphml
|
|
354
|
+
codevanta callgraph samples\pe64_text.bin --format html -o callgraph.html
|
|
334
355
|
Invoke-Item callgraph.html # drag to pan, wheel to zoom, search labels, filter by kind
|
|
335
|
-
codevanta analyze
|
|
336
|
-
codevanta session save
|
|
356
|
+
codevanta analyze samples\pe64_text.bin --callgraph -o report.json
|
|
357
|
+
codevanta session save samples\pe64_text.bin --notes "baseline triage" # prints: session saved: <id>
|
|
337
358
|
codevanta session list --limit 10
|
|
338
|
-
codevanta session show
|
|
339
|
-
codevanta session annotate
|
|
340
|
-
codevanta session notes
|
|
341
|
-
codevanta struct
|
|
342
|
-
codevanta struct samples\handle.bin --function process --include-stack --json
|
|
359
|
+
codevanta session show SESSION_ID # the id that `session save` printed
|
|
360
|
+
codevanta session annotate SESSION_ID 0x140001000 "decrypts config with XOR 0x5a"
|
|
361
|
+
codevanta session notes SESSION_ID
|
|
362
|
+
codevanta struct samples\pe64_text.bin --function codevanta_sample_main --include-stack --json
|
|
343
363
|
|
|
344
364
|
# Phase 3
|
|
345
|
-
codevanta decompile
|
|
365
|
+
codevanta decompile samples\pe64_text.bin 0x140001000 --backend native
|
|
346
366
|
codevanta decompile samples\pe64_text.bin --json
|
|
347
367
|
codevanta decompile samples\pe64_text.bin --max-instructions 20 --output rendering.c
|
|
348
368
|
codevanta emulate samples\pe64_text.bin # returns 42
|
|
349
369
|
codevanta emulate samples\pe64_text.bin --set rdi=2 --mem 0x600000=48454c4c4f
|
|
350
|
-
codevanta emulate
|
|
370
|
+
codevanta emulate samples\pe64_text.bin --resolve-target # jmp/call [rip+..]
|
|
351
371
|
|
|
352
372
|
# Phase 5 — symbol-grade views and dynamic sessions
|
|
353
373
|
codevanta dwarf samples\hello-dwarf # DWARF symbols + type layouts
|
|
@@ -375,8 +395,11 @@ hinted anything. The same data comes back from Python and JSON:
|
|
|
375
395
|
```python
|
|
376
396
|
from codevanta.analysis.binary_diff import diff_binaries
|
|
377
397
|
|
|
378
|
-
|
|
379
|
-
diff
|
|
398
|
+
diff = diff_binaries("samples/pe64_text.bin", "samples/macho64_text.bin")
|
|
399
|
+
print(diff.identical, len(diff.functions_added), len(diff.functions_removed))
|
|
400
|
+
# With semantic=True, the leftovers left unpaired by address and name matching
|
|
401
|
+
# are additionally scored by normalized instruction-shape similarity
|
|
402
|
+
# (threshold defaults to 0.9) and reported in `functions_changed`.
|
|
380
403
|
for delta in diff.functions_changed:
|
|
381
404
|
print(hex(delta.address), delta.similarity) # None unless the pair was scored
|
|
382
405
|
```
|
|
@@ -479,7 +502,7 @@ codevanta gui --no-browser # print the URL and wait
|
|
|
479
502
|
|
|
480
503
|
`codevanta gui` serves one self-contained dashboard page over a loopback-only,
|
|
481
504
|
read-only HTTP server — no extra dependencies, no network access, and the
|
|
482
|
-
analysed file is never executed or written. The page drives
|
|
505
|
+
analysed file is never executed or written. The page drives these JSON routes
|
|
483
506
|
(`/api/health`, `/api/info`, `/api/functions`, `/api/strings`, `/api/xrefs`,
|
|
484
507
|
`/api/cfg`, `/api/struct`, `/api/callgraph`, `/api/diff`, `/api/decompile`,
|
|
485
508
|
`/api/emulate`, `/api/symbolic`, `/api/session_save`, `/api/session_list`), each
|
|
@@ -521,7 +544,7 @@ Safety model: every run prints the exact file changes and a diff first; nothing
|
|
|
521
544
|
is written without `--yes` (or an interactive confirmation); existing configs
|
|
522
545
|
are backed up as `*.codevanta.bak`; re-running the same command is a no-op.
|
|
523
546
|
|
|
524
|
-
MCP tools
|
|
547
|
+
MCP tools: `codevanta_info`, `codevanta_functions`,
|
|
525
548
|
`codevanta_strings`, `codevanta_disasm`, `codevanta_analyze`,
|
|
526
549
|
`codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`, `codevanta_diff`,
|
|
527
550
|
`codevanta_jump_table`, `codevanta_function_hash`, `codevanta_similarity`,
|
|
@@ -612,12 +635,12 @@ plus smoke-tests the wheel on 3.13.
|
|
|
612
635
|
- [Project specification](PROJECT_SPEC.md)
|
|
613
636
|
- [Architecture](docs/architecture.md)
|
|
614
637
|
- [API reference](docs/api.md) — every public Python entry point, the evidence
|
|
615
|
-
contract, the
|
|
638
|
+
contract, the dashboard routes, and the MCP tools
|
|
616
639
|
- [Sample binaries](docs/samples.md) — the committed PE/Mach-O/ELF fixtures and
|
|
617
640
|
how to regenerate them
|
|
618
641
|
- [Contributor attribution](docs/attribution.md) — how agent commits are credited,
|
|
619
642
|
and how to make an agent appear in GitHub's contributor graph
|
|
620
|
-
- [Release checklist](docs/release-checklist.md) — the
|
|
643
|
+
- [Release checklist](docs/release-checklist.md) — the PyPI trusted publisher,
|
|
621
644
|
the `pypi` environment, dry runs, tagging and CI re-runs (maintainers)
|
|
622
645
|
- [Phase 2 — cross-references, CFGs, sessions](docs/phase2.md)
|
|
623
646
|
- [Phase 2b — call graphs, graph export, session annotations](docs/phase2b.md)
|
|
@@ -642,11 +665,11 @@ from `src/`. A phase can be **delivered with named gaps** — those gaps are the
|
|
|
642
665
|
|
|
643
666
|
| Phase | Delivered | Open |
|
|
644
667
|
|-------|-----------|------|
|
|
645
|
-
| **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py
|
|
646
|
-
| **2 · RE views** | ✅ Cross-references, incl. `call_import` / `call_indirect` slot resolution — `analysis/xrefs.py`<br>✅ Linear **and** recursive CFG — `analysis/cfg.py` (`build_cfg`, `build_recursive_cfg`), `codevanta cfg --traversal recursive`<br>✅ Call graphs with DOT / GraphML / HTML export — `analysis/callgraph.py`, `analysis/graph_export.py`, `analysis/html_view.py`<br>✅ Absolute and relative jump tables — `analysis/jump_tables.py` (`MODE_ABSOLUTE`, `MODE_RELATIVE`)<br>✅ SQLite sessions with address annotations — `storage/session.py`, `codevanta session save/list/show/annotate/notes`<br>✅ Structural binary diff, function fingerprints, function similarity — `analysis/binary_diff.py`, `analysis/function_hash.py`<br>✅ Struct-field recovery — `analysis/type_recovery.py`, `codevanta struct`<br>✅ Read-only loopback dashboard
|
|
668
|
+
| **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py` (`dex\n` magic → `_load_dex`)<br>✅ Disassembly, ASCII + UTF-16 strings, function discovery, JSON evidence report — `core/disassembler.py`, `core/strings.py`, `core/functions.py`, `core/report.py`<br>✅ Per-section entropy and packing triage — `core/entropy.py` (`shannon_entropy`, `analyze_entropy`), `codevanta entropy`<br>✅ CLI — see `codevanta --help` (the `session` sub-app adds its own subcommands) — `cli/main.py`<br>✅ MCP server exposing the analysis tools — `mcp_server/server.py` (`build_server().list_tools()`)<br>✅ Guided agent setup for Claude Code, Cursor, Cline and VS Code — `setup/` (`clients.py`, `plan.py`, `apply.py`, `verify.py`) | ⬜ **.NET (CLR), WebAssembly and JVM `.class`/JAR formats** — `loader.py` recognises PE, ELF, Mach-O and DEX only |
|
|
669
|
+
| **2 · RE views** | ✅ Cross-references, incl. `call_import` / `call_indirect` slot resolution — `analysis/xrefs.py`<br>✅ Linear **and** recursive CFG — `analysis/cfg.py` (`build_cfg`, `build_recursive_cfg`), `codevanta cfg --traversal recursive`<br>✅ Call graphs with DOT / GraphML / HTML export — `analysis/callgraph.py`, `analysis/graph_export.py`, `analysis/html_view.py`<br>✅ Absolute and relative jump tables — `analysis/jump_tables.py` (`MODE_ABSOLUTE`, `MODE_RELATIVE`)<br>✅ SQLite sessions with address annotations — `storage/session.py`, `codevanta session save/list/show/annotate/notes`<br>✅ Structural binary diff, function fingerprints, function similarity — `analysis/binary_diff.py`, `analysis/function_hash.py`<br>✅ Struct-field recovery — `analysis/type_recovery.py`, `codevanta struct`<br>✅ Read-only loopback dashboard — `gui/server.py` (`ROUTES`) | ⬜ **Live debugger execution** — `codevanta attach` states outright that "the provider is never launched: this command writes a file and prints a command line"; the gdb/Frida session layer generates scripts and replays traces (`analysis/dynamic.py`, `analysis/trace.py`) but nothing runs gdb/Frida against a target<br>✅ GUI session persistence — `/api/session_save` and `/api/session_list` over `storage/session.py`<br>⬜ **Graph-oriented viewer application** — the shipped viewer is the static HTML/SVG export (`analysis/html_view.py`), not an interactive app |
|
|
647
670
|
| **3 · Decompilation** | ✅ Pseudo-C through three providers — `analysis/decompile.py`, `analysis/decompilers/` (`native`, `angr`, `ghidra` reported by `available_backends()`)<br>✅ Type propagation over decompiled output — `analysis/type_propagation.py`<br>✅ Decompiler parity enforced in CI instead of assumed — `.github/workflows/ci.yml` jobs `decompile-parity` and `ghidra-parity` | ⬜ **Embedded Python scripting** — no script command and no sandboxed interpreter; `session` stores annotations only |
|
|
648
|
-
| **4 · Emulation** | ✅ Bounded, offline emulation that never executes on the host, with explicit `return` / `budget` / `unmapped` / `unsupported` stop reasons — `analysis/emulate.py` (Unicorn), `codevanta emulate`<br>✅
|
|
649
|
-
| **5 · Platform** | ✅ CI/CD with real gates — `ci.yml`
|
|
671
|
+
| **4 · Emulation** | ✅ Bounded, offline emulation that never executes on the host, with explicit `return` / `budget` / `unmapped` / `unsupported` stop reasons — `analysis/emulate.py` (Unicorn), `codevanta emulate`<br>✅ Emulation test suite — `tests/test_emulate.py` | ⬜ **Typed / SSA IR lifting** — `ir/base.py` and `ir/adapters/` are a contract plus an empty registry ("Concrete adapters arrive in phase 4")<br>⚠️ **Symbolic execution** — bounded path exploration over Unicorn exists (`analysis/symbolic.py`, seeded branches recorded as assumptions); no solver-based symbolic execution (`Simulator`/`SimulationManager`/Z3) in `src/` |
|
|
672
|
+
| **5 · Platform** | ✅ CI/CD with real gates — `ci.yml` gates the test matrix, `type-check` (mypy), the wheel smoke test, `decompile-parity` and `fuzz smoke`, with best-effort `ghidra-parity`, an informational `benchmark`, and non-blocking windows/macOS platform runs (see the workflow for the current job list) and `pyproject.toml` sets `fail_under = 85` coverage<br>✅ Release pipeline — `release.yml`: `build` → `publish-pypi` (trusted publishing) → `github-release`; used for the v0.1.0 release<br>✅ Dynamic provider probing, script generation and trace replay reachable from the CLI — `analysis/dynamic.py`, `analysis/trace.py` (`parse_gdb_trace`, `parse_frida_trace`), `codevanta attach`, `codevanta trace` | ✅ **Plugin SDK** — `plugins/` (entry-point discovery, bounded `run_plugin`, built-in registry, `MetricsAnalyzer`)<br>⬜ **Full AI layer** and **multi-user** — no auth, user or tenant model exists in `src/`<br>✅ **Evidence bundle** — `analysis/evidence_bundle.py` (manifest, per-entry tamper detection) and `scripts/report_bundle.py` (report + trace → verifiable bundle)<br>✅ **Fuzz and benchmark** — `scripts/fuzz_parsers.py` (`fuzz-smoke` job) and `scripts/bench_gate.py` (`benchmark` job, informational)<br>✅ **Windows / macOS CI** — `test-platform` matrix py3.13 on windows-latest and macos-latest (non-blocking platform signal)<br>✅ **PyPI release** — v0.1.0 published through trusted publishing: a `v*` tag drives `release.yml` |
|
|
650
673
|
|
|
651
674
|
## Product principles
|
|
652
675
|
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
# CODEVANTA
|
|
2
2
|
|
|
3
|
+
[](https://pypi.org/project/codevanta/)
|
|
4
|
+
|
|
3
5
|
> **Advanced Code Intelligence** — Decode. Analyze. Understand.
|
|
4
6
|
|
|
7
|
+
<p align="center">
|
|
8
|
+
<img src="docs/assets/cli.png" width="840" alt="CODEVANTA CLI - real output of info, functions and xrefs against a committed PE sample"><br>
|
|
9
|
+
<em>CLI - info, functions, xrefs on a committed PE sample</em><br><br>
|
|
10
|
+
<img src="docs/assets/gui.png" width="840" alt="CODEVANTA read-only web dashboard served on loopback"><br>
|
|
11
|
+
<em>Read-only web dashboard (codevanta gui)</em><br><br>
|
|
12
|
+
<img src="docs/assets/callgraph.png" width="840" alt="Self-contained HTML call graph export with pan and zoom"><br>
|
|
13
|
+
<em>HTML call graph export - 97 nodes (codevanta callgraph --format html)</em>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
|
|
5
17
|
CODEVANTA is an AI-powered code intelligence, reverse engineering, and binary
|
|
6
18
|
analysis platform. It helps engineers, security researchers, and analysts
|
|
7
19
|
understand software faster — from source code to executables with missing
|
|
@@ -169,7 +181,7 @@ Phase 2 adds the first reverse-engineering views on top of the phase 1 engine:
|
|
|
169
181
|
`codevanta_diff`, `codevanta_jump_table`, `codevanta_function_hash`,
|
|
170
182
|
`codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`,
|
|
171
183
|
`codevanta_session_save`, and `codevanta_session_list`, alongside the five
|
|
172
|
-
phase 1 tools
|
|
184
|
+
phase 1 tools. `codevanta_diff` takes `max_functions`,
|
|
173
185
|
`deep`, `semantic`, and `threshold`, so the phase 2j pairing pass is reachable
|
|
174
186
|
from an agent without a separate `codevanta_similarity` call.
|
|
175
187
|
- **`analyze` integration** (`core/report.py`) — the `codevanta analyze` JSON
|
|
@@ -218,10 +230,10 @@ tools. Phase 2i adds the `alignment`/`array_groups` layout hints on a struct
|
|
|
218
230
|
suggestion, the `function_similarity`/`normalized_tokens` API, and the
|
|
219
231
|
`codevanta_struct` MCP tool. Phase 2j adds the opt-in semantic pairing pass on the
|
|
220
232
|
binary diff (`semantic=True`, `threshold` defaulting to `0.9`), the
|
|
221
|
-
`codevanta_similarity` MCP tool
|
|
233
|
+
`codevanta_similarity` MCP tool, and the `signed` mnemonic hint on
|
|
222
234
|
struct fields, reachable as `diff --semantic --threshold` and as the
|
|
223
235
|
`codevanta struct` footer `signed:` line. Phase 2k adds the `deep` / `semantic` /
|
|
224
|
-
`threshold` arguments to the `codevanta_diff` MCP tool (
|
|
236
|
+
`threshold` arguments to the `codevanta_diff` MCP tool (no new
|
|
225
237
|
registration), the semantic pass's cross-architecture guard — the pass is skipped
|
|
226
238
|
with a warning naming both `BinaryInfo.architecture` tokens, which are compared
|
|
227
239
|
after trimming whitespace and lower-casing only, so a hand-built `AMD64` does not
|
|
@@ -241,8 +253,17 @@ scope, confidence semantics, and limitations.
|
|
|
241
253
|
|
|
242
254
|
## Installation
|
|
243
255
|
|
|
256
|
+
**From PyPI** (recommended):
|
|
257
|
+
|
|
258
|
+
```powershell
|
|
259
|
+
python -m pip install codevanta
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**From source** (development install with the dev extras):
|
|
263
|
+
|
|
244
264
|
```powershell
|
|
245
|
-
|
|
265
|
+
git clone https://github.com/kevindoni/CODEVANTA.git
|
|
266
|
+
cd CODEVANTA
|
|
246
267
|
python -m pip install -e ".[dev]"
|
|
247
268
|
```
|
|
248
269
|
|
|
@@ -258,47 +279,46 @@ installs, and the full setup/uninstall reference.
|
|
|
258
279
|
## Usage
|
|
259
280
|
|
|
260
281
|
```powershell
|
|
261
|
-
codevanta info
|
|
262
|
-
codevanta functions
|
|
263
|
-
codevanta strings
|
|
264
|
-
codevanta entropy
|
|
265
|
-
codevanta disasm
|
|
266
|
-
codevanta analyze samples\elf64_text.bin --output
|
|
282
|
+
codevanta info samples\pe64_text.bin
|
|
283
|
+
codevanta functions samples\pe64_text.bin --limit 8
|
|
284
|
+
codevanta strings samples\macho64_text.bin --min-length 8
|
|
285
|
+
codevanta entropy samples\pe64_text.bin --threshold 7.2
|
|
286
|
+
codevanta disasm samples\pe64_text.bin --count 40
|
|
287
|
+
codevanta analyze samples\elf64_text.bin --output report.json
|
|
267
288
|
|
|
268
289
|
# Phase 2
|
|
269
|
-
codevanta analyze
|
|
270
|
-
codevanta analyze
|
|
271
|
-
codevanta analyze
|
|
272
|
-
codevanta xrefs
|
|
273
|
-
codevanta cfg
|
|
274
|
-
codevanta cfg
|
|
275
|
-
codevanta cfg
|
|
276
|
-
codevanta jump-table
|
|
277
|
-
codevanta jump-table
|
|
278
|
-
codevanta diff samples\
|
|
279
|
-
codevanta diff samples\
|
|
280
|
-
codevanta diff samples\
|
|
281
|
-
codevanta diff samples\
|
|
282
|
-
codevanta callgraph
|
|
283
|
-
codevanta callgraph
|
|
284
|
-
codevanta callgraph
|
|
290
|
+
codevanta analyze samples\pe64_text.bin --xrefs --cfg # report + xrefs + cfg
|
|
291
|
+
codevanta analyze samples\pe64_text.bin # phase 1 only
|
|
292
|
+
codevanta analyze samples\pe64_text.bin --xref-limit 200 --xrefs -o report.json
|
|
293
|
+
codevanta xrefs samples\pe64_text.bin --limit 40
|
|
294
|
+
codevanta cfg samples\pe64_text.bin # entry point, linear traversal
|
|
295
|
+
codevanta cfg samples\pe64_text.bin --traversal recursive
|
|
296
|
+
codevanta cfg samples\pe64_text.bin --traversal recursive --resolve-indirect
|
|
297
|
+
codevanta jump-table samples\pe64_text.bin --address 0x140001000
|
|
298
|
+
codevanta jump-table samples\pe64_text.bin --address 0x140001000 --entries 64 --json
|
|
299
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin
|
|
300
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --max-functions 20000 --json
|
|
301
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic
|
|
302
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic --threshold 0.75 --json
|
|
303
|
+
codevanta callgraph samples\pe64_text.bin --format dot -o callgraph.dot
|
|
304
|
+
codevanta callgraph samples\pe64_text.bin --format graphml -o callgraph.graphml
|
|
305
|
+
codevanta callgraph samples\pe64_text.bin --format html -o callgraph.html
|
|
285
306
|
Invoke-Item callgraph.html # drag to pan, wheel to zoom, search labels, filter by kind
|
|
286
|
-
codevanta analyze
|
|
287
|
-
codevanta session save
|
|
307
|
+
codevanta analyze samples\pe64_text.bin --callgraph -o report.json
|
|
308
|
+
codevanta session save samples\pe64_text.bin --notes "baseline triage" # prints: session saved: <id>
|
|
288
309
|
codevanta session list --limit 10
|
|
289
|
-
codevanta session show
|
|
290
|
-
codevanta session annotate
|
|
291
|
-
codevanta session notes
|
|
292
|
-
codevanta struct
|
|
293
|
-
codevanta struct samples\handle.bin --function process --include-stack --json
|
|
310
|
+
codevanta session show SESSION_ID # the id that `session save` printed
|
|
311
|
+
codevanta session annotate SESSION_ID 0x140001000 "decrypts config with XOR 0x5a"
|
|
312
|
+
codevanta session notes SESSION_ID
|
|
313
|
+
codevanta struct samples\pe64_text.bin --function codevanta_sample_main --include-stack --json
|
|
294
314
|
|
|
295
315
|
# Phase 3
|
|
296
|
-
codevanta decompile
|
|
316
|
+
codevanta decompile samples\pe64_text.bin 0x140001000 --backend native
|
|
297
317
|
codevanta decompile samples\pe64_text.bin --json
|
|
298
318
|
codevanta decompile samples\pe64_text.bin --max-instructions 20 --output rendering.c
|
|
299
319
|
codevanta emulate samples\pe64_text.bin # returns 42
|
|
300
320
|
codevanta emulate samples\pe64_text.bin --set rdi=2 --mem 0x600000=48454c4c4f
|
|
301
|
-
codevanta emulate
|
|
321
|
+
codevanta emulate samples\pe64_text.bin --resolve-target # jmp/call [rip+..]
|
|
302
322
|
|
|
303
323
|
# Phase 5 — symbol-grade views and dynamic sessions
|
|
304
324
|
codevanta dwarf samples\hello-dwarf # DWARF symbols + type layouts
|
|
@@ -326,8 +346,11 @@ hinted anything. The same data comes back from Python and JSON:
|
|
|
326
346
|
```python
|
|
327
347
|
from codevanta.analysis.binary_diff import diff_binaries
|
|
328
348
|
|
|
329
|
-
|
|
330
|
-
diff
|
|
349
|
+
diff = diff_binaries("samples/pe64_text.bin", "samples/macho64_text.bin")
|
|
350
|
+
print(diff.identical, len(diff.functions_added), len(diff.functions_removed))
|
|
351
|
+
# With semantic=True, the leftovers left unpaired by address and name matching
|
|
352
|
+
# are additionally scored by normalized instruction-shape similarity
|
|
353
|
+
# (threshold defaults to 0.9) and reported in `functions_changed`.
|
|
331
354
|
for delta in diff.functions_changed:
|
|
332
355
|
print(hex(delta.address), delta.similarity) # None unless the pair was scored
|
|
333
356
|
```
|
|
@@ -430,7 +453,7 @@ codevanta gui --no-browser # print the URL and wait
|
|
|
430
453
|
|
|
431
454
|
`codevanta gui` serves one self-contained dashboard page over a loopback-only,
|
|
432
455
|
read-only HTTP server — no extra dependencies, no network access, and the
|
|
433
|
-
analysed file is never executed or written. The page drives
|
|
456
|
+
analysed file is never executed or written. The page drives these JSON routes
|
|
434
457
|
(`/api/health`, `/api/info`, `/api/functions`, `/api/strings`, `/api/xrefs`,
|
|
435
458
|
`/api/cfg`, `/api/struct`, `/api/callgraph`, `/api/diff`, `/api/decompile`,
|
|
436
459
|
`/api/emulate`, `/api/symbolic`, `/api/session_save`, `/api/session_list`), each
|
|
@@ -472,7 +495,7 @@ Safety model: every run prints the exact file changes and a diff first; nothing
|
|
|
472
495
|
is written without `--yes` (or an interactive confirmation); existing configs
|
|
473
496
|
are backed up as `*.codevanta.bak`; re-running the same command is a no-op.
|
|
474
497
|
|
|
475
|
-
MCP tools
|
|
498
|
+
MCP tools: `codevanta_info`, `codevanta_functions`,
|
|
476
499
|
`codevanta_strings`, `codevanta_disasm`, `codevanta_analyze`,
|
|
477
500
|
`codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`, `codevanta_diff`,
|
|
478
501
|
`codevanta_jump_table`, `codevanta_function_hash`, `codevanta_similarity`,
|
|
@@ -563,12 +586,12 @@ plus smoke-tests the wheel on 3.13.
|
|
|
563
586
|
- [Project specification](PROJECT_SPEC.md)
|
|
564
587
|
- [Architecture](docs/architecture.md)
|
|
565
588
|
- [API reference](docs/api.md) — every public Python entry point, the evidence
|
|
566
|
-
contract, the
|
|
589
|
+
contract, the dashboard routes, and the MCP tools
|
|
567
590
|
- [Sample binaries](docs/samples.md) — the committed PE/Mach-O/ELF fixtures and
|
|
568
591
|
how to regenerate them
|
|
569
592
|
- [Contributor attribution](docs/attribution.md) — how agent commits are credited,
|
|
570
593
|
and how to make an agent appear in GitHub's contributor graph
|
|
571
|
-
- [Release checklist](docs/release-checklist.md) — the
|
|
594
|
+
- [Release checklist](docs/release-checklist.md) — the PyPI trusted publisher,
|
|
572
595
|
the `pypi` environment, dry runs, tagging and CI re-runs (maintainers)
|
|
573
596
|
- [Phase 2 — cross-references, CFGs, sessions](docs/phase2.md)
|
|
574
597
|
- [Phase 2b — call graphs, graph export, session annotations](docs/phase2b.md)
|
|
@@ -593,11 +616,11 @@ from `src/`. A phase can be **delivered with named gaps** — those gaps are the
|
|
|
593
616
|
|
|
594
617
|
| Phase | Delivered | Open |
|
|
595
618
|
|-------|-----------|------|
|
|
596
|
-
| **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py
|
|
597
|
-
| **2 · RE views** | ✅ Cross-references, incl. `call_import` / `call_indirect` slot resolution — `analysis/xrefs.py`<br>✅ Linear **and** recursive CFG — `analysis/cfg.py` (`build_cfg`, `build_recursive_cfg`), `codevanta cfg --traversal recursive`<br>✅ Call graphs with DOT / GraphML / HTML export — `analysis/callgraph.py`, `analysis/graph_export.py`, `analysis/html_view.py`<br>✅ Absolute and relative jump tables — `analysis/jump_tables.py` (`MODE_ABSOLUTE`, `MODE_RELATIVE`)<br>✅ SQLite sessions with address annotations — `storage/session.py`, `codevanta session save/list/show/annotate/notes`<br>✅ Structural binary diff, function fingerprints, function similarity — `analysis/binary_diff.py`, `analysis/function_hash.py`<br>✅ Struct-field recovery — `analysis/type_recovery.py`, `codevanta struct`<br>✅ Read-only loopback dashboard
|
|
619
|
+
| **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py` (`dex\n` magic → `_load_dex`)<br>✅ Disassembly, ASCII + UTF-16 strings, function discovery, JSON evidence report — `core/disassembler.py`, `core/strings.py`, `core/functions.py`, `core/report.py`<br>✅ Per-section entropy and packing triage — `core/entropy.py` (`shannon_entropy`, `analyze_entropy`), `codevanta entropy`<br>✅ CLI — see `codevanta --help` (the `session` sub-app adds its own subcommands) — `cli/main.py`<br>✅ MCP server exposing the analysis tools — `mcp_server/server.py` (`build_server().list_tools()`)<br>✅ Guided agent setup for Claude Code, Cursor, Cline and VS Code — `setup/` (`clients.py`, `plan.py`, `apply.py`, `verify.py`) | ⬜ **.NET (CLR), WebAssembly and JVM `.class`/JAR formats** — `loader.py` recognises PE, ELF, Mach-O and DEX only |
|
|
620
|
+
| **2 · RE views** | ✅ Cross-references, incl. `call_import` / `call_indirect` slot resolution — `analysis/xrefs.py`<br>✅ Linear **and** recursive CFG — `analysis/cfg.py` (`build_cfg`, `build_recursive_cfg`), `codevanta cfg --traversal recursive`<br>✅ Call graphs with DOT / GraphML / HTML export — `analysis/callgraph.py`, `analysis/graph_export.py`, `analysis/html_view.py`<br>✅ Absolute and relative jump tables — `analysis/jump_tables.py` (`MODE_ABSOLUTE`, `MODE_RELATIVE`)<br>✅ SQLite sessions with address annotations — `storage/session.py`, `codevanta session save/list/show/annotate/notes`<br>✅ Structural binary diff, function fingerprints, function similarity — `analysis/binary_diff.py`, `analysis/function_hash.py`<br>✅ Struct-field recovery — `analysis/type_recovery.py`, `codevanta struct`<br>✅ Read-only loopback dashboard — `gui/server.py` (`ROUTES`) | ⬜ **Live debugger execution** — `codevanta attach` states outright that "the provider is never launched: this command writes a file and prints a command line"; the gdb/Frida session layer generates scripts and replays traces (`analysis/dynamic.py`, `analysis/trace.py`) but nothing runs gdb/Frida against a target<br>✅ GUI session persistence — `/api/session_save` and `/api/session_list` over `storage/session.py`<br>⬜ **Graph-oriented viewer application** — the shipped viewer is the static HTML/SVG export (`analysis/html_view.py`), not an interactive app |
|
|
598
621
|
| **3 · Decompilation** | ✅ Pseudo-C through three providers — `analysis/decompile.py`, `analysis/decompilers/` (`native`, `angr`, `ghidra` reported by `available_backends()`)<br>✅ Type propagation over decompiled output — `analysis/type_propagation.py`<br>✅ Decompiler parity enforced in CI instead of assumed — `.github/workflows/ci.yml` jobs `decompile-parity` and `ghidra-parity` | ⬜ **Embedded Python scripting** — no script command and no sandboxed interpreter; `session` stores annotations only |
|
|
599
|
-
| **4 · Emulation** | ✅ Bounded, offline emulation that never executes on the host, with explicit `return` / `budget` / `unmapped` / `unsupported` stop reasons — `analysis/emulate.py` (Unicorn), `codevanta emulate`<br>✅
|
|
600
|
-
| **5 · Platform** | ✅ CI/CD with real gates — `ci.yml`
|
|
622
|
+
| **4 · Emulation** | ✅ Bounded, offline emulation that never executes on the host, with explicit `return` / `budget` / `unmapped` / `unsupported` stop reasons — `analysis/emulate.py` (Unicorn), `codevanta emulate`<br>✅ Emulation test suite — `tests/test_emulate.py` | ⬜ **Typed / SSA IR lifting** — `ir/base.py` and `ir/adapters/` are a contract plus an empty registry ("Concrete adapters arrive in phase 4")<br>⚠️ **Symbolic execution** — bounded path exploration over Unicorn exists (`analysis/symbolic.py`, seeded branches recorded as assumptions); no solver-based symbolic execution (`Simulator`/`SimulationManager`/Z3) in `src/` |
|
|
623
|
+
| **5 · Platform** | ✅ CI/CD with real gates — `ci.yml` gates the test matrix, `type-check` (mypy), the wheel smoke test, `decompile-parity` and `fuzz smoke`, with best-effort `ghidra-parity`, an informational `benchmark`, and non-blocking windows/macOS platform runs (see the workflow for the current job list) and `pyproject.toml` sets `fail_under = 85` coverage<br>✅ Release pipeline — `release.yml`: `build` → `publish-pypi` (trusted publishing) → `github-release`; used for the v0.1.0 release<br>✅ Dynamic provider probing, script generation and trace replay reachable from the CLI — `analysis/dynamic.py`, `analysis/trace.py` (`parse_gdb_trace`, `parse_frida_trace`), `codevanta attach`, `codevanta trace` | ✅ **Plugin SDK** — `plugins/` (entry-point discovery, bounded `run_plugin`, built-in registry, `MetricsAnalyzer`)<br>⬜ **Full AI layer** and **multi-user** — no auth, user or tenant model exists in `src/`<br>✅ **Evidence bundle** — `analysis/evidence_bundle.py` (manifest, per-entry tamper detection) and `scripts/report_bundle.py` (report + trace → verifiable bundle)<br>✅ **Fuzz and benchmark** — `scripts/fuzz_parsers.py` (`fuzz-smoke` job) and `scripts/bench_gate.py` (`benchmark` job, informational)<br>✅ **Windows / macOS CI** — `test-platform` matrix py3.13 on windows-latest and macos-latest (non-blocking platform signal)<br>✅ **PyPI release** — v0.1.0 published through trusted publishing: a `v*` tag drives `release.yml` |
|
|
601
624
|
|
|
602
625
|
## Product principles
|
|
603
626
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -37,14 +37,15 @@ uv tool install git+https://github.com/kevindoni/CODEVANTA.git # isolated
|
|
|
37
37
|
# from a local clone: python -m pip install -e ".[dev]"
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
## From PyPI
|
|
40
|
+
## From PyPI
|
|
41
41
|
|
|
42
42
|
```powershell
|
|
43
|
-
|
|
43
|
+
python -m pip install codevanta # or: uv tool install codevanta / pipx install codevanta
|
|
44
44
|
codevanta setup --dry-run --client claude
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
The GitHub one-liners above install from `main`; use them when you want the
|
|
48
|
+
latest unreleased changes instead of the published version.
|
|
48
49
|
|
|
49
50
|
## Connect a coding agent
|
|
50
51
|
|
|
@@ -11,7 +11,7 @@ Applied through the GitHub API (`PUT /repos/kevindoni/CODEVANTA/branches/main/pr
|
|
|
11
11
|
|------|-------|
|
|
12
12
|
| Require a pull request before merging | yes (0 approvals, so a maintainer can self-merge) |
|
|
13
13
|
| Dismiss stale approvals on new commits | yes |
|
|
14
|
-
| Require status checks | `test (py3.11)`, `test (py3.13)`, `build and smoke-test wheel` |
|
|
14
|
+
| Require status checks | `test (py3.11)`, `test (py3.13)`, `test (py3.14)`, `type-check (mypy)`, `build and smoke-test wheel`, `decompile-parity`, `fuzz smoke (parser hardening)` — the full CI run is listed in §6 |
|
|
15
15
|
| Require branches to be up to date | yes (strict) |
|
|
16
16
|
| Require linear history | yes (squash or rebase merges only) |
|
|
17
17
|
| Block force pushes | yes |
|
|
@@ -74,7 +74,7 @@ both files to the GitHub release. Update `CHANGELOG.md` before tagging.
|
|
|
74
74
|
|
|
75
75
|
| Workflow | Trigger | Jobs |
|
|
76
76
|
|----------|---------|------|
|
|
77
|
-
| `ci.yml` | push to `main`, pull requests, manual | lint + tests on 3.11/3.13, wheel build and clean-venv smoke test |
|
|
77
|
+
| `ci.yml` | push to `main`, pull requests, manual | lint + tests on 3.11/3.13/3.14, mypy type-check, wheel build and clean-venv smoke test, `decompile-parity` (angr), `ghidra-parity` (best effort), `fuzz smoke`, `benchmark` (informational), py3.13 windows/macos platform runs (non-blocking) |
|
|
78
78
|
| `release.yml` | tag `v*` | build, PyPI trusted publish, GitHub release assets |
|
|
79
79
|
|
|
80
80
|
Python 3.11, 3.13, and 3.14 are in the CI matrix. Older interpreters are
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "codevanta"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.1"
|
|
8
8
|
description = "CODEVANTA — Advanced Code Intelligence: AI-Powered Reverse Engineering & Binary Analysis Platform"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|