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
Files1
View on GitHubSKILL.md.claude/skills/write-func-as-yaml/SKILL.md
GitHubWrite 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:
- Identified and renamed the target function
- Generated a unique signature using
/generate-signature-for-function - 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 tofunc_name)
Examples:
server.dll→CBaseModelEntity_SetModel.windows.yamllibserver.so/libserver.so→CBaseModelEntity_SetModel.linux.yamlengine2.dll→CServerSideClient_IsHearingClient.windows.yamllibengine2.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 (usesidaapi.get_imagebase()for image base).so→ Linux (uses0x0as 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-yamlinstead