agentsclimarketplace

Headless ghidra analyze function

Skill ByteLandTechnology/headless-ghidra/headless-ghidra-analyze-function

Headless Ghidra reverse-engineering skill family for reproducible, evidence-backed workflows and audit-ready Markdown outputs.

Install
npx -y skills add ByteLandTechnology/headless-ghidra --skill headless-ghidra-analyze-function

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Thoroughly analyze a single function by first recovering its type definitions, constant definitions, vtables, function name and signature, then producing the final decompilation. Use when the user wants a complete per-function analysis following the strict recovery order: types → constants → vtables → function identity → decompilation.

SKILL.md

12.9 KB, ~3.0k tokens by cl100k_base, as published. Nobody here has run it

Headless Ghidra — Single Function Thorough Analysis

This skill provides a dedicated, strict-order analysis workflow for a single function. It works against the existing target artifact tree and may update baseline, metadata, and substitution artifacts while recording provenance for a focused single-function investigation.

Resolve Target Function

Resolve the requested function to a unique addr before Step 1, then derive a stable local fn_id for this analysis.

If the input is an address

Use the address directly and confirm the resolved function identity:

ghidra-agent-cli --target <id> functions show --addr <addr>

Confirm the address is valid and use it as the canonical function locator for the rest of the workflow.

If the input is a symbol or function name

Look up named baseline functions first:

ghidra-agent-cli --target <id> functions list --named-only

Match the requested name and record the unique addr from the matching entry.

Resolution Rules

  • If there are multiple matches, stop and ask the user to clarify which function they want.
  • If there is no match, inspect artifacts/<target-id>/baseline/functions.yaml to confirm whether the name is missing, ambiguous, or spelled differently.
  • Do not guess an address from a partial or approximate name.
  • If the user already provided a fn_id, reuse it.
  • Otherwise derive a safe local fn_id from the normalized address, for example fn_<addr_without_0x> such as fn_00102140.
  • Step 1 may only begin after addr is confirmed and the working fn_id is chosen.

Strict Recovery Order

Every function analysis must follow this five-step sequence:

Step 1 → Type Definitions
Step 2 → Constant Definitions
Step 3 → Vtable Recovery
Step 4 → Function Name & Signature
Step 5 → Decompilation Analysis

No step may be skipped or reordered. Decompilation analysis in Step 5 is only valid after Steps 1–4 are complete, because types, constants, vtables, and correct function identity are prerequisites for accurate decompilation interpretation.


Step 1 — Recover Type Definitions

Before anything else, enumerate and recover all data types (structs, unions, enums, typedefs, pointers, arrays) that the function uses.

Required ghidra-agent-cli Commands

# List all types from baseline
ghidra-agent-cli --target <id> types list

# Export fresh baseline types if needed
ghidra-agent-cli --target <id> ghidra export-baseline

# Show resolved function details (check signature/return type)
ghidra-agent-cli --target <id> functions show --addr <addr>

Outputs

  • artifacts/<target-id>/baseline/types.yaml — full type system
  • Function-referenced type subset documented in working analysis

What to Look For

  • Struct definitions referenced by function parameters or local variables
  • Enum values used in switch statements or comparisons
  • Typedef aliases for readability
  • Pointer types to other functions (for callback signatures)

CLI Adaptation

If ghidra-agent-cli types list returns no results, first run ghidra export-baseline to populate the baseline YAML files.


Step 2 — Recover Constant Definitions

After types, recover all constants (magic numbers, bitmasks, flag values, enumerated constants, string constants) that the function references.

Required ghidra-agent-cli Commands

# List all constants from baseline
ghidra-agent-cli --target <id> constants list

# List all strings (format strings, keys, identifiers)
ghidra-agent-cli --target <id> strings list

Outputs

  • artifacts/<target-id>/baseline/constants.yaml — full constant pool
  • artifacts/<target-id>/baseline/strings.yaml — string constants
  • Function-referenced constant subset documented in working analysis

