Keep ordinary Ghidra facts in normalized Evidence without repeating complete raw replies. Preserve distinct overview, attestation, file-offset and pre-overlay observations through shared CLI/MCP execution. Record real application measurements, equivalent selected facts, response admission and explicit latency/coverage limits. Fixes #5337. Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>
827 lines
26 KiB
JavaScript
827 lines
26 KiB
JavaScript
import {
|
|
parseGhidraFunctionInput,
|
|
parseGhidraFunctionResult,
|
|
} from "../dist/ghidra/GhidraFunctionValues.js";
|
|
import {
|
|
parseGhidraInventoryInput,
|
|
parseGhidraInventoryResult,
|
|
} from "../dist/ghidra/GhidraInventoryValues.js";
|
|
import { verifyNativeValueE2e } from "./lib/native-value-e2e.mjs";
|
|
|
|
import {
|
|
assertDenseSwitchDossier,
|
|
|
|
async function functionObservationCall(client, operation, parameters) {
|
|
const input = parseGhidraFunctionInput(operation, parameters);
|
|
if (!input.ok) throw input.error;
|
|
const called = await client.callTool(operation, input.value);
|
|
if (!called.ok)
|
|
throw new Error(
|
|
`Ghidra ${operation} failed for ${JSON.stringify(input.value)}: ${called.error.message}`,
|
|
{ cause: called.error },
|
|
);
|
|
const parsed = parseGhidraFunctionResult(operation, called.value);
|
|
if (!parsed.ok) throw parsed.error;
|
|
return parsed.value;
|
|
}
|
|
|
|
async function inventoryCall(client, operation, parameters) {
|
|
const input = parseGhidraInventoryInput(operation, parameters);
|
|
if (!input.ok) throw input.error;
|
|
const called = await client.callTool(operation, input.value);
|
|
if (!called.ok)
|
|
throw new Error(
|
|
`Ghidra ${operation} failed for ${JSON.stringify(input.value)}: ${called.error.message}`,
|
|
{ cause: called.error },
|
|
);
|
|
const parsed = parseGhidraInventoryResult(operation, called.value);
|
|
if (!parsed.ok) throw parsed.error;
|
|
return parsed.value.value;
|
|
}
|
|
|
|
export async function verifyDebugFunctionOperations(
|
|
client,
|
|
{ procedures, strings, entry },
|
|
) {
|
|
const leaf = requireProcedure(procedures, "rea_ghidra_inventory_leaf");
|
|
const branch = requireProcedure(procedures, "rea_ghidra_inventory_branch");
|
|
const indirect = requireProcedure(
|
|
procedures,
|
|
"rea_ghidra_inventory_indirect",
|
|
);
|
|
const switchProcedure = requireProcedure(
|
|
procedures,
|
|
"rea_ghidra_inventory_switch",
|
|
);
|
|
const denseSwitchProcedure = requireProcedure(
|
|
procedures,
|
|
"rea_ghidra_inventory_dense_switch",
|
|