borer
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BORER_BUDGET | No | Cap in bytes for every answer. Default 72000. 0 lifts it. | 72000 |
| BORER_MAX_FILE | No | Largest file read into memory, in bytes or with K, M or G. Default 1G. 0 lifts it. | 1G |
| BORER_DEADLINE_SECS | No | Seconds one request may run before it stops. Default 300. 0 means no deadline. | 300 |
| BORER_NO_UPDATE_CHECK | No | Set to 1 to turn off the daily update check. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| prompts | {} |
| resources | {} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| annotationsA | List the names, findings and open questions (comments opening with ?) added this session, paged. Use it to resume work; not for binary symbols (use symbols) or user types (use types). |
| binary_infoA | Summarize the loaded program: format, arch, entry, sections with entropy, imports, exports. load_binary already returns it; for protection and where to start, query borer://triage. Fails if nothing is loaded. |
| callgraphA | Draw a function's call graph as mermaid: callees, or callers with callers=true; imports are leaves and a %% line counts nodes cut by max_nodes. Not for one path (use reaches) or a caller list (use xrefs). |
| cfgA | Draw a function's control-flow graph as mermaid: blocks and successor edges, 300 blocks a page, a %% line when cut. Not for reading logic (use decompile) or a block table (use function). |
| class_layoutA | Infer a C++ class's fields, methods and vftable from how its methods use the object: offset, width, reads, writes. Use it on an unknown class; for a known layout use set_type. apply=Name saves it as a struct (dry run until dry_run=false). |
| decompileA | Decompile one function to pseudo-C. Locals are local_N/arg_N (N hex bytes below the entry sp: higher N, lower address); /* asm */ marks unmodeled code. Line 2 says what was checked, |
| decompile_batchA | Decompile many functions matching a name filter, in parallel, 6000 chars each and 40000 in all; out=<file.c> writes all uncapped to a file under the output root, kept unless overwrite=true. For one use decompile. |
| disassembleA | Disassemble count instructions from any address as |
| disassemble_functionA | Disassemble a whole function by blocks, with |
| entropyA | Find packed, compressed or encrypted data: chunks at or above threshold bits/byte, as |
| fetch_pdbA | Download the loaded PE's missing PDB over https into the cache, kept only if its GUID and age match. Use it when load_binary reports no PDB; dry run until dry_run=false, then load_binary again. |
| find_crypto_constantsA | Find crypto constants and tables (AES, SHA, MD5, CRC-32, ChaCha, Blowfish, FNV, Base64) and hashed API names as |
| find_function_by_stringA | Find the functions whose strings contain a text, case-insensitively: a numbered string legend, then |
| functionA | Show one function's raw facts: range, counts, callers, callees and block table ( |
| function_stringsA | List the string literals one function references as |
| function_summaryA | Triage one function in one call: shape, loops, jump tables, callers, callees, strings and data, then |
| functionsA | List discovered functions as |
| hexdumpA | Hexdump raw bytes at an address as |
| load_binaryA | Load a PE, ELF or Mach-O file (or raw bytes with arch) as the program all tools read, returning its summary. Clears the session's names: save_project first. A refused load changes nothing. |
| load_projectA | Replace the session's names, comments and types with a saved .json project. Another binary's project (by SHA-256) is refused unless force=true; for a rebuild use borer://carry. |
| queryA | Read a borer:// resource (triage, taint, emulate, solve, grep...) for hosts without MCP resources; same answer as resources/read. Use it for analyses no tool has; borer://help lists them, !offset=N!limit=N pages. |
| reachesA | Find the shortest call chain from one function to another or to an import, or say none exists within depth. Not for the whole neighbourhood (use callgraph) or direct callers (use xrefs). |
| readA | Read typed values (kind) as |
| reloadA | Restart the borer server on its rebuilt binary, keeping the session, the loaded file and its annotations. Use it after rebuilding borer instead of restarting the client; live attaches end. |
| save_projectA | Save the session's names, comments and types to a .json project under the output root, keyed by SHA-256. Restore with load_project; an existing file is kept unless overwrite=true. |
| scriptA | Run a sandboxed Rhai script on a snapshot of the program: query(uri) and rows(uri) read any resource. Use it when no single tool answers. Proposed names apply only with dry_run=false; a failed script applies nothing. |
| searchA | Search every byte of the file for a hex pattern with ?? wildcards, or text with kind=text, as |
| set_commentA | Comment an address in the session overlay, never the binary; a comment opening with ? is an open question. To name it use set_name. Dry run until dry_run=false; save_project keeps it. |
| set_nameA | Name a function or data global in the session overlay, never the binary; names=[addr=name,...] renames many, checked first. A taken name needs force=true. Dry run until dry_run=false. |
| set_typeA | Define a struct, enum or typedef, or apply a type at an address so decompile names its fields; at a function, type sets the prototype. To infer a class use class_layout. Checked first; dry run until dry_run=false. |
| stringsA | List printable ASCII and UTF-16LE strings as |
| symbolsA | List imports, exports, forwards, locals and data as demangled |
| typesA | List user-defined types and where each is applied, paged. Not for defining one (use set_type) or names and comments (use annotations). |
| xrefsA | List references to an address or name, one row per function, paged; an import lists calls through its slot, |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| explain_function | Explain one function from its summary, decompilation and callers, then propose names to apply. |
| find_check | Locate and explain the code that validates something (serial, license, password): from strings and constants to the comparison, ending with a rename plan. |
| protocol | Map how a networked client talks and dispatches: wire ids, every command's record, the message classes with their fields and handlers, and the registration tables, in a token-frugal order. |
| triage | Triage the loaded binary end to end (what it is, what it imports, what it hides, where to read first) in a token-frugal tool order. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| help | Every resource with what it answers, one line each; a template read without its argument (borer://emulate), or borer://help/<name>, gives its grammar and an example |
| info | Summary of the loaded program (binary_info) |
| session | Where this session stands: what is loaded, the overlay's counts and whether it is saved, the names, comments, types and loads it applied, and the requests it answered, each marked held (since=<tag> answers what changed), capped or paged |
| annotations | Annotation overlay: names and comments |
| qt | Qt classes from moc metadata: signals, slots, methods and properties, each mapped to its function |
| objc | Objective-C classes and categories from a Mach-O's runtime metadata, a row per method with its implementation (named -[Class sel]), 200 a page; borer://objc/<filter> narrows by class or selector |
| capabilities | What the program can do, grouped from its imports: networking, injection, crypto, persistence, anti-analysis and more |
| clr | A .NET assembly's metadata: its types, its methods with each body's address (IL is not decompiled; a mixed-mode image's native methods analyze as usual), P/Invokes as dll!export, the external members it uses, referenced assemblies and its user strings, 200 rows a page; borer://clr/<filter> narrows by kind (type, method, pinvoke, memberref, asmref, moduleref, string) or text |
| hidden | Strings the program generates at run time by mixing a keystream, recovered by running the generators |
| decoded | Strings a decoder function produces, recovered by running it at each of its call sites with that site's arguments (ciphertext pointer, length): a row per recovered string with its decoder and call site; a function that only copies yields nothing; borer://decoded/<filter> narrows by text |
| stackstrings | Strings a function builds on its stack a piece at a time, which malware does to keep text out of the data sections |
| vm | Dispatch loops: an interpreter's table jump with the handlers that return to it, which is what a virtualized function looks like |
| dynimports | The APIs and DLLs the program resolves at runtime via GetProcAddress/LoadLibrary, the imports a thin table hides |
| checks | Functions that decide whether a key, serial or license is valid, with the constants they test against |
| antianalysis | The anti-debug and anti-VM techniques the binary carries, at the instruction level and in its imports |
| flat | Functions whose control flow was flattened into one loop around a switch: every block a case, the block order destroyed, a state variable saying which runs next |
| map | The program's namespaces, each with its classes counted by role (from a pack's [roles] lines, else the role words in class names: managers, components, widgets, messages, commands), singletons and methods: a table of contents; borer://map/<namespace> lists one namespace's classes with role, parent, methods and instance |
| attrs | Every typed attribute the program registers (entity state: hit points, positions, timers), from the registrar a pack names ([attributes] registrar), with its four-character code, type, access mode, default and the functions using it, 200 rows a page; borer://attrs/<filter> narrows by name or code, and one exact match lists every user with the definition global |
| packs | The packs this session knows (named in BORER_PACKS, and every pack in the pack directories) and whether each loads for the loaded program: a pack loads by itself when all its [match] lines hold |
| ports | Every message every port (entity property, manager, UI handler) accepts and the function its dispatch calls for it, or inline, from the accept helpers a pack names ([messages] accept); borer://ports/<filter> narrows by component or message |
| messages | Every class that registered a four-character wire id, with its named fields and the functions that test for the id (the handlers), 200 rows a page, a function named in several cells numbered once in a # functions: legend; borer://messages/<filter> narrows by class name |
| index | Builds the decompilation index of the loaded program (every function's pseudo-C, cached on disk for borer://grep) and reports its size |
| triage | What the first ten calls of a triage would tell you, in one: format, protection, anti-analysis, crypto, generated strings, capabilities, and the functions to read first with the evidence for each; for a file with no code (data, an archive, another instruction set), its magic, entropy, high-entropy and encoded regions, and strings |
| protection | Whether the image is packed or protected, which protector the section names give away, and the evidence |
| iocs | Indicators to block or hunt: URLs, domains, IP and e-mail addresses, registry keys, file paths, pipe, mutex and kernel object names, user agents, each with where it came from (a stored string's address, a stack string, a generated string, decoded base64, an emulated API or syscall argument, an API call's argument), the function using it and a confidence, benign-common marking what every program carries; 200 rows a page, borer://iocs/<filter> narrows by type or text |
| fingerprint | The identity of this build's fingerprints: a digest, the counts, and how to write the sidecar a later borer://diff reads. The manifest itself is a file, written by the CLI, because one line per function is megabytes |
| hashes | The content hashes a file is correlated by: imphash (Mandiant's dll.function MD5 as pefile and VirusTotal compute it: table order, dll lowercased with .dll/.ocx/.sys stripped, ordinals named as pefile names them), authentihash (SHA-256 with the checksum, security directory and certificate table excluded, so signing does not move it), tlsh (Trend Micro's TLSH, the T1 string public feeds carry; none under 50 bytes or for too little variety) and borer-lsh (borer's own locality-sensitive hash, matching only another borer-lsh) |
| encoded | Strings stored encoded: base64 and hex text whose decoded bytes are text or a known file (a URL, a config, an embedded archive), each with its address and the decoded value; borer://encoded/<filter> narrows by decoded text |
| children | Programs and containers embedded in the file, each found by its signature and kept only when its headers validate (PE, ELF, Mach-O, zip, gzip, xz, 7z, cab, squashfs, cpio, uImage, cramfs, Android boot image), with offset, size and a one-line identity, plus the high-entropy runs no header explains: packed, compressed or encrypted bytes. load_binary path=<file>@<off> opens a program row as a program of its own; containers are listed, not extracted |
| asserts | The fields the binary's assertions name, with the classes that assert them |
| sources | The source files the binary's assertions name, by directory: the subsystems it was built from |
| classes | Every class that registered a four-character code, the code that identifies it on the wire, with its method count and first method |
| singletons | The program's singletons: the classes whose one instance lives at a fixed thread-local or global slot, with the slot and the ::Instance accessor - the engine's global object model |
| enums | Every name table the binary encodes (string-to-constant parsers and constant-to-string tables), one line per function |
| bench | Wall-clock speed of borer's hot queries on the loaded binary (AOB scan, string walks, indexed grep when the index is cached): one row per op with its answer size, fastest elapsed and throughput; timings differ run to run, the counts never do |
TDQS
Scored across 34 tools
Descriptions are unusually disciplined, including explicit "not for X (use Y)" redirects that resolve nearly every overlap (function vs function_summary, strings vs function_strings vs find_function_by_string, callgraph vs reaches vs xrefs). Still, the cluster of function/cfg/decompile/disassemble/function_summary tools is dense and an agent must read descriptions carefully to choose correctly, especially names differing only by plural (function/functions).
A discernible two-tier convention holds: read-only inspectors use bare nouns (symbols, types, xrefs, strings, cfg, hexdump) while mutating or action tools use verb_noun (load_binary, save_project, set_name, find_crypto_constants, disassemble_function). Minor hazards exist—`function`/`functions` and `disassemble`/`disassemble_function` differ only by inflection, and `query`/`script` are vague one-worders—but nothing is camelCase-mixed or chaotic.
34 tools is at the upper bound, but this is a full binary-analysis platform (load, inspect, decompile, annotate, save) where nearly every tool maps to a distinct analysis operation. A few could plausibly merge (disassemble/disassemble_function, function/function_summary), but none look like filler.
Core lifecycle is thorough—load, symbols/types, functions, decompile/disassemble, xrefs/callgraph/CFG, strings/search/entropy, annotation overlay, and project save/restore. However, several descriptions point to tools that are absent from the surface (live_read, live attach via reload), and there is no live-process read path or any means to compare/patch state beyond the overlay, leaving referenced dead ends.