What to Look For

  • Numeric literals that may be #define macro values
  • Bitmask operations and their constituent flags
  • Magic numbers with known semantic meaning (e.g., 0x202 for ELF header)
  • Protocol-specific constants
  • String constants used as keys or identifiers

Step 3 — Recover Vtable Recovery

Identify if the function is a virtual method or interacts with virtual dispatch tables. Recover all vtables the function reads from or writes to.

Required ghidra-agent-cli Commands

# List all vtables from baseline
ghidra-agent-cli --target <id> vtables list

# Analyze vtables in the binary and refresh baseline/vtables.yaml
ghidra-agent-cli --target <id> ghidra analyze-vtables --write-baseline

Outputs

  • artifacts/<target-id>/baseline/vtables.yaml — all virtual tables
  • artifacts/<target-id>/baseline/vtable-analysis-report.yaml — vtable analysis results (if produced)

What to Look For

  • Function is a virtual method (thunk to vtable dispatch)
  • Function reads from or initializes vtable pointers
  • Object construction/destruction sequences involving vtables
  • Multiple dispatch paths through vtables

Step 4 — Recover Function Name & Signature

After types, constants, and vtables are understood, recover the function's canonical name and its complete type signature.

Required ghidra-agent-cli Commands

# Show current resolved function info
ghidra-agent-cli --target <id> functions show --addr <addr>

# Name lookup is handled earlier during target resolution when needed
# ghidra-agent-cli --target <id> functions list --named-only

# Write enriched name and signature together.
# This command updates both metadata/renames.yaml and metadata/signatures.yaml.
ghidra-agent-cli --target <id> metadata enrich-function --addr <addr> --name '<recovered_name>' --prototype '<signature>'

# Apply the metadata YAML back into Ghidra without per-function flags
ghidra-agent-cli --target <id> ghidra apply-renames
ghidra-agent-cli --target <id> ghidra apply-signatures

Inputs

  • Step 1 output: types that inform the parameter and return types
  • Step 3 output: vtable context that may indicate virtual method signature
  • artifacts/<target-id>/metadata/renames.yaml — existing P3 rename enrichment (if available)
  • artifacts/<target-id>/metadata/signatures.yaml — existing P3 signature enrichment (if available)

Metadata Check

Read these files directly if they exist:

  1. artifacts/<target-id>/metadata/renames.yaml
  2. artifacts/<target-id>/metadata/signatures.yaml

Use functions list --named-only only for baseline name lookup during target resolution, not as a metadata inspection command.

Outputs

  • artifacts/<target-id>/metadata/renames.yaml — function name record
  • artifacts/<target-id>/metadata/signatures.yaml — function prototype

What to Look For

  • Demangled symbol name from imports/exports
  • Calling convention indicators from call site analysis
  • Parameter count and types from callee references
  • Return type from return value usage analysis

CLI Adaptation

If you prefer not to use metadata enrich-function, edit these YAML files directly, then run the apply commands without per-function flags:

  1. artifacts/<target-id>/metadata/renames.yaml
  2. artifacts/<target-id>/metadata/signatures.yaml
  3. ghidra-agent-cli --target <id> ghidra apply-renames
  4. ghidra-agent-cli --target <id> ghidra apply-signatures

If ghidra-agent-cli metadata list --addr is needed, instead:

  1. Read artifacts/<target-id>/metadata/renames.yaml directly
  2. Read artifacts/<target-id>/metadata/signatures.yaml directly
  3. Check ghidra-agent-cli functions show --addr <addr> for current Ghidra-assigned name

Step 5 — Decompilation Analysis

Only after Steps 1–4 are complete, perform the final decompilation analysis and present the results with full type and constant context.

Required ghidra-agent-cli Commands

# Decompile the function with full context using the chosen local fn_id
ghidra-agent-cli --target <id> ghidra decompile --fn-id <fn_id> --addr <addr>

# Review the generated decompilation, then save a curated function-level
# replacement C file before recording it.
decompiled_c="artifacts/<target-id>/decompilation/functions/<fn_id>/<fn_id>.c"
replacement_c="$(mktemp)"
cp "$decompiled_c" "$replacement_c"
ghidra-agent-cli --target <id> substitute add --fn-id <fn_id> --addr <addr> --replacement "$(cat "$replacement_c")"

