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.
npx claudepluginhub vzco/arc-probe --plugin arc-probeThis skill uses the workspace's default tool permissions.
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.
Orchestrates 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.
Performs deep static binary analysis using radare2 and Ghidra for function enumeration, disassembly, decompilation, xrefs, and control flow graphs. Use for reverse engineering binaries without execution.
Share bugs, ideas, or general feedback.
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 interest