1 Overview
ChainVerifier is a Windows desktop tool for finding, verifying, and managing pointer chains inside any running process. It is designed for both beginners learning pointer scanning and experienced reverse engineers who need a fast, reliable verification workflow.
What is a pointer chain?
A pointer chain is a sequence of memory addresses where each address points to the next, ending at the actual value you want to track. For example:
base_address + 0x89D244 → + 0x140 → + 0x20 → value: 42
Games and applications use this pattern because the base address of a module changes each time the program starts, but the offsets between pointers remain constant. A pointer chain lets you reliably find a value across sessions.
What ChainVerifier does
- Resolves pointer chains against a running process in real time using a full C++ backend
- Batch verifies millions of chains in under 1 second
- Scans memory using five different search modes
- Provides tools for bulk freezing values, editing hex, and importing Cheat Engine pointer maps
- Saves and loads chains in an encrypted format with auto-save backups
- Auto-checks for updates from GitHub with Windows native notifications
- Global hotkeys (Ctrl+Alt+A / S / F / H) for fast workflow
2 System Requirements
ChainVerifier runs on any modern 64-bit Windows system. Here is the full breakdown:
Minimum requirements
| Component | Requirement |
|---|---|
| Operating System | Windows 10 (64-bit), build 1809 or newer |
| Processor | Dual-core x64 CPU, 1.5 GHz or faster |
| Memory (RAM) | 4 GB |
| Storage | 150 MB free space |
| Display | 1100 x 720 resolution |
| Privileges | Administrator (required to attach to processes) |
Recommended requirements
| Component | Recommendation |
|---|---|
| Operating System | Windows 11 (64-bit) |
| Processor | Quad-core x64 CPU, 2.5 GHz or faster |
| Memory (RAM) | 8 GB or more |
| Storage | 250 MB free space (SSD recommended) |
| Display | 1920 x 1080 full HD |
| Privileges | Run as Administrator |
3 Installation
ChainVerifier v2.0.0 ships as a single portable EXE — there is no installer, no registry changes, no background services, and no Python runtime required. Here is the complete process:
Download the ZIP
Go to the download page and click the latest version (v2.0.0). The ZIP is around 42 MB.
Extract the EXE
Right-click the downloaded ZIP and choose Extract All. Inside you will find a single file: ChainVerifier.exe. Extract it anywhere you like — Desktop, C:\Program Files\ChainVerifier\, or a USB drive.
Run as Administrator
Right-click ChainVerifier.exe and select Run as Administrator. Windows will show a UAC prompt — click Yes. If SmartScreen warns, click More info then Run anyway.
Optional: create a shortcut
Right-click the EXE → Send to → Desktop (create shortcut). In the shortcut properties, tick "Run as administrator" for convenience.
_internal folder, no Python installation, and no other dependencies. Just extract and run.ChainVerifier.exe on a USB drive and run it from there. Chain files are saved wherever you choose — no system integration happens.4 First Launch
When you open ChainVerifier for the first time, you will see a custom splash screen followed by a dark-themed main window with several panels. Here is what happens automatically:
Automatic tasks on startup
- Hardware detection — ChainVerifier reads your CPU core count and available RAM, then auto-configures the optimal thread count and buffer size.
- Update check — a silent request to GitHub checks if a newer version is available. If yes, a Windows native notification appears with the ChainVerifier logo.
- Settings load — if you have used ChainVerifier before, your preferences (theme, hotkeys, layout) are restored.
- Auto-save timer — if enabled, background auto-save begins creating timestamped backups.
- Attach prompt — no process is attached yet. You will need to attach manually before doing anything.
What you see on screen
Top bar
Shows the attached process name, base address, target address input, and the Verify All Chains button.
Results panel
Center table where verification results appear — final addresses, match status, values, and descriptions. Changed values highlight in real time.
Chains editor
Bottom panel where you add, edit, and delete pointer chains. Multi-select supported for bulk operations.
Menu bar
File, Edit, Tools, Settings, View, and Help menus at the top — with all major actions accessible.
5 Attach to Process
Before you can verify any chain or run any scan, ChainVerifier needs to attach to a target process. Attaching means opening a handle to the process and reading its module list and memory map.
How to attach
- Click Tools → Attach to Process... from the menu bar, or click the Browse... button in the top bar.
- A dialog opens showing all running processes with their name, PID, and architecture (32-bit / 64-bit auto-detected).
- Type part of the name in the search box to filter, or scroll the list.
- Double-click the process, or select it and click Attach.
What happens after attaching
- The top bar displays the process name and its base address (in hexadecimal).
- ChainVerifier reads the module list — you can pick any module as the base for your chains.
- The status indicator turns green, showing the attachment is active.
Detaching
To detach, click Tools → Detach, or simply close the target process. ChainVerifier auto-detects when the target exits and detaches safely.
6 Interface Overview
The main window is split into five areas. Understanding each one makes everything else easier.
Top bar
The top bar holds:
- Process name — the currently attached process (or "Not attached")
- Base address — the module base address in hex, used as anchor for chains
- Target address — input field for the address you want to verify against
- Verify All Chains — main action button (batch verifies millions of chains
- Live update toggle — enables continuous re-verification with highlight on change
Results panel
The center table displays verification results with these columns:
| Column | Description |
|---|---|
| Name | Chain name (auto-generated or custom) |
| Final Address | Resolved memory address after following the chain |
| Match | YES if the value matches the target, NO otherwise |
| Value | The actual value read at the final address (highlights on change) |
| Status | OK, Error, or Unresolved |
| Description | Optional user-written notes |
Matching chains highlight in green. Double-click any value to edit it in memory. Double-click a Description cell to add notes. Multi-select rows for bulk delete.
Chains editor
The bottom panel manages your chain definitions:
- Add — create a new chain with base offset, offsets list, and value type
- Edit — modify an existing chain
- Delete — remove a single chain or multiple selected chains
- Clear All — remove every chain (with confirmation)
Menu bar
Six top-level menus provide access to all features:
File
New, Open, Save, Save As, Recent Files, Export Results, Exit
Edit
Undo, Redo, Copy, Paste, Delete All Error Chains
Tools
Attach, Detach, Scan, Freeze, Hex Viewer, Import Pointer Map
Settings
General, Appearance, Behavior, Performance, Hotkeys, Advanced
View
Toggle panels, zoom level, column visibility
Help
Documentation, Changelog, Check for Updates, About
Status bar
The thin bar at the bottom shows current operation status, attachment state, and short hints.
7 Managing Chains
A chain is your definition of how to reach a target value. ChainVerifier supports unlimited chains, each with its own name, base, offsets, and value type.
Chain fields explained
| Field | Description | Example |
|---|---|---|
| Name | Auto-generated label or your custom name | Health, Ammo, Position-X |
| Base Offset | Hex offset from the module base address | 0x89D244 |
| Offsets | Comma-separated hex offsets, in order from base to value | 0x140, 0x20, 0x3C |
| Value Type | int32, int64, float, double, or pointer | int32 |
| Expected Value | Optional — the value to match during verification | 100 |
Adding a chain
- Click Add in the chains editor.
- Enter a name (or leave blank for auto-generated).
- Enter the base offset in hex. Prefix with
0x— it is optional but recommended. - Enter offsets separated by commas. Spaces are ignored. Example:
0x140, 0x20, 0x3C - Pick the value type from the dropdown.
- Optionally add an expected value for auto-matching.
- Click Save.
Editing a chain
Double-click any row in the chains editor, or select the row and click Edit. Make your changes and save.
Deleting chains
- Delete one: select the row, click Delete
- Delete multiple: hold Ctrl or Shift to multi-select rows, then click Delete
- Delete all: click Clear All and confirm
- Delete errors only: after verifying, use Edit → Delete All Error Chains to remove all chains that failed to resolve
0x140, 0x20, ChainVerifier first reads base + 0x89D244, follows the pointer, adds 0x140, follows again, adds 0x20, then reads the value.8 Verify Chains
Verification is the core feature — it resolves every chain against the current memory state and compares the resulting values to your expected values. The v2.0.0 C++ backend batch verifies millions of chains
How to verify
- Make sure a process is attached (see section 5).
- Enter the Target address in the top bar. This is usually the module base address, or a specific value you want to compare against.
- Click Verify All Chains, or press F5.
- Results appear in the center table within milliseconds.
Reading the results
| Status | Meaning |
|---|---|
| OK (green) | Chain resolved successfully and the value matches the expected value (if set). |
| Mismatch (yellow) | Chain resolved but the value differs from what you expected. |
| Error (red) | Chain could not be resolved — one of the pointers was null, invalid, or unmapped. |
Live update mode
Toggle Live update in the top bar to re-verify all chains continuously. Values that change are highlighted in real time so you can spot dynamic values instantly.
Editing values in place
Double-click any value in the results table to open an inline editor. Type the new value and press Enter — ChainVerifier writes it directly to the target process memory.
Adding descriptions
Double-click any cell in the Description column to add a note. Descriptions are saved with the chain file.
9 Scan Modes
ChainVerifier provides five scan modes for different scenarios. Open the scan dialog with Tools → Scan or Ctrl+F. All scan modes auto-detect whether the target process is 32-bit or 64-bit.
9.1 AOB Pattern Scan
Find byte patterns anywhere in memory. Wildcards (??) match any byte.
Use cases: locating functions, finding signature bytes, verifying code integrity.
48 8B ?? 05 ?? ?? ?? ?? 48 85 C0
Options: case-insensitive by default; toggle "match exact case" if needed; limit to specific module or scan entire address space.
9.2 Range Scan
Find all values within a numeric range. Example: find all int32 values between 90 and 110.
Use cases: tracking health, ammo, currency, or any value with a known approximate range.
Options: value type (int32, int64, float, double), min/max bounds, alignment (4-byte, 8-byte).
9.3 Unknown Value Scan
When you do not know the value at all, this mode lets you narrow down candidates by comparing memory snapshots.
- First scan: snapshot the entire writable memory.
- Change the value in the target application (e.g., take damage).
- Second scan: filter by Changed, Unchanged, Increased, or Decreased.
- Repeat step 2-3 until only a few candidates remain.
Use cases: finding hidden stats, unusual values, or values that change in patterns you can observe.
9.4 String Scan
Search for text strings in memory. Supports ASCII and UTF-16 (wide) strings.
Use cases: finding player names, item names, chat messages, or configuration values.
Options: case sensitivity, ASCII vs UTF-16, minimum length, whole-word matching.
v2.0.0 fix: UTF-16 string scan false positives have been eliminated.
9.5 Pointer Scan
Find multi-level pointer chains that lead to a target address. This is the most powerful scan for building stable chains. The v2.0.0 C++ backend supports chunked region scanning (1 MB chunks) and multi-threaded parallel scanning.
How it works:
- Enter the target address (usually found via a value scan).
- Configure max level (1-7) — higher levels find longer chains but take longer.
- Configure max offset — larger offsets cover more memory but produce more results.
- Click Scan. ChainVerifier walks the pointer graph backward from the target.
- Results appear as suggested chains. Use the Send to Chains button to add them to the editor in one click.
Use cases: building reliable chains for values whose direct address changes on every restart.
New in v2.0.0: static filter with is_static flag to only show chains anchored to static module addresses.
10 Tools
Beyond scanning and verification, ChainVerifier includes a set of built-in tools for working with process memory.
10.1 Freeze Manager
Prevent a value from changing by continuously writing it back to memory in a background thread. v2.0.0 adds bulk freeze with a visual indicator and fixes an int64 precision loss bug.
Use cases: infinite health, infinite ammo, frozen coordinates, testing.
How to use:
- Open Tools → Freeze Manager.
- Click Add and enter the address and the value to write.
- Pick the value type.
- Toggle the freeze switch to enable. The value stays locked until you disable it.
- Use bulk mode to freeze multiple addresses at once.
Performance notes: each frozen entry uses a small amount of CPU. Freezing hundreds of values simultaneously is not recommended.
10.2 Hex Viewer / Editor
Inspect and edit raw bytes at any address.
How to use:
- Open Tools → Hex Viewer.
- Enter the address to view.
- The bytes appear in the classic hex + ASCII layout.
- Click any byte to edit it. Type hex digits directly.
- Click Write to commit changes to memory.
48 8B 05 90 12 34 56
10.3 Import Cheat Engine Pointer Map
If you already have a Cheat Engine pointer map exported as .sqlite, ChainVerifier can import all chains automatically.
How to use:
- Export your pointer map from Cheat Engine (File → Save pointer map as .sqlite).
- In ChainVerifier, open Tools → Import Pointer Map.
- Select the .sqlite file.
- ChainVerifier detects the schema and imports all chains in one go.
10.4 Export Results
See section 12 for details on exporting verification results.
11 Save & Load
Chain files use the .owu extension and are encrypted with XOR + SHA-256 checksum + zlib compression. They are portable and tamper-resistant. v2.0.0 adds auto-save with timestamped backups and threaded file I/O so the UI never freezes.
Creating a new file
File → New (or Ctrl+N) clears all chains and starts a fresh file.
Saving
- File → Save (Ctrl+S) — saves to the current file
- File → Save As (Ctrl+Shift+S) — save to a new location
- Auto-save — background timer creates timestamped backups automatically (configurable interval in Settings)
The saved file contains: all chains, descriptions, current results snapshot, and application settings tied to the file.
Opening
File → Open (Ctrl+O) loads an .owu file. The process attachment is not restored — you need to re-attach manually after opening.
Recent files
File → Recent Files shows the last 10 files you opened or saved, for quick access.
12 Export Results
Save verification results to a file for documentation, sharing, or further analysis.
Supported formats
| Format | Best for | Details |
|---|---|---|
| CSV | Spreadsheets, Excel | Comma-separated, one row per chain |
| JSON | Sharing, backups, automation | Structured, includes all metadata |
| TXT | Human-readable reports | Plain text, tab-aligned columns |
How to export
- After verifying, open File → Export Results....
- Choose the format (CSV, JSON, TXT).
- Choose what to include: all chains, only matched, only errors, or only selected.
- Pick the destination folder and filename.
- Click Save.
13 Settings
Access settings via Settings in the menu bar. Settings are organized into seven sections.
13.1 General
- Startup behavior — show attach dialog, restore last session, or open blank
- Auto-update check — enable or disable startup update check
- Confirm on exit — ask before closing if unsaved chains exist
13.2 Appearance
- Theme preset — six built-in themes (light, blue, purple, green, dark, custom)
- Font family and size — for both UI and code panels
- Row height — compact, normal, or relaxed
- Panel visibility — show or hide each main panel
- Accent color — pick any hex color for highlights
13.3 Behavior
- Live update interval — from 50 ms to 2000 ms
- Confirm on delete — ask before removing chains
- Auto-attach to last process — try to re-attach to the previous target on startup
- Remember column widths — persist table layout across sessions
13.4 Performance
- Performance profile — Battery Saver, Balanced, Performance, Extreme
- Thread count — for memory scanning (auto-detected by default)
- Buffer size — read buffer in MB (auto-detected by default)
- Pointer scan depth limit — cap on memory used for pointer scans
13.5 Hotkeys
Rebind any keyboard shortcut. Default bindings are listed in section 14. v2.0.0 adds global hotkeys (Ctrl+Alt+A / S / F / H) that work even when ChainVerifier is not focused.
13.6 File & Logs
- Auto-save interval — save chain file every N minutes (0 = disabled). Creates timestamped backups.
- Log level — Error, Warn, Info, Debug
- Log rotation — max log file size, number of archives
- Log location — where diagnostic logs are written
- Sound notifications — Windows default sounds on important events
- Taskbar flash — flash taskbar on important events
13.7 Advanced
- Cache size — for scan result caching
- Undo history depth — how many steps are remembered (C++ ring buffer, default: 100)
- Debug mode — extra logging and diagnostic output
- Reset all settings — restore defaults
14 Keyboard Shortcuts
All default shortcuts. Rebind any of these in Settings → Hotkeys.
File operations
| Shortcut | Action |
|---|---|
| Ctrl N | New chain file |
| Ctrl O | Open chain file |
| Ctrl S | Save |
| Ctrl Shift S | Save As |
| Ctrl E | Export results |
Editing
| Shortcut | Action |
|---|---|
| Ctrl Z | Undo |
| Ctrl Y | Redo |
| Ctrl C | Copy selected rows |
| Ctrl V | Paste chains |
| Delete | Delete selected chains |
| Ctrl Shift E | Delete all error chains |
Verification & scanning
| Shortcut | Action |
|---|---|
| F5 | Verify all chains |
| Ctrl F | Open scan dialog |
| Ctrl L | Toggle live update |
| Ctrl T | Attach to process |
| Ctrl D | Detach |
Tools & windows
| Shortcut | Action |
|---|---|
| Ctrl H | Open hex viewer |
| Ctrl Shift F | Open freeze manager |
| Ctrl U | Check for updates |
| F1 | Open documentation |
| Esc | Close active dialog |
Global hotkeys (new in v2.0.0)
These work even when ChainVerifier is not the active window.
| Shortcut | Action |
|---|---|
| Ctrl Alt A | Attach to process |
| Ctrl Alt S | Open scan dialog |
| Ctrl Alt F | Toggle freeze |
| Ctrl Alt H | Open hex viewer |
15 Tips & Best Practices
Recommendations from experienced users, ordered by impact.
Building reliable chains
- Always build from a module base. Using
game.exe + 0x89D244is stable across restarts; using a raw heap address is not. - Prefer shorter chains. A 2-level chain is more reliable than a 5-level chain.
- Use the pointer scanner to validate. After building a chain by hand, run a pointer scan to see if a shorter chain exists.
- Test after a restart. Restart the target process and re-verify. If your chain fails, it is not stable.
- Watch out for multi-threaded updates. Some games write values from multiple threads; freeze managers may fight with the game.
- Use the static filter. In v2.0.0, enable the is_static filter in pointer scan to only see chains anchored to static module addresses.
Scanning efficiency
- Limit to a module when possible. Scanning a single module is 10-100x faster than the whole address space.
- Use alignment. Most values are 4- or 8-byte aligned — enabling alignment cuts results by 50-90%.
- Increase scan depth gradually. Start at level 2, then retry with level 3 or 4 if needed.
- Close memory-heavy apps first. Browsers, IDEs, and VMs take RAM that scans need.
- Use Send to Chains. In v2.0.0, pointer scan results have a Send to Chains button that adds them in one click.
Workflow
- Save often. Enable auto-save in Settings → File & Logs for automatic timestamped backups.
- Use descriptions. Six months from now, "Player Health (base game)" beats "Chain 047".
- Keep a backup of working chains. Export to JSON and store somewhere safe.
- Do not verify while the target is paused. Frozen processes may have stale values.
- Use global hotkeys. Ctrl+Alt+A / S / F / H let you work without alt-tabbing back to ChainVerifier.
16 Troubleshooting
Common issues and how to resolve them.
Attach fails with "Access Denied"
Cause: ChainVerifier is not running as Administrator, or the target process is protected.
Fix:
- Close ChainVerifier, right-click the EXE, and pick Run as Administrator
- If the target uses kernel-level anti-cheat (EAC, BattlEye, Vanguard), memory access is blocked by design — no fix is possible
Chains resolve but values are wrong
Cause: The base offset or one of the offsets is off by a few bytes; or the value type is incorrect.
Fix:
- Verify offsets against a fresh pointer scan
- Check the value type —
int32vsfloatgives very different readings - Confirm the module base address in the top bar matches the module you scanned
Chain file fails to open on another machine
Cause: .owu files are encrypted with a per-installation key.
Fix: Use File → Export Results → JSON to transfer chains between machines.
Freeze manager does not hold values
Cause: The target process writes the value faster than ChainVerifier can refresh it; or the address is dynamically allocated and has moved.
Fix:
- Switch to a chain-based freeze (from a stable pointer chain) instead of a raw address
- Lower the freeze thread interval in Settings → Behavior
Pointer scan crashes or runs out of memory
Cause: Level or offset range is too large.
Fix:
- Reduce max level from 5 to 3
- Reduce max offset from 0x1000 to 0x400
- Close other memory-heavy applications
- Use a static module range instead of the whole heap
Windows SmartScreen blocks ChainVerifier
Cause: The EXE is unsigned and SmartScreen flags unknown publishers.
Fix:
- Click More info, then Run anyway
- Or right-click the EXE → Properties → check Unblock → OK
Antivirus quarantines ChainVerifier
Cause: False positive — memory tools are frequently flagged.
Fix:
- Add an exclusion for the ChainVerifier folder
- Upload the EXE to virustotal.com and inspect the results
- If you are not comfortable with exclusions, do not run the tool
Application starts but window is blank
Cause: GPU driver issue or missing Windows runtime.
Fix:
- Update your graphics drivers
- Ensure Visual C++ Redistributable 2019 or newer is installed
- Run ChainVerifier with
--safe-modeflag to disable hardware acceleration
Update check fails
Cause: No internet access, or GitHub API rate limit reached.
Fix: Wait a few minutes and retry, or download manually from the download page.
Notifications do not appear
Cause: Windows Focus Assist is enabled, or notifications are disabled for ChainVerifier.
Fix: Check Windows Settings → System → Notifications. The duration is OS-controlled (~3-5 seconds).
17 Glossary
Terms you will encounter while using ChainVerifier.
| Term | Definition |
|---|---|
| Address | A location in a process's virtual memory, expressed as a hexadecimal number, e.g. 0x7FF6A000. |
| AOB | Array of Bytes. A pattern of bytes used to search memory, often containing wildcards. |
| Attach | Opening a handle to a running process so ChainVerifier can read and write its memory. |
| Base address | The starting address of a module in memory. Changes each time the program runs, unless the module is ASLR-disabled. |
| Chain | A sequence of pointers and offsets that leads from a base address to a target value. |
| Dereference | Reading the value stored at an address. Follows a pointer. |
| Freeze | Continuously writing a value to memory so the target process cannot change it. |
| Hex | Base-16 number system. Memory addresses and offsets are typically written in hex. |
| Module | A loaded executable or DLL inside a process. Has a name, base address, and size. |
| Offset | A distance from a base address or pointer, added to reach the next location. |
| Pointer | A memory value that holds the address of another memory location. |
| PID | Process Identifier — a unique number assigned by Windows to each running process. |
| Static address | An address that does not change between runs, usually derived from a module base plus a fixed offset. |
| Value type | How a value is stored in memory. Common types: int32 (4 bytes), int64 (8 bytes), float (4 bytes), double (8 bytes). |
| Wildcard | A byte placeholder in an AOB pattern that matches any value. Written as ??. |
18 Getting Support
If this documentation did not answer your question, here are the ways to reach the developers and community.
Community support (free)
- GitHub Issues — bug reports, feature requests, and questions: github.com/owuMode/ChainVerifier/issues
- Telegram — real-time chat with the developer and other users: t.me/owumode
- FAQ — quick answers to common questions: FAQ page
- Changelog — what is new in each version: Changelog page
Reporting a bug
To get the fastest help, include:
- ChainVerifier version (shown in the header)
- Windows version and build (Win + R →
winver) - What you were doing when the bug occurred
- Steps to reproduce
- A screenshot or log file if relevant
Requesting a feature
Open an issue on GitHub with the label enhancement, and describe:
- The problem you are trying to solve
- How you currently work around it
- What the ideal solution would look like
