Install
$ agentstack add skill-hlnd2t-cs2-vibesignatures-write-patch-as-yaml ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ● Filesystem access Used
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Write Patch as YAML
Persist a single patch analysis result to a YAML file beside the binary using IDA Pro MCP.
Prerequisites
Before using this skill, you should have:
- Identified the patch name and determined
patch_bytes - Generated a unique signature using
/generate-signature-for-patch
Required Parameters
| Parameter | Description | Example | |-----------|-------------|---------| | patch_name | Descriptive name of the patch | ServerMovementUnlock | | patch_sig | Unique byte signature locating the instruction to patch | 0F 86 AF 00 00 00 0F 57 C0 0F 2E C2 | | patch_bytes | Replacement bytes to write at the patch location | E9 B0 00 00 00 90 |
Optional Parameters
| Parameter | Description | Example | |-----------|-------------|---------| | patch_sig_disp | Byte displacement from signature start to the target instruction. 0 or None means signature starts at the target instruction. Non-zero means backward expansion was used by /generate-signature-for-patch. (use None to omit) | 5 |
Method
mcp__ida-pro-mcp__py_eval code="""
import idaapi
import os
import yaml
# === REQUIRED: Replace these values ===
patch_name = "" # e.g., "ServerMovementUnlock"
patch_sig = "" # e.g., "0F 86 AF 00 00 00 0F 57 C0 0F 2E C2"
patch_bytes = "" # e.g., "E9 B0 00 00 00 90"
# ======================================
# === OPTIONAL: Set to None to omit from output ===
patch_sig_disp = # e.g., 5 or None (0 also omitted)
# =================================================
# Get binary path and determine platform
input_file = idaapi.get_input_file_path()
dir_path = os.path.dirname(input_file)
if input_file.endswith('.dll'):
platform = 'windows'
else:
platform = 'linux'
# Build data dictionary conditionally
data = {}
data['patch_name'] = patch_name
data['patch_sig'] = patch_sig
if patch_sig_disp is not None and patch_sig_disp > 0:
data['patch_sig_disp'] = patch_sig_disp
data['patch_bytes'] = patch_bytes
yaml_path = os.path.join(dir_path, f"{patch_name}.{platform}.yaml")
with open(yaml_path, 'w', encoding='utf-8') as f:
yaml.dump(data, f, default_flow_style=False, sort_keys=False, allow_unicode=True)
print(f"Written to: {yaml_path}")
"""
Output File Naming Convention
The output YAML filename follows this pattern:
..yaml
Examples:
server.dll→ServerMovementUnlock.windows.yamllibserver.so/libserver.so→ServerMovementUnlock.linux.yaml
Output YAML Format
Full output (with patch_sig_disp provided):
patch_name: ServerMovementUnlock
patch_sig: 48 85 C0 74 ?? E8 ?? ?? ?? ?? 0F 86 AF 00 00 00
patch_sig_disp: 5
patch_bytes: E9 B0 00 00 00 90
Standard output (without backward expansion, patch_sig_disp is 0 or omitted):
patch_name: ServerMovementUnlock
patch_sig: 0F 86 AF 00 00 00 0F 57 C0 0F 2E C2
patch_bytes: E9 B0 00 00 00 90
Each field:
patch_name- Descriptive name of the patchpatch_sig- Unique byte signature locating the instruction to patchpatch_sig_disp(optional) - Byte displacement from signature start to the target instruction. Only present when non-zero (backward expansion was used). Runtime: scan forpatch_sig, then addpatch_sig_dispto get the target instruction address.patch_bytes- Replacement bytes to write at the patch location
Platform Detection
The skill automatically detects the platform based on file extension:
.dll→ Windows.so→ Linux
Example Usage
Standard patch (forward-only signature)
patch_name = "ServerMovementUnlock"
patch_sig = "0F 86 AF 00 00 00 0F 57 C0 0F 2E C2"
patch_bytes = "E9 B0 00 00 00 90"
patch_sig_disp = None
Patch with backward-expanded signature
patch_name = "DisableSteamBanCheck"
patch_sig = "48 85 C0 74 ?? E8 ?? ?? ?? ?? 0F 84 AA 00 00 00"
patch_bytes = "90 90 90 90 90 90"
patch_sig_disp = 5
NOP a call instruction
patch_name = "SkipPrecacheCall"
patch_sig = "E8 AA BB CC DD 48 8B 5C 24 30"
patch_bytes = "90 90 90 90 90"
patch_sig_disp = None
Notes
- The YAML file is written to the same directory as the input binary
- When
patch_sig_dispisNoneor0, thepatch_sig_dispfield is omitted from the output entirely (signature starts at the target instruction) patch_sigshould be a signature generated by/generate-signature-for-patchpatch_bytesmust have the same byte count as the original instruction being patchedpatch_sig_dispis the byte displacement from signature start to the target instruction, only needed when backward expansion was used
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: HLND2T
- Source: HLND2T/CS2_VibeSignatures
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.