windows-exe-decompiler-mcp-server 0.1.0 → 0.1.1
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.
- package/README.md +5 -0
- package/dist/analysis-task-runner.js +66 -0
- package/dist/index.js +6 -4
- package/dist/server.js +1 -1
- package/dist/tools/artifact-read.d.ts +2 -2
- package/dist/tools/artifacts-list.d.ts +8 -8
- package/dist/tools/binary-role-profile.d.ts +817 -0
- package/dist/tools/binary-role-profile.js +426 -0
- package/dist/tools/code-function-explain-review.d.ts +42 -42
- package/dist/tools/code-function-rename-review.d.ts +48 -48
- package/dist/tools/code-functions-reconstruct.d.ts +44 -44
- package/dist/tools/code-reconstruct-export.d.ts +6 -6
- package/dist/tools/code-reconstruct-plan.d.ts +6 -6
- package/dist/tools/dotnet-metadata-extract.d.ts +107 -107
- package/dist/tools/dotnet-reconstruct-export.d.ts +28 -28
- package/dist/tools/dotnet-types-list.d.ts +52 -52
- package/dist/tools/packer-detect.d.ts +4 -4
- package/dist/tools/report-generate.d.ts +9 -1
- package/dist/tools/report-generate.js +38 -4
- package/dist/tools/report-summarize.d.ts +498 -0
- package/dist/tools/report-summarize.js +84 -10
- package/dist/tools/sandbox-execute.d.ts +2 -2
- package/dist/tools/tool-help.d.ts +16 -16
- package/dist/tools/tool-help.js +12 -0
- package/dist/workflows/function-explanation-review.d.ts +94 -63
- package/dist/workflows/function-explanation-review.js +92 -42
- package/dist/workflows/reconstruct.d.ts +55 -19
- package/dist/workflows/reconstruct.js +58 -20
- package/dist/workflows/semantic-name-review.d.ts +98 -67
- package/dist/workflows/semantic-name-review.js +108 -58
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -37,6 +37,7 @@ Primary use cases:
|
|
|
37
37
|
- `yara.scan`
|
|
38
38
|
- `runtime.detect`
|
|
39
39
|
- `packer.detect`
|
|
40
|
+
- `binary.role.profile`
|
|
40
41
|
|
|
41
42
|
### Ghidra and code analysis
|
|
42
43
|
|
|
@@ -90,6 +91,7 @@ tests/ unit and integration tests
|
|
|
90
91
|
workers/ Python worker, YARA rules, dynamic helpers
|
|
91
92
|
install-to-codex.ps1 local Codex MCP install helper
|
|
92
93
|
install-to-copilot.ps1 local GitHub Copilot MCP install helper
|
|
94
|
+
docs/QUALITY_EVALUATION.md evaluation checklist for regression and release readiness
|
|
93
95
|
```
|
|
94
96
|
|
|
95
97
|
## Prerequisites
|
|
@@ -267,6 +269,9 @@ That tag push will trigger the publish workflow.
|
|
|
267
269
|
See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for local
|
|
268
270
|
setup, validation, and release steps.
|
|
269
271
|
|
|
272
|
+
For release-quality regression planning, see [`docs/QUALITY_EVALUATION.md`](./docs/QUALITY_EVALUATION.md)
|
|
273
|
+
and [`examples/benchmark-corpus.example.json`](./examples/benchmark-corpus.example.json).
|
|
274
|
+
|
|
270
275
|
## Security
|
|
271
276
|
|
|
272
277
|
See [`SECURITY.md`](./SECURITY.md) for disclosure guidance
|
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
import { DecompilerWorker, GhidraProcessError } from './decompiler-worker.js';
|
|
6
6
|
import { logger } from './logger.js';
|
|
7
7
|
import { deepStaticWorkflow } from './workflows/deep-static.js';
|
|
8
|
+
import { createReconstructWorkflowHandler } from './workflows/reconstruct.js';
|
|
9
|
+
import { createSemanticNameReviewWorkflowHandler } from './workflows/semantic-name-review.js';
|
|
10
|
+
import { createFunctionExplanationReviewWorkflowHandler } from './workflows/function-explanation-review.js';
|
|
8
11
|
export class AnalysisTaskRunner {
|
|
9
12
|
jobQueue;
|
|
10
13
|
decompilerWorker;
|
|
@@ -154,6 +157,69 @@ export class AnalysisTaskRunner {
|
|
|
154
157
|
},
|
|
155
158
|
};
|
|
156
159
|
}
|
|
160
|
+
if (job.tool === 'workflow.reconstruct') {
|
|
161
|
+
if (!this.cacheManager) {
|
|
162
|
+
throw new Error('workflow.reconstruct requires cache manager for queued execution');
|
|
163
|
+
}
|
|
164
|
+
this.jobQueue.updateProgress(job.id, 5);
|
|
165
|
+
const handler = createReconstructWorkflowHandler(this.workspaceManager, this.database, this.cacheManager);
|
|
166
|
+
const result = await handler(job.args || {});
|
|
167
|
+
this.jobQueue.updateProgress(job.id, 100);
|
|
168
|
+
return {
|
|
169
|
+
jobId: job.id,
|
|
170
|
+
ok: result.ok,
|
|
171
|
+
data: result.data,
|
|
172
|
+
errors: result.errors || [],
|
|
173
|
+
warnings: result.warnings || [],
|
|
174
|
+
artifacts: result.artifacts || [],
|
|
175
|
+
metrics: {
|
|
176
|
+
elapsedMs: typeof result.metrics?.elapsed_ms === 'number' ? result.metrics.elapsed_ms : 0,
|
|
177
|
+
peakRssMb: 0,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (job.tool === 'workflow.semantic_name_review') {
|
|
182
|
+
if (!this.cacheManager) {
|
|
183
|
+
throw new Error('workflow.semantic_name_review requires cache manager for queued execution');
|
|
184
|
+
}
|
|
185
|
+
this.jobQueue.updateProgress(job.id, 5);
|
|
186
|
+
const handler = createSemanticNameReviewWorkflowHandler(this.workspaceManager, this.database, this.cacheManager);
|
|
187
|
+
const result = await handler(job.args || {});
|
|
188
|
+
this.jobQueue.updateProgress(job.id, 100);
|
|
189
|
+
return {
|
|
190
|
+
jobId: job.id,
|
|
191
|
+
ok: result.ok,
|
|
192
|
+
data: result.data,
|
|
193
|
+
errors: result.errors || [],
|
|
194
|
+
warnings: result.warnings || [],
|
|
195
|
+
artifacts: result.artifacts || [],
|
|
196
|
+
metrics: {
|
|
197
|
+
elapsedMs: typeof result.metrics?.elapsed_ms === 'number' ? result.metrics.elapsed_ms : 0,
|
|
198
|
+
peakRssMb: 0,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
if (job.tool === 'workflow.function_explanation_review') {
|
|
203
|
+
if (!this.cacheManager) {
|
|
204
|
+
throw new Error('workflow.function_explanation_review requires cache manager for queued execution');
|
|
205
|
+
}
|
|
206
|
+
this.jobQueue.updateProgress(job.id, 5);
|
|
207
|
+
const handler = createFunctionExplanationReviewWorkflowHandler(this.workspaceManager, this.database, this.cacheManager);
|
|
208
|
+
const result = await handler(job.args || {});
|
|
209
|
+
this.jobQueue.updateProgress(job.id, 100);
|
|
210
|
+
return {
|
|
211
|
+
jobId: job.id,
|
|
212
|
+
ok: result.ok,
|
|
213
|
+
data: result.data,
|
|
214
|
+
errors: result.errors || [],
|
|
215
|
+
warnings: result.warnings || [],
|
|
216
|
+
artifacts: result.artifacts || [],
|
|
217
|
+
metrics: {
|
|
218
|
+
elapsedMs: typeof result.metrics?.elapsed_ms === 'number' ? result.metrics.elapsed_ms : 0,
|
|
219
|
+
peakRssMb: 0,
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
157
223
|
throw new Error(`Unsupported queued tool: ${job.tool}`);
|
|
158
224
|
}
|
|
159
225
|
}
|
package/dist/index.js
CHANGED
|
@@ -25,6 +25,7 @@ import { runtimeDetectToolDefinition, createRuntimeDetectHandler } from './tools
|
|
|
25
25
|
import { dotNetMetadataExtractToolDefinition, createDotNetMetadataExtractHandler } from './tools/dotnet-metadata-extract.js';
|
|
26
26
|
import { dotNetTypesListToolDefinition, createDotNetTypesListHandler } from './tools/dotnet-types-list.js';
|
|
27
27
|
import { packerDetectToolDefinition, createPackerDetectHandler } from './tools/packer-detect.js';
|
|
28
|
+
import { binaryRoleProfileToolDefinition, createBinaryRoleProfileHandler, } from './tools/binary-role-profile.js';
|
|
28
29
|
import { triageWorkflowToolDefinition, createTriageWorkflowHandler } from './workflows/triage.js';
|
|
29
30
|
import { reconstructWorkflowToolDefinition, createReconstructWorkflowHandler } from './workflows/reconstruct.js';
|
|
30
31
|
import { deepStaticWorkflowToolDefinition, createDeepStaticWorkflowHandler } from './workflows/deep-static.js';
|
|
@@ -113,18 +114,19 @@ async function main() {
|
|
|
113
114
|
server.registerTool(dotNetTypesListToolDefinition, createDotNetTypesListHandler(workspaceManager, database, cacheManager));
|
|
114
115
|
// Task 8.10: packer.detect tool
|
|
115
116
|
server.registerTool(packerDetectToolDefinition, createPackerDetectHandler(workspaceManager, database, cacheManager));
|
|
117
|
+
server.registerTool(binaryRoleProfileToolDefinition, createBinaryRoleProfileHandler(workspaceManager, database, cacheManager));
|
|
116
118
|
// Task 9.1: workflow.triage - Quick triage workflow
|
|
117
119
|
server.registerTool(triageWorkflowToolDefinition, createTriageWorkflowHandler(workspaceManager, database, cacheManager));
|
|
118
120
|
// Task 40.5.1: workflow.reconstruct - End-to-end source reconstruction workflow
|
|
119
|
-
server.registerTool(reconstructWorkflowToolDefinition, createReconstructWorkflowHandler(workspaceManager, database, cacheManager));
|
|
121
|
+
server.registerTool(reconstructWorkflowToolDefinition, createReconstructWorkflowHandler(workspaceManager, database, cacheManager, undefined, jobQueue));
|
|
120
122
|
// Task 16.x: workflow.deep_static - Comprehensive long-running static analysis
|
|
121
123
|
server.registerTool(deepStaticWorkflowToolDefinition, createDeepStaticWorkflowHandler(workspaceManager, database, cacheManager, jobQueue));
|
|
122
|
-
server.registerTool(semanticNameReviewWorkflowToolDefinition, createSemanticNameReviewWorkflowHandler(workspaceManager, database, cacheManager, server));
|
|
123
|
-
server.registerTool(functionExplanationReviewWorkflowToolDefinition, createFunctionExplanationReviewWorkflowHandler(workspaceManager, database, cacheManager, server));
|
|
124
|
+
server.registerTool(semanticNameReviewWorkflowToolDefinition, createSemanticNameReviewWorkflowHandler(workspaceManager, database, cacheManager, server, undefined, jobQueue));
|
|
125
|
+
server.registerTool(functionExplanationReviewWorkflowToolDefinition, createFunctionExplanationReviewWorkflowHandler(workspaceManager, database, cacheManager, server, undefined, jobQueue));
|
|
124
126
|
// Task 9.2: report.summarize - Generate quick triage report
|
|
125
127
|
server.registerTool(reportSummarizeToolDefinition, createReportSummarizeHandler(workspaceManager, database, cacheManager));
|
|
126
128
|
// Task 24.x: report.generate - Generate stored multi-stage analysis report artifact
|
|
127
|
-
server.registerTool(reportGenerateToolDefinition, createReportGenerateHandler(workspaceManager, database));
|
|
129
|
+
server.registerTool(reportGenerateToolDefinition, createReportGenerateHandler(workspaceManager, database, cacheManager));
|
|
128
130
|
// Task 15.1: ghidra.analyze - Analyze binary with Ghidra
|
|
129
131
|
server.registerTool(ghidraAnalyzeToolDefinition, createGhidraAnalyzeHandler(workspaceManager, database, jobQueue));
|
|
130
132
|
// Task execution controls: query/cancel/sweep analysis jobs
|
package/dist/server.js
CHANGED
|
@@ -24,11 +24,11 @@ export declare const ArtifactReadInputSchema: z.ZodObject<{
|
|
|
24
24
|
sample_id: string;
|
|
25
25
|
recursive: boolean;
|
|
26
26
|
encoding: "utf8" | "base64" | "auto";
|
|
27
|
+
max_bytes: number;
|
|
27
28
|
include_untracked_files: boolean;
|
|
28
29
|
scan_roots: string[];
|
|
29
30
|
select_latest: boolean;
|
|
30
31
|
include_content: boolean;
|
|
31
|
-
max_bytes: number;
|
|
32
32
|
parse_json: boolean;
|
|
33
33
|
ioc_highlights: boolean;
|
|
34
34
|
path?: string | undefined;
|
|
@@ -39,13 +39,13 @@ export declare const ArtifactReadInputSchema: z.ZodObject<{
|
|
|
39
39
|
path?: string | undefined;
|
|
40
40
|
recursive?: boolean | undefined;
|
|
41
41
|
encoding?: "utf8" | "base64" | "auto" | undefined;
|
|
42
|
+
max_bytes?: number | undefined;
|
|
42
43
|
artifact_id?: string | undefined;
|
|
43
44
|
artifact_type?: string | undefined;
|
|
44
45
|
include_untracked_files?: boolean | undefined;
|
|
45
46
|
scan_roots?: string[] | undefined;
|
|
46
47
|
select_latest?: boolean | undefined;
|
|
47
48
|
include_content?: boolean | undefined;
|
|
48
|
-
max_bytes?: number | undefined;
|
|
49
49
|
parse_json?: boolean | undefined;
|
|
50
50
|
ioc_highlights?: boolean | undefined;
|
|
51
51
|
}>;
|
|
@@ -169,16 +169,16 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
|
|
|
169
169
|
}, "strip", z.ZodTypeAny, {
|
|
170
170
|
count: number;
|
|
171
171
|
latest_created_at: string;
|
|
172
|
+
types: string[];
|
|
172
173
|
untracked_count: number;
|
|
173
174
|
tracked_count: number;
|
|
174
|
-
types: string[];
|
|
175
175
|
retention_buckets: string[];
|
|
176
176
|
}, {
|
|
177
177
|
count: number;
|
|
178
178
|
latest_created_at: string;
|
|
179
|
+
types: string[];
|
|
179
180
|
untracked_count: number;
|
|
180
181
|
tracked_count: number;
|
|
181
|
-
types: string[];
|
|
182
182
|
retention_buckets: string[];
|
|
183
183
|
}>>;
|
|
184
184
|
by_retention_bucket: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
@@ -205,9 +205,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
|
|
|
205
205
|
session_index: Record<string, {
|
|
206
206
|
count: number;
|
|
207
207
|
latest_created_at: string;
|
|
208
|
+
types: string[];
|
|
208
209
|
untracked_count: number;
|
|
209
210
|
tracked_count: number;
|
|
210
|
-
types: string[];
|
|
211
211
|
retention_buckets: string[];
|
|
212
212
|
}>;
|
|
213
213
|
by_retention_bucket: Record<string, number>;
|
|
@@ -234,9 +234,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
|
|
|
234
234
|
session_index: Record<string, {
|
|
235
235
|
count: number;
|
|
236
236
|
latest_created_at: string;
|
|
237
|
+
types: string[];
|
|
237
238
|
untracked_count: number;
|
|
238
239
|
tracked_count: number;
|
|
239
|
-
types: string[];
|
|
240
240
|
retention_buckets: string[];
|
|
241
241
|
}>;
|
|
242
242
|
by_retention_bucket: Record<string, number>;
|
|
@@ -266,9 +266,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
|
|
|
266
266
|
session_index: Record<string, {
|
|
267
267
|
count: number;
|
|
268
268
|
latest_created_at: string;
|
|
269
|
+
types: string[];
|
|
269
270
|
untracked_count: number;
|
|
270
271
|
tracked_count: number;
|
|
271
|
-
types: string[];
|
|
272
272
|
retention_buckets: string[];
|
|
273
273
|
}>;
|
|
274
274
|
by_retention_bucket: Record<string, number>;
|
|
@@ -325,9 +325,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
|
|
|
325
325
|
session_index: Record<string, {
|
|
326
326
|
count: number;
|
|
327
327
|
latest_created_at: string;
|
|
328
|
+
types: string[];
|
|
328
329
|
untracked_count: number;
|
|
329
330
|
tracked_count: number;
|
|
330
|
-
types: string[];
|
|
331
331
|
retention_buckets: string[];
|
|
332
332
|
}>;
|
|
333
333
|
by_retention_bucket: Record<string, number>;
|
|
@@ -403,9 +403,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
|
|
|
403
403
|
session_index: Record<string, {
|
|
404
404
|
count: number;
|
|
405
405
|
latest_created_at: string;
|
|
406
|
+
types: string[];
|
|
406
407
|
untracked_count: number;
|
|
407
408
|
tracked_count: number;
|
|
408
|
-
types: string[];
|
|
409
409
|
retention_buckets: string[];
|
|
410
410
|
}>;
|
|
411
411
|
by_retention_bucket: Record<string, number>;
|
|
@@ -471,9 +471,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
|
|
|
471
471
|
session_index: Record<string, {
|
|
472
472
|
count: number;
|
|
473
473
|
latest_created_at: string;
|
|
474
|
+
types: string[];
|
|
474
475
|
untracked_count: number;
|
|
475
476
|
tracked_count: number;
|
|
476
|
-
types: string[];
|
|
477
477
|
retention_buckets: string[];
|
|
478
478
|
}>;
|
|
479
479
|
by_retention_bucket: Record<string, number>;
|