From arc-probe
Analyzes loaded modules to discover functions from exports, RTTI, and .pdata; scans strings, traces references to key functions, and builds labeled GUI function maps. For reverse engineering DLLs/EXEs like client.dll.
How this skill is triggered — by the user, by Claude, or both
Slash command
/arc-probe:map-moduleThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Comprehensive analysis of a loaded module. Discovers all functions (exports + RTTI + .pdata), scans for strings, traces string references to find key functions, and builds a complete function map with labels in the GUI.
Comprehensive analysis of a loaded module. Discovers all functions (exports + RTTI + .pdata), scans for strings, traces string references to find key functions, and builds a complete function map with labels in the GUI.
module (required): Module name (e.g., "client.dll", "engine2.dll", "target.exe")probe.exe "modules list"
Find the target module in the list. Record:
If the module is not found, report available modules and stop. Common mistakes:
Client.dll and client.dll<name>.dll or <name>.exeprobe.exe "pe sections <module>"
Record the sections — this tells you where code vs data lives:
.text — executable code (functions live here).rdata — read-only data (strings, vtables, RTTI metadata).data — writable globals.pdata — exception/unwind data (function boundaries)Note the .text section size — this is the total code area to analyze.
probe.exe "functions discover <module> --limit 5000"
This combines three discovery sources:
The response includes:
count — number of functions returnedtotal — total functions discovered (may exceed limit)address, rva, source (export/rtti/pdata), name (if known), size (from pdata)Record the total count and the named functions (exports and RTTI). Unnamed .pdata entries are unlabeled — they'll be identified in later steps.
If total exceeds the limit, note this. For large modules (e.g., client.dll with 100K+ functions), focus analysis on named functions and string-referenced functions rather than trying to catalog everything.
probe.exe "pe exports <module>"
Exports are the module's public API. For each exported function:
CreateInterface, Init*, Shutdown*, Get*)Key exports to look for:
CreateInterface — Source 2 interface factory (critical entry point)DllMain / DllEntryPoint — initialization entryInit, Create, Register in the name — initialization functionsGet, Find, Lookup — accessor functionsprobe.exe "rtti scan <module>"
This reveals all C++ classes with virtual functions in the module. For each class:
Group classes by namespace or prefix to understand the module's class hierarchy. Common patterns:
C_* or CBase* — game entity classesI* — interface classes*Manager / *System — singleton managers*Component — component-based architectureFor the most important classes (3-5 key classes), get the full hierarchy:
probe.exe "rtti hierarchy <class_name> <module>"
probe.exe "strings scan <module>"
This scans the module's .rdata section for printable strings. The results can be large. Focus on:
"Failed...", "Error...", "Invalid..." — reveal error handling functions"[%s]...", "DEBUG:..." — reveal logging infrastructure"%s", "%d", "%f" — reveal data processing functions"CClassName::FuncName" — direct function identification".cfg", ".json", ".mdl" — reveal file loading functionsFor the 5-10 most interesting strings found in step 6, find the functions that reference them:
probe.exe "strings find <text> <module>"
Note the string address, then find code references:
probe.exe "strings xref <string_address> <module>"
Each xref gives you a code address (LEA instruction) and possibly the enclosing function. For each:
probe.exe "disasm <xref_address - 0x20> 15"
Identify the enclosing function and what it does. This is the highest-value analysis step — string references directly reveal function purpose.
probe.exe "pe imports <module>"
Imports reveal what OS and library APIs the module uses. Group by DLL:
This tells you the module's capabilities (does it do networking? graphics? file I/O?).
Combine all findings into a function map. For each identified function, create a GUI label:
curl -s -X POST http://localhost:9996 -H "Content-Type: application/json" -d '{
"action":"batch","actions":[
{"action":"activity","status":"working","message":"Labeling <module> functions..."},
{"action":"store","store":"label","method":"setLabel","args":["0x<addr1>","ExportedFunc1"]},
{"action":"store","store":"label","method":"setLabel","args":["0x<addr2>","ExportedFunc2"]},
{"action":"store","store":"label","method":"setLabel","args":["0x<addr3>","ClassName::vf0 (destructor)"]},
{"action":"store","store":"label","method":"setLabel","args":["0x<addr4>","handles: \"error message text\""]},
{"action":"activity","status":"idle","message":"Labeled N functions in <module>"}
]
}'
Use batch to label many functions at once. Limit batch size to ~50 labels per request.
Present the full module map:
Module Analysis: client.dll
===========================
Base: 0x7FFB0A8D0000
Size: 0x3E00000 (62 MB)
Path: C:\Program Files\Steam\steamapps\common\Game\bin\win64\client.dll
Sections:
.text 0x001000 0x2800000 (40 MB code)
.rdata 0x2801000 0x0F00000 (15 MB read-only data)
.data 0x3701000 0x0100000 (1 MB writable data)
.pdata 0x3801000 0x0300000 (3 MB exception data)
Functions: 98,432 total (via .pdata)
Exports: 47 named
RTTI: 2,841 virtual functions across 412 classes
Key Exports:
0x7FFB0A8D1000 CreateInterface
0x7FFB0A8D2000 DllMain
...
Key Classes (RTTI):
C_BaseEntity (142 vtable entries)
<- CEntityInstance <- CBaseEntity
C_BasePlayerPawn (89 vtable entries)
<- C_BaseEntity <- ...
CGameEntitySystem (31 vtable entries)
...
Key Functions (from string references):
0x7FFB0B1A4500 "CBaseEntity::TakeDamage" handler
0x7FFB0B2E7800 "Failed to initialize entity %s" error path
0x7FFB0B3C1200 "Connecting to server %s:%d" network connect
...
Imports: 12 DLLs
kernel32.dll (84 functions) — file I/O, memory
user32.dll (23 functions) — window management
ws2_32.dll (18 functions) — networking
...
Large modules like Source 2's client.dll contain tens of thousands of functions. Adjust the workflow:
--exports --rtti without --pdata to avoid listing 100K+ unnamed functionsrtti find <partial_name> to search for classes of interestSmall modules are fully analyzable:
functions discover <module> with no limitstrings scan <module> produces a manageable listEntity, Player, World, Game in the name/probe:analyze-function to deep-dive into specific functions of interestnpx claudepluginhub vzco/arc-probe --plugin arc-probeOrchestrates end-to-end investigation of unknown binary modules using ARC Probe: reconnaissance, strings, RTTI, functions, xrefs, structs, bookmarks, and GUI visualization. Use for analyzing loaded modules like DLLs in processes.
Performs initial binary triage surveying memory layout, strings, imports/exports, and functions to understand behavior and flag suspicious activity like unusual sections or malicious APIs.
Triages and audits IDA binaries to detect suspicious behavior, crypto/network activity, review decompiled code against source, and run multi-table queries.