1 Introduction
ChainVerifier is a Windows tool that helps you find, verify, and manage pointer chains inside a running program. If you have ever tried to track a value like health, ammo, or currency in a game — and watched it move every time you restart — you already understand the problem this tool solves.
What a pointer chain is, in plain terms
A pointer chain is a step-by-step path through a program's memory. Instead of pointing directly at a value (which moves every time the program starts), a chain starts from a fixed anchor inside the program's executable and follows a series of offsets until it arrives at the value you care about. Because the anchor stays put, the chain keeps working after a restart.
What this manual covers
Every feature of ChainVerifier is described here in the order you will encounter it: from launching the app, to attaching to a process, to building and verifying chains, to scanning memory, to saving your work. If you are new to the tool, read sections one through eight in sequence. After that, feel free to jump to whichever topic interests you.
2 Getting Started
Getting ChainVerifier running takes less than a minute. The app is fully portable — no installer, no background services, no changes to your system.
Step by step
Download the ZIP
Visit the download page and grab the latest version. The file is roughly 42 MB.
Extract the EXE
Right-click the ZIP and choose Extract All. Inside you will find a single file called ChainVerifier.exe. Place it wherever you like — Desktop, a dedicated folder, or even a USB stick.
Run as Administrator
Right-click ChainVerifier.exe and choose Run as Administrator. Windows may ask you to confirm — click Yes. If SmartScreen warns about an unknown publisher, click More info and then Run anyway.
You are ready
The main window opens. From here, attach to a process and start building chains — both topics are covered in the sections that follow.
3 The Main Window
When ChainVerifier opens, you are looking at a single window divided into a few clearly separated areas. Getting familiar with each one will make everything else feel natural.
The top bar
At the very top sits the process bar. It shows which program you are currently attached to (or "No process opened" if you have not attached yet), along with a Browse button, a Target address field, and a Value Type dropdown. The Target address is where you tell the app what to compare against during verification. The Value Type tells it how to interpret the data it reads.
The results table
Below the process bar is the Verification Results table. This is where chains appear after you verify them. Each row shows the chain name, a short description you can add yourself, the resolved address in memory, whether the value matched your target, the current value, and a status label. Chains that match are highlighted in green so you can spot them instantly.
The chains editor
Underneath the results sits the Chains Editor. This is where you actually define chains before verifying them. You can add, edit, or delete chains here, and every change is fully reversible using Undo.
The log panel
At the bottom of the window is a log panel. It records everything the app does — attachments, scans, writes, saves, and any errors. If something does not behave as expected, the log is usually the first place to look.
The menu bar
Across the top of the window you will find six menus: File, Edit, Scan, Tools, Settings, and Help. Each one groups related actions. Every option in the menu bar is also reachable through a keyboard shortcut, which is covered in section fifteen.
4 Attaching to a Process
Before ChainVerifier can do anything useful, it needs to attach to a running process. Attaching is simply opening a connection to another program so the tool can read and write its memory.
How to attach
- Open the Tools menu and choose Attach to Process — or click the Browse button in the top bar.
- A dialog appears listing every running process along with its PID and, optionally, its icon.
- Use the search box at the top of the dialog to filter the list, or scroll through it manually.
- Double-click a process to attach, or select it and click Attach.
What happens next
Once attached, the top bar updates to show the process name and its base address. The status indicator switches to a green tone, and the log records the successful attachment. From this point on you can build chains, scan memory, and write values.
Detaching
To detach, open the Tools menu and choose Detach. You can also simply close the target program — ChainVerifier watches for this and detaches automatically within a second or so.
5 Working with Chains
A chain is a definition — a recipe that tells ChainVerifier how to reach a value inside a process. Every chain has four key properties: a base offset from the module, a list of intermediate offsets, a value type, and (optionally) a description.
Adding a chain
- Click the Add button in the Chains Editor.
- Optionally give the chain a name. If you leave it blank, the app generates one based on the base offset and offsets you entered.
- Enter the base offset in hexadecimal. A leading
0xis optional but recommended. - Enter the offsets, separated by commas. Offsets may be positive or negative — for example,
0x46C, -0x10, 0xCis perfectly valid. - Choose a value type from the dropdown: int32, int64, float, double, or pointer.
- Click Add. The chain appears in the editor and is ready to verify.
Editing a chain
Double-click any row in the chains editor, or select it and click Edit. Make your changes and save. The original value is preserved in the undo stack.
Deleting chains
You can delete a single chain, multiple chains at once, or clear the entire list. To delete multiple, hold Ctrl or Shift to select several rows first, then click Delete. To clear everything, use Clear All.
Names and descriptions
Chain names are useful when you have dozens of entries. A name like "Player Health" is far easier to recognize than "Chain 047". Descriptions go one step further — you can double-click the Description cell in the results table to add a note, and that note is saved with your file.
6 Verifying Chains
Verification is the core action of the whole application. When you verify, ChainVerifier walks every chain you have defined, follows each pointer in sequence, reads the value at the end, and compares it against your target.
How to run a verification
- Make sure a process is attached.
- Enter the target address in the top bar. In most workflows this is the process base address, which ChainVerifier fills in for you.
- Click Verify All Chains, or press F5.
- Results appear within a fraction of a second. With the C++ backend, even thousands of chains resolve in under a second.
Understanding the results
Each row in the results table tells a small story. A status of MATCH means the chain resolved and the value equals your expected value. A status of no match means the chain resolved but the value differed. An ERROR status means the chain could not be resolved at all — usually because a pointer in the middle of the chain was null or invalid.
Editing values directly
Double-click any value in the results table. A small dialog opens where you can type a new number and write it straight into the process. This is useful when you want to test whether a chain is really pointing at the value you think it is.
Cleaning up
After a verification run, you often find that some chains worked and many did not. Instead of clearing them all, use the Edit menu and choose Delete All Error Chains. Only the failing entries are removed; every working chain stays in place.
7 Live Value Updates
Static verification shows you a snapshot. Live updates show you the value changing in real time.
How it works
After you verify a set of chains, ChainVerifier automatically starts a background timer that re-reads each value at a fixed interval. Any value that changes is highlighted briefly, so your eye is drawn to it even in a long list. The interval is configurable from Settings, and the highlight duration can be adjusted to taste.
When live updates help
Live updates are invaluable when you are hunting a value that moves — health draining over time, ammunition counter ticking down, coordinates shifting as you walk. Watching a value change in real time tells you immediately whether a chain is pointing at the right thing.
8 Freezing Values
Freezing is the act of holding a value steady by continuously writing it back to memory. If a program keeps changing a number but you want it to stay at a specific figure, freezing is how you enforce that.
Two ways to freeze
ChainVerifier gives you two options. The first is the Freeze column in the results table — a small checkbox next to each row. Click it to lock the current value. The second is the Freeze Manager under the Tools menu, which lets you add any address manually, choose a value, and keep it frozen for as long as you like.
When to use each
The checkbox approach is best when you have already verified chains and simply want to hold their values. The Freeze Manager is more flexible — it works with any address, even ones that are not part of a verified chain.
9 Memory Scanning
When you do not yet know where a value lives, scanning is how you find it. ChainVerifier offers five different scan modes, each suited to a slightly different problem.
Pattern scan
The pattern scanner searches for a sequence of bytes anywhere in the target's memory. Wildcards — written as ?? — match any byte, which is handy when part of the pattern changes between runs. This mode is used most often to find functions, signatures, or unique code blocks.
48 8B ?? 05 ?? ?? ?? ?? 48 85 C0
Range scan
The range scanner finds every value that falls between a minimum and a maximum. If you know that health is somewhere around one hundred, for example, a range scan between ninety and one hundred and ten will narrow things down dramatically.
Unknown value scan
Sometimes you do not even know the starting value. The unknown value scanner takes a snapshot of memory, waits for you to change something in the target program, then filters the snapshot by what changed — increased, decreased, stayed the same, or matched a specific delta. Repeat the process a few times and you quickly isolate the value.
String scan
The string scanner looks for text in memory — player names, item labels, or configuration keywords. Both ASCII and UTF-16 (Unicode) strings are supported, so you can search the way the target program stores its text.
Pointer scan
The pointer scanner is the most powerful of the five and is covered on its own in section eleven, since it deserves a little more explanation.
10 Hex Viewer & Editor
Sometimes you want to look directly at raw bytes, without any interpretation. The Hex Viewer is exactly that — a window into memory at any address you choose.
Reading memory
Open the viewer from the Tools menu. Enter an address and click Go. The window shows the bytes in the familiar layout: hex on the left, ASCII on the right, sixteen bytes per line. Use the Prev and Next buttons to page forward and backward through memory.
Editing bytes
Below the display is a write field. Type a sequence of hex bytes — for example, 48 8B 05 90 — and click Write. The bytes are written directly at the current address. This is useful when you need to patch a small instruction or revert an experiment.
11 Pointer Scan
The pointer scan is how you discover chains that stay stable across restarts. Instead of searching for values, it walks backwards from a known address and finds the sequences of pointers that lead to it.
Running a pointer scan
- Open the Pointer Scan dialog from the Scan menu.
- Enter the target address — typically the address of a value you already located with a range scan.
- Choose a maximum level. Level two or three is a good starting point; higher levels find longer chains but take longer to run.
- Set a maximum offset. A larger range finds more candidates but also produces more noise.
- Click Find Pointers. The scan runs on a background thread, so the interface stays responsive.
Sending results to your chains editor
When the scan finishes, select one or more results and click Send to Chains. Each selected chain is added to your editor, ready to verify. If you have already verified some chains and want to compare, you can run the pointer scan again after a restart to see which suggested chains survive.
12 Importing Pointer Maps
If you have used Cheat Engine to build a pointer map, ChainVerifier can import it directly. The importer understands the standard SQLite format that Cheat Engine exports and detects its structure automatically.
How to import
- In Cheat Engine, save your pointer map as an
.sqlitefile. - In ChainVerifier, open the File menu and choose Import Pointer Scan, or use the Tools menu.
- Select the file. ChainVerifier reads it and shows you a preview of the chains it found.
- Choose how many to import — all of them, or only the first several thousand — and click Import to Chains.
What gets imported
Each pointer path becomes a chain with a module name, a base offset, and a list of intermediate offsets. You can verify them immediately, edit them, or delete the ones you do not need.
13 Saving & Loading
ChainVerifier saves your work in a file format called .owu. These files are encrypted, checksummed, and compressed, so they are compact and portable. You can keep as many as you like and load them on any machine.
Save, Save As, and Auto-Save
Save writes to the current file; Save As lets you pick a new location. If you have enabled Auto-Save in Settings, the app also saves periodically in the background and keeps rolling backups — up to the number you specify — so a crash or power failure never costs you more than a few minutes of work.
Opening a file
Open a chain file from the File menu, or pick one from the Recent Files submenu. The chains, descriptions, and even the log from the previous session are restored, so you can pick up exactly where you left off.
14 Exporting Results
When you want to share your results with someone else, document your work, or move chains between computers, use Export. The Export Results dialog is under the File menu.
Three formats
| Format | Best used for |
|---|---|
| CSV | Opening in Excel or any spreadsheet application |
| JSON | Sharing with other tools, backing up, or scripting |
| TXT | Reading as a plain report, or pasting into a document |
What you can include
Before exporting, you choose which rows to include — everything, only matched chains, only error chains, or only the rows you have highlighted. This makes it easy to share just the subset that matters.
15 Hotkeys
ChainVerifier ships with a set of keyboard shortcuts for the most common actions. Every shortcut can be rebound in Settings under the Hotkeys section.
Within the app
| Shortcut | Action |
|---|---|
| Ctrl N | New chain file |
| Ctrl O | Open a chain file |
| Ctrl S | Save |
| Ctrl Shift S | Save As |
| F5 | Verify all chains |
| Ctrl F | Open the scan dialog |
| Ctrl Z | Undo |
| Ctrl Y | Redo |
| Delete | Delete selected chains |
| Ctrl H | Open the hex viewer |
Global hotkeys
In addition to the shortcuts above, ChainVerifier supports four global hotkeys that work even when the app is not focused — useful when you want to trigger an action while looking at the target program. These are disabled by default and can be enabled in Settings.
| Shortcut | Action |
|---|---|
| Ctrl Alt A | Attach to process |
| Ctrl Alt S | Open scan dialog |
| Ctrl Alt F | Open freeze manager |
| Ctrl Alt H | Open hex viewer |
16 Notifications
ChainVerifier can keep you informed without pulling focus away from the target program. This is most useful when you are running long scans or waiting on a verification to finish.
What you can enable
- Windows toast notifications — a small popup appears in the corner of the screen when a scan completes or a chain matches. The notification shows the ChainVerifier icon.
- Taskbar flashing — the app's button in the taskbar flashes to draw your attention when something important happens.
- Sound — a short Windows sound plays when a match is found or a scan finishes. Each of these can be turned on or off independently.
All four settings live under Settings, in the File & Logs section. Notifications are intentionally lightweight and never interrupt your work.
17 Configuring the App
The Settings dialog is where you tailor ChainVerifier to fit your machine and your habits. It is organized into seven sections, each covering a distinct area of the app.
General
Startup behavior, window size memory, auto-attach, recent files limit, and whether to check for updates on launch.
Appearance
Fonts, sizes, color themes, table appearance, and which panels are visible. Six built-in themes are included, and every color can be adjusted individually if the presets do not suit you.
Behavior
How often live values refresh, how long a highlight lasts, when to confirm before closing or attaching, and what the default scan type and alignment should be.
Performance
Choose between preset performance modes — Battery Saver, Balanced, Performance, Extreme — or dive into individual settings like thread count, buffer size, and maximum results. The app detects your CPU and RAM automatically and offers sensible defaults.
Hotkeys
Rebind any keyboard shortcut, including the four global hotkeys.
File & Logs
Auto-save interval, backup count, whether to log to a file, log level, log rotation, and notification settings.
Advanced
Cache size, undo history depth, thread pool size, scan algorithm, and diagnostic options. These are for experienced users who want to fine-tune the app's behavior.
18 Keeping It Updated
ChainVerifier checks GitHub for new releases on startup. If a newer version exists, a small notification appears in the bottom-right corner of your screen.
To install an update
- When the notification appears, click it (or open the Help menu and click Download Latest).
- Your browser opens the release page with the newest ZIP.
- Download and extract the new EXE. Because ChainVerifier is portable, you can simply replace the old file with the new one — your settings and saved chains remain where they are.
Manual check
You can also trigger a check at any time from the Help menu by selecting Check for Updates.
19 A Typical Workflow
If you are new to pointer chains, the sequence below is a good pattern to follow. It walks through the standard way most users approach a fresh target.
Attach to the target
Launch the program you want to inspect, then attach to it in ChainVerifier.
Find the value
Use a range scan, a string scan, or the unknown value scanner to locate the value you care about.
Run a pointer scan
With the address in hand, use the pointer scanner to find chains that lead to it. Send promising results to the chains editor.
Verify and trim
Verify your chains. Remove the ones that failed. Keep the ones that resolved correctly.
Restart and confirm
Restart the target program, attach again, and verify once more. The chains that still work are the ones worth keeping.
Save and describe
Save your file, add descriptions to the chains that survived, and export a copy as a backup.
20 Where to Get Help
If this manual did not answer your question, there are several places to look next.
Community and support
- GitHub Issues — for bug reports, feature requests, or 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 has changed in each version: Changelog page
When reporting a problem
To get help as quickly as possible, include the version of ChainVerifier shown in the header, your Windows version, what you were doing when the issue happened, and — if possible — a copy of the log panel output. The log usually shows exactly what went wrong.
