VTIL-Sandbox is a local VTIL exploration and editing environment made of:
VTIL-Sandbox(C++ backend): deserializes.vtil, validates edits, and exposes JSON/bytes over HTTPVTIL-SandboxFrontend(Vue 2 frontend): visual graph/instruction UI with schema-guided editing tools
The project is designed for local workflow on 127.0.0.1.
- Backend API:
http://127.0.0.1:8090 - Frontend dev server:
http://127.0.0.1:8080 - End-to-end flow:
- Upload
.vtiltoPOST /api/upload - Backend parses VTIL and exposes routine state/schema
- Frontend renders blocks + CFG + instruction table
- User applies edits (
/api/edit/*) and can download updated bytes (/api/download)
- Upload
VTIL-Core/: VTIL core libraries and dependenciesVTIL-Sandbox/: backend server source (main.cpp)VTIL-SandboxFrontend/: Vue frontend sourceCMakeLists.txt: root build entry point
- Windows + MSVC toolchain
- CMake
>= 3.14.5 - Node.js + npm (frontend)
cmake -S . -B output -DVTIL_SANDBOX_BUILD_FRONTEND=OFF
cmake --build output --config Release --target sandboxUse Debug while iterating on backend logic:
cmake --build output --config Debug --target sandboxoutput\VTIL-Sandbox\Release\sandbox.exeDebug build:
output\VTIL-Sandbox\Debug\sandbox.exeExpected log:
Backend listening on http://127.0.0.1:8090
cd VTIL-SandboxFrontend
npm install
npm run serveOpen:
http://127.0.0.1:8080
- Toolbar with upload/download, manual refresh, and theme toggle
- Connection status indicator (Connected/Offline)
- Resizable two-pane layout (block list + detail pane)
- CFG viewer with zoom in/out, 1:1 reset, fit-to-view, wheel zoom, and drag pan
- Edge highlighting for incoming/outgoing edges of selected block
- Instruction table with:
- search by VIP/mnemonic/text (priority-selectable)
- next/previous match navigation
- expandable descriptor/operand details
- pseudo-ASM preview panel
- Editing workflows:
- Immediate operand editor (validated numeric input)
- Instruction editor with schema-guided mnemonic/operand validation + autocomplete
- Poll-based routine refresh while backend is online
All endpoints are served from http://127.0.0.1:8090.
GET /health- returns:
{ "ok": true }
- returns:
GET /api/state- returns routine metadata, blocks, CFG edges, instructions, descriptors, and operand metadata
GET /api/schema- returns editor schema derived from the loaded routine (mnemonics, discovered registers, and instruction descriptor rows)
POST /api/upload?name=<filename>- content-type:
application/octet-stream - body: raw
.vtilbytes
- content-type:
GET /api/download- returns serialized
.vtilbytes - includes
Content-Dispositionfilename
- returns serialized
POST /api/edit/immediate?block=<vip>&instruction=<index>&operand=<index>&value=<num>- updates one immediate operand value
valueaccepts decimal, hex (0x...), or negative
POST /api/edit/instruction?block=<vip>&instruction=<index>- body: plain instruction text (for example
mov vr0, 0x10:64) - validates mnemonic + operand types against known descriptors/registers
- body: plain instruction text (for example
- Validation or parse failures return
400with{ "ok": false, "error": "..." } - Unknown route returns
404 - Internal exceptions return
500
- Loopback-only bind (
127.0.0.1) - Request header limit:
64 KB - Upload payload limit:
32 MB - Per-client socket timeout:
15 s - Max concurrent clients:
64
cd VTIL-SandboxFrontend
npm run buildBy configuration, frontend artifacts are emitted to:
VTIL-Sandbox/builds/assets
Root CMake exposes VTIL_SANDBOX_BUILD_FRONTEND (default ON) and a custom target:
sandbox-frontend
Build it explicitly with:
cmake --build output --config Release --target sandbox-frontend