/vuln-hunter
Hunt for vulnerabilities in a running debuggee by analyzing imports/exports, triaging attack surface, and iteratively testing for bugs with PoC generation.
$ npx -y skills add dariushoule/x64dbg-skills --skill vuln-hunter --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/vuln-hunter
Context preview
The summary Claude sees to decide when to auto-load this skill.
Hunt for vulnerabilities in a running debuggee by analyzing imports/exports, triaging attack surface, and iteratively testing for bugs with PoC generation.
SKILL.md
vuln-hunter.SKILL.mdname: vuln-hunter
description: Hunt for vulnerabilities in a running debuggee by analyzing imports/exports, triaging attack surface, and iteratively testing for bugs with PoC generation.
allowed-tools: mcp__x64dbg__list_sessions, mcp__x64dbg__connect_to_session, mcp__x64dbg__get_debugger_status, mcp__x64dbg__read_memory, mcp__x64dbg__get_register, mcp__x64dbg__get_all_registers, mcp__x64dbg__set_register, mcp__x64dbg__disassemble, mcp__x64dbg__set_breakpoint, mcp__x64dbg__clear_breakpoint, mcp__x64dbg__list_breakpoints, mcp__x64dbg__step_over, mcp__x64dbg__step_into, mcp__x64dbg__go, mcp__x64dbg__pause, mcp__x64dbg__run_to_return, mcp__x64dbg__set_comment, mcp__x64dbg__set_label, mcp__x64dbg__get_symbol, mcp__x64dbg__get_label, mcp__x64dbg__eval_expression, mcp__x64dbg__execute_command, mcp__x64dbg__refresh_gui, mcp__x64dbg__get_memory_map, mcp__x64dbg__trace_over, mcp__x64dbg__trace_into, mcp__x64dbg__write_memory, mcp__x64dbg__allocate_memory, mcp__x64dbg__assemble, mcp__x64dbg__get_latest_event, mcp__x64dbg__wait_for_event, mcp__x64dbg__start_session, mcp__x64dbg__terminate_session, mcp__x64dbg__disconnect, AskUserQuestion, Bash, Read, Write, Skill
vuln-hunter
Hunt for vulnerabilities in a running debuggee. Performs import/export reconnaissance, triages attack surface by I/O context, then iteratively tests for bugs (buffer overflows, integer wraps, logic flaws, etc.) and builds proof-of-concept exploits.
Prerequisites
- The target program must be loaded in x64dbg and paused (at entrypoint or a function of interest)
- Be conservative with the context window — disassemble on demand, read memory on demand, do not dump large regions speculatively
Instructions
1. Connect and verify state
Confirm the debugger is connected and the debuggee is paused:
1. Call `mcp__x64dbg__get_debugger_status` — verify status is `paused` 2. If running, call `mcp__x64dbg__pause` 3. Call `mcp__x64dbg__get_register` for `rip` (64-bit) or `eip` (32-bit) to determine bitness and current location 4. Call `mcp__x64dbg__get_memory_map` to get an overview of loaded modules
Note the main module name and base address for subsequent steps.
IF the debuggee looks packed (e.g., entry point is in a non-standard section, imports look obfuscated, or YARA signatures match known packers), run the `/find-oep` skill first to unpack and find the real entry point.
2. Reconnaissance — imports and exports
The goal is to identify all program entry points that handle external (attacker-controllable) input.
2a. Enumerate imports and exports
Use the LIEF-based enumeration script to parse the PE's imports, exports, and security features:
Bash("python ${SKILL_DIR}/enum_imports.py <target_pe_path> --output imports.json")**Packed binaries**: LIEF parses the on-disk PE, so packed binaries will show only the packer's minimal IAT (e.g. `GetProcAddress`, `LoadLibraryA`). For packed targets: 1. Unpack first (e.g. via `/find-oep`) 2. Take a `/state-snapshot` to dump all memory to disk 3. Re-run the script with `--snapshot-dir <snapshot_dir> --base <module_base>` to parse the resolved IAT from the memory dump instead
Read the output and the generated JSON. Categorize each import by I/O context:
| Category | Example APIs | |---|---| | **Network** | `recv`, `recvfrom`, `WSARecv`, `InternetReadFile`, `HttpQueryInfo`, `WinHttpReadData`, `getaddrinfo` | | **File** | `ReadFile`, `CreateFileA/W`, `fread`, `fgets`, `MapViewOfFile`, `NtReadFile`, `mmioOpen`, `mmioRead` | | **Registry** | `RegQueryValueExA/W`, `RegGetValueA/W`, `RegEnumValueA/W` | | **Environment** | `GetEnvironmentVariableA/W`, `getenv` | | **Command line** | `GetCommandLineA/W`, `CommandLineToArgvW` | | **Clipboard / UI** | `GetClipboardData`, `GetWindowTextA/W`, `GetDlgItemTextA/W` | | **IPC / Pipes** | `ReadFile` on pipe handles, `PeekNamedPipe`, `TransactNamedPipe` | | **Memory / String** | `memcpy`, `strcpy`, `strcat`, `sprintf`, `wcscat`, `lstrcpyA/W`, `MultiByteToWideChar` — these are sinks, not sources, but are critical for buffer overflow detection | | **Allocation** | `malloc`, `HeapAlloc`, `VirtualAlloc`, `LocalAlloc`, `GlobalAlloc` — track buffer sizes |
Also note dangerous formatting/conversion functions: `sprintf`, `vsprintf`, `swprintf`, `sscanf`, `atoi`, `atol`, `strtol` — these may be involved in format string or integer conversion bugs.
Exports indicate externally callable interfaces (DLL entry points, COM interfaces, etc.) that may accept untrusted input.
2c. Find cross-references to I/O functions
For each interesting import identified above, find where it is called in the main module.
**Preferred approach — IAT byte-pattern search via Python/LIEF**:
The most reliable way to find xrefs is to search the `.text` section for byte patterns that reference IAT entries. This works even when the debugger's `findcalls` command fails or returns incomplete results. Write and run an inline Python script:
import lief, struct
binary = lief.parse("<target_pe_path>")
disk_base = binary.optional_header.imagebase # e.g. 0x400000
runtime_base = <module_base> # e.g. 0x160000
rebase = runtime_base - disk_base
# Get .text section bytes
text = [s for s in binary.sections if s.name == '.text'][0]
text_data = bytes(text.content)
text_va = disk_base + text.virtual_address
# For each import, compute IAT VA using DISK base (not runtime base!)
for imp in binary.imports:
for entry in imp.entries:
disk_iat_va = disk_base + entry.iat_address
# Search for FF 15 <iat_va_le> (call dword ptr [IAT]) — direct callers
pattern_call = b'\xff\x15' + struct.pack('<I', disk_iat_va)
# Search for FF 25 <iat_va_le> (jmp dword ptr [IAT]) — thunk stub
pattern_jmp = b'\xff\x25' + struct.pack('<I', disk_iat_va)
# Find all occurrences in .text
for i in range(len(text_data) - 5):
chunk = text_data[i:i+6]
if chunk == pattern_call:Read more
name: vuln-hunter description: Hunt for vulnerabilities in a running debuggee by analyzing imports/exports, triaging attack surface, and iteratively testing for bugs with PoC generation. allowed-tools: mcp__x64dbg__list_sessions, mcp__x64dbg__connect_to_session, mcp__x64dbg__get_debugger_status, mcp__x64dbg__read_memory, mcp__x64dbg__get_register, mcp__x64dbg__get_all_registers, mcp__x64dbg__set_register, mcp__x64dbg__disassemble, mcp__x64dbg__set_breakpoint, mcp__x64dbg__clear_breakpoint, mcp__x64dbg__list_breakpoints, mcp__x64dbg__step_over, mcp__x64dbg__step_into, mcp__x64dbg__go, mcp__x64dbg__pause, mcp__x64dbg__run_to_return, mcp__x64dbg__set_comment, mcp__x64dbg__set_label, mcp__x64dbg__get_symbol, mcp__x64dbg__get_label, mcp__x64dbg__eval_expression, mcp__x64dbg__execute_command, mcp__x64dbg__refresh_gui, mcp__x64dbg__get_memory_map, mcp__x64dbg__trace_over, mcp__x64dbg__trace_into, mcp__x64dbg__write_memory, mcp__x64dbg__allocate_memory, mcp__x64dbg__assemble, mcp__x64dbg__get_latest_event, mcp__x64dbg__wait_for_event, mcp__x64dbg__start_session, mcp__x64dbg__terminate_session, mcp__x64dbg__disconnect, AskUserQuestion, Bash, Read, Write, Skill
vuln-hunter
Hunt for vulnerabilities in a running debuggee. Performs import/export reconnaissance, triages attack surface by I/O context, then iteratively tests for bugs (buffer overflows, integer wraps, logic flaws, etc.) and builds proof-of-concept exploits.
Prerequisites
- The target program must be loaded in x64dbg and paused (at entrypoint or a function of interest)
- Be conservative with the context window — disassemble on demand, read memory on demand, do not dump large regions speculatively
Instructions
1. Connect and verify state
Confirm the debugger is connected and the debuggee is paused:
1. Call `mcp__x64dbg__get_debugger_status` — verify status is `paused` 2. If running, call `mcp__x64dbg__pause` 3. Call `mcp__x64dbg__get_register` for `rip` (64-bit) or `eip` (32-bit) to determine bitness and current location 4. Call `mcp__x64dbg__get_memory_map` to get an overview of loaded modules
Note the main module name and base address for subsequent steps.
IF the debuggee looks packed (e.g., entry point is in a non-standard section, imports look obfuscated, or YARA signatures match known packers), run the `/find-oep` skill first to unpack and find the real entry point.
2. Reconnaissance — imports and exports
The goal is to identify all program entry points that handle external (attacker-controllable) input.
2a. Enumerate imports and exports
Use the LIEF-based enumeration script to parse the PE's imports, exports, and security features:
Bash("python ${SKILL_DIR}/enum_imports.py <target_pe_path> --output imports.json")**Packed binaries**: LIEF parses the on-disk PE, so packed binaries will show only the packer's minimal IAT (e.g. `GetProcAddress`, `LoadLibraryA`). For packed targets: 1. Unpack first (e.g. via `/find-oep`) 2. Take a `/state-snapshot` to dump all memory to disk 3. Re-run the script with `--snapshot-dir <snapshot_dir> --base <module_base>` to parse the resolved IAT from the memory dump instead
Read the output and the generated JSON. Categorize each import by I/O context:
| Category | Example APIs | |---|---| | **Network** | `recv`, `recvfrom`, `WSARecv`, `InternetReadFile`, `HttpQueryInfo`, `WinHttpReadData`, `getaddrinfo` | | **File** | `ReadFile`, `CreateFileA/W`, `fread`, `fgets`, `MapViewOfFile`, `NtReadFile`, `mmioOpen`, `mmioRead` | | **Registry** | `RegQueryValueExA/W`, `RegGetValueA/W`, `RegEnumValueA/W` | | **Environment** | `GetEnvironmentVariableA/W`, `getenv` | | **Command line** | `GetCommandLineA/W`, `CommandLineToArgvW` | | **Clipboard / UI** | `GetClipboardData`, `GetWindowTextA/W`, `GetDlgItemTextA/W` | | **IPC / Pipes** | `ReadFile` on pipe handles, `PeekNamedPipe`, `TransactNamedPipe` | | **Memory / String** | `memcpy`, `strcpy`, `strcat`, `sprintf`, `wcscat`, `lstrcpyA/W`, `MultiByteToWideChar` — these are sinks, not sources, but are critical for buffer overflow detection | | **Allocation** | `malloc`, `HeapAlloc`, `VirtualAlloc`, `LocalAlloc`, `GlobalAlloc` — track buffer sizes |
Also note dangerous formatting/conversion functions: `sprintf`, `vsprintf`, `swprintf`, `sscanf`, `atoi`, `atol`, `strtol` — these may be involved in format string or integer conversion bugs.
Exports indicate externally callable interfaces (DLL entry points, COM interfaces, etc.) that may accept untrusted input.
2c. Find cross-references to I/O functions
For each interesting import identified above, find where it is called in the main module.
**Preferred approach — IAT byte-pattern search via Python/LIEF**:
The most reliable way to find xrefs is to search the `.text` section for byte patterns that reference IAT entries. This works even when the debugger's `findcalls` command fails or returns incomplete results. Write and run an inline Python script:
import lief, struct
binary = lief.parse("<target_pe_path>")
disk_base = binary.optional_header.imagebase # e.g. 0x400000
runtime_base = <module_base> # e.g. 0x160000
rebase = runtime_base - disk_base
# Get .text section bytes
text = [s for s in binary.sections if s.name == '.text'][0]
text_data = bytes(text.content)
text_va = disk_base + text.virtual_address
# For each import, compute IAT VA using DISK base (not runtime base!)
for imp in binary.imports:
for entry in imp.entries:
disk_iat_va = disk_base + entry.iat_address
# Search for FF 15 <iat_va_le> (call dword ptr [IAT]) — direct callers
pattern_call = b'\xff\x15' + struct.pack('<I', disk_iat_va)
# Search for FF 25 <iat_va_le> (jmp dword ptr [IAT]) — thunk stub
pattern_jmp = b'\xff\x25' + struct.pack('<I', disk_iat_va)
# Find all occurrences in .text
for i in range(len(text_data) - 5):
chunk = text_data[i:i+6]
if chunk == pattern_call:Claude Code plugin providing skills for x64dbg debugger automation.
Other skills on x64dbg-skills.
- /decompile
Decompile a function to C-like pseudocode using angr
Open skill - /find-oep
Smart trace-based OEP finder for packed/protected PE executables. Traces through packer stubs using intelligent stepping, anti-debug evasion, and heuristic OEP detection, then captures a state snapshot at the original entry point.
Open skill - /shellcode-analyzer
Load, unpack, and analyze shellcode in x64dbg. Use this skill when the user wants to analyze shellcode, load a shellcode blob into a debugger, unpack encoded/encrypted shellcode, or perform static/dynamic analysis of shellcode payloads.
Open skill - /state-diff
Compare two state snapshots to identify register and memory changes between two points in time
Open skill - /state-snapshot
Capture a full debuggee state snapshot (all committed memory regions + processor state) to disk for offline analysis
Open skill - /tracealyzer
Trace execution (into or over calls) for N steps or until a condition, then analyze the recorded instruction log
Open skill