Outputs

  • artifacts/<target-id>/baseline/vtables.yaml — updated earlier if vtable analysis refreshes baseline state
  • artifacts/<target-id>/substitution/functions/<fn_id>/capture.yaml — pre-decompilation snapshot
  • artifacts/<target-id>/substitution/functions/<fn_id>/substitution.yaml — final analysis with provenance
  • artifacts/<target-id>/substitution/next-batch.yaml — substitution queue state updated by substitute add

Analysis Deliverables

  1. Decompiled source with all types resolved (no raw IDs)
  2. Constant substitution — all magic numbers replaced with meaningful names
  3. Vtable annotations — virtual call targets identified
  4. Function prototype — final signature with parameter names
  5. Provenance chain — which Step 1–4 artifact informed each resolution

Artifact Outputs Per Function

This skill records provenance in the existing pipeline artifacts and may update:

artifacts/<target-id>/
├── baseline/
│   └── vtables.yaml
├── metadata/
│   ├── renames.yaml
│   └── signatures.yaml
└── substitution/
    ├── next-batch.yaml
    └── functions/
        └── <fn_id>/
            ├── capture.yaml
            └── substitution.yaml

Optional agent-authored notes may also be written under the chosen local fn_id:

artifacts/<target-id>/analysis/functions/<fn_id>/
├── step1-types.yaml
├── step2-constants.yaml
├── step3-vtables.yaml
├── step4-identity.yaml
├── step5-decompilation.yaml
└── provenance.yaml

These analysis/functions/<fn_id>/step*.yaml files are not generated by ghidra-agent-cli automatically. If the user wants per-step analysis notes, the agent must write and maintain those YAML files explicitly.


Required ghidra-agent-cli Commands Summary

StepPurposeKey Commands
1Type definitionsghidra-agent-cli types list, ghidra export-baseline
2Constant definitionsghidra-agent-cli constants list, ghidra-agent-cli strings list
3Vtable recoveryghidra-agent-cli vtables list, ghidra analyze-vtables --write-baseline
4Function name & sigghidra-agent-cli functions show, metadata enrich-function, ghidra apply-renames/signatures
5Decompilationghidra-agent-cli ghidra decompile, substitute add --replacement ...

Invocation

To analyze a specific function by address:

Use the headless-ghidra-analyze-function skill with:
- Function address: <hex address>
- Target ID: <target-id>

To analyze by symbol name (if exported):

Use the headless-ghidra-analyze-function skill with:
- Symbol name: <mangled or demangled name>
- Target ID: <target-id>

Constraints

  • Must follow the five-step order. Do not skip to Step 5 without Steps 1–4.
  • Resolve addr first, then choose fn_id. Use functions show --addr <addr> for address input, or functions list --named-only for symbol-name lookup. Reuse a user-provided fn_id or derive one from the normalized address.
  • Do not decompile first and work backwards. Decompilation without type/constant/vtable context produces inaccurate analysis.
  • Use ghidra-agent-cli exclusively. All Ghidra operations must go through the CLI.
  • Record provenance. The final analysis must explain what each step discovered and how it informed the next step; write optional analysis/functions/<fn_id>/step*.yaml notes only when per-step files are needed.
  • Existing artifacts may be updated. This skill is allowed to modify baseline/vtables.yaml, metadata/renames.yaml, metadata/signatures.yaml, substitution/functions/<fn_id>/*, and substitution/next-batch.yaml.
  • Read metadata files directly when CLI commands are unavailable. If a CLI command for metadata listing does not exist, read the YAML files directly using the Read tool.

Entry Points

This skill is invoked when the user says:

  • "analyze this function thoroughly"
  • "decompile function at 0x401000 with full context"
  • "what does this function do, including all the types and constants it uses"
  • "give me a complete analysis of [function name]"

What ships with it: 4 files

13.7 KB alongside SKILL.md

agents/

Keep looking

Skills are one crate of 326,984. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.