write-func-as-yaml

Write function analysis results as YAML file beside the binary using IDA Pro MCP. Use this skill after completing function identification and signature generation to persist the results in a standardi

SKILL.md

GitHub

Write Function IDA Analysis Output as YAML

Persist function analysis results to a YAML file beside the binary using IDA Pro MCP.

Prerequisites

Before using this skill, you should have:

  1. Identified and renamed the target function
  2. Generated a unique signature using /generate-signature-for-function
  3. An IDA Pro MCP session, resolved per mcp-ida-session.md: idb_list → idb_open (script fallback only if the endpoint is unreachable). Honor its IDB save discipline — an idle-TTL self-exit does not save.

Required Parameters

Parameter Description Example
func_name Name of the function CBaseModelEntity_SetModel
func_addr Virtual address of the function 0x180A8CA10
func_sig Unique byte signature 41 B8 80 00 00 00 48 8D 99 10 05 00 00

Method

An optional artifact_name selects the stable filename stem independently of func_name. Honor the corresponding preprocessor's OUTPUT_NAME_MAP when present: use its key for artifact_name and value for the semantic func_name.

mcp__ida-pro-mcp__py_eval code="""
import idaapi
import os
import yaml

# === REQUIRED: Replace these values ===
func_name = "<func_name>"           # e.g., "CBaseModelEntity_SetModel"
artifact_name = func_name           # Override with the caller's expected artifact stem if different.
func_addr = <func_addr>             # e.g., 0x180A8CA10
func_sig = "<func_sig>"             # e.g., "41 B8 80 00 00 00"
# ======================================

# Get function size
func = idaapi.get_func(func_addr)
func_size = func.size() if func else 0

# Get binary path and determine platform
input_file = idaapi.get_input_file_path()
dir_path = os.environ.get('CS2VIBE_ARTIFACT_DIR') or os.path.dirname(input_file)

if input_file.endswith('.dll'):
    platform = 'windows'
    image_base = idaapi.get_imagebase()
else:
    platform = 'linux'
    image_base = 0x0

func_rva = func_addr - image_base

data = {
    'func_name': func_name,
    'func_va': hex(func_addr),
    'func_rva': hex(func_rva),
    'func_size': hex(func_size),
    'func_sig': func_sig,
}

yaml_path = os.path.join(dir_path, f"{artifact_name}.{platform}.yaml")
with open(yaml_path, 'w', encoding='utf-8') as f:
    yaml.dump(data, f, default_flow_style=False, sort_keys=False)
print(f"Written to: {yaml_path}")
"""

Output File Naming Convention

The output YAML filename follows this pattern:

  • <artifact_name>.<platform>.yaml (defaults to func_name)

Examples:

  • server.dll → CBaseModelEntity_SetModel.windows.yaml

  • libserver.so / libserver.so → CBaseModelEntity_SetModel.linux.yaml

  • engine2.dll → CServerSideClient_IsHearingClient.windows.yaml

  • libengine2.so → CServerSideClient_IsHearingClient.linux.yaml

Output YAML Format

func_name: CBaseModelEntity_SetModel
func_va: 0x180A8CA10   # Virtual address - changes with game updates
func_rva: 0xA8CA10     # Relative virtual address (VA - image base) - changes with game updates
func_size: 0x3F        # Function size in bytes - changes with game updates
func_sig: 41 B8 80 00 00 00 48 8D 99 10 05 00 00  # Unique byte signature

Platform Detection

The skill automatically detects the platform based on file extension:

  • .dll → Windows (uses idaapi.get_imagebase() for image base)
  • .so → Linux (uses 0x0 as image base)

Trusted finalization

This writer produces a semantic YAML payload at the caller-provided expected artifact path. It does not own final field ordering, scalar spelling, encoding, or line endings. After runtime validation, the trusted analyzer rewrites every successful preprocessor or Agent output through the Source2 central canonicalizer; that canonical rewrite is the only byte-level trust boundary.

Notes

  • All values marked "changes with game updates" should be regenerated when analyzing new binary versions
  • The YAML file is written to the same directory as the input binary
  • func_size is automatically calculated from IDA's function analysis
  • func_rva is automatically calculated as func_va - image_base
  • For virtual functions with vtable information, use /write-vfunc-as-yaml instead