---
title: "How to Install ReChecker for Client File Verification"
excerpt: "Install ReChecker, write resources.ini rules that check client file hashes, and avoid kicking legitimate players by mistake."
category: "installation"
tags: "rechecker, anticheat"
image: ""
read_time: "8 min read"
---
<p>ReChecker is a Metamod plugin that asks connecting clients for the MD5 hash (or existence, or absence) of specific files on their machine, and lets you act on the answer. It is how you catch the obvious cheats — a modified <code>opengl32.dll</code>, a wallhack's replacement models, a <code>.cfg</code> that no legitimate client has — and how you enforce that everyone is running the same map or model files you shipped.</p>
<p>Be honest about what it is: <strong>ReChecker is not an anti-cheat.</strong> It is a file-integrity check. A cheat that does not touch a file you check for, or that lies about the hash, walks straight past it. It raises the floor. It does not stop a determined cheater.</p>
<h2>1. Install the plugin</h2>
<p>ReChecker is a Metamod plugin (like <a href="/tutorials/install-revoice">ReVoice</a> and <a href="/tutorials/install-reunion">Reunion</a>), not an AMXX plugin.</p>
<pre>mkdir -p /home/steam/hlds/cstrike/addons/rechecker
cp rechecker_mm_i386.so /home/steam/hlds/cstrike/addons/rechecker/
cp resources.ini /home/steam/hlds/cstrike/addons/rechecker/
chmod 644 /home/steam/hlds/cstrike/addons/rechecker/*</pre>
<p>Register it in <code>cstrike/addons/metamod/plugins.ini</code>:</p>
<pre>linux addons/rechecker/rechecker_mm_i386.so
linux addons/amxmodx/dlls/amxmodx_mm_i386.so</pre>
<p>Restart. Metamod plugins load at server start, not on map change.</p>
<h2>2. resources.ini — the rules</h2>
<p>This is the whole product. Each line names a client-side file, a hash or keyword, and a server command to run when the rule matches, plus an optional flag.</p>
<pre>; "file" hash-or-keyword "server command" (or IGNORE) [flag]
; any opengl32.dll in the game root (this rule is in the shipped sample)
"../opengl32.dll" UNKNOWN "kick [userid] 'OpenGL32 Detected'" BREAK
; a cheat config: UNKNOWN fires when the file EXISTS, with any hash
"wallhack.cfg" UNKNOWN "kick [userid] 'Cheat config detected'" BREAK
; a model you ship: whitelist its hash (yours, not 1a2b3c4d), act on any other
"models/player/vip/vip.mdl" 1a2b3c4d IGNORE
"models/player/vip/vip.mdl" UNKNOWN "kick [userid] 'Bad player model'" BREAK
; log only, do not act: use this while you are calibrating
"../hw.dll" UNKNOWN "echo '[rch] [file_name] [file_md5hash] [steamid] [name]'"</pre>
<p>There are no action keywords: the third column is an ordinary server command, run when the rule fires. Single quotes in it become double quotes, and <code>[userid]</code>, <code>[name]</code>, <code>[steamid]</code>, <code>[ip]</code>, <code>[id]</code>, <code>[file_name]</code>, <code>[file_hash]</code> and <code>[file_md5hash]</code> are filled in. The only keywords are these:</p>
<ul>
<li><code>UNKNOWN</code> (hash column) - fires when the file exists with any hash that is not whitelisted by an <code>IGNORE</code> line above it.</li>
<li><code>MISSING</code> (hash column) - fires when the file is <em>absent</em>. That is the opposite of a cheat-file rule: a <code>MISSING</code> rule on a cheat file fires on every clean client.</li>
<li><code>IGNORE</code> (in place of the command) - whitelists that hash for that file.</li>
<li><code>BREAK</code> (optional last column) - once this rule fires, ReChecker runs no later rule's command for that player.</li>
</ul>
<p>Anything else in the hash column is read as a hex hash, so a misspelled keyword becomes a rule that silently never matches. Paths are relative to the client's <code>cstrike</code> folder, and <code>../</code> reaches the game root. Note that the <code>resources.ini</code> in the release archive is a live rule set, not a template: nearly all of its rules kick, so read it before you start the server with it.</p>
<h2>3. Get the hashes right</h2>
<p>The hash in <code>resources.ini</code> must be the MD5 of the file <strong>as it exists on the client</strong>, not on your server. For files you ship (custom models, sprites, sounds), those are the same file, so:</p>
<pre>md5sum cstrike/models/player/vip/vip.mdl</pre>
<p>ReChecker only compares the first 8 hex characters (4 bytes) of the MD5, which is why the sample file lists hashes like <code>3cc7f256</code>. Writing the full 32-character MD5 also works; only its first 8 characters count.</p>
<p>For client-side game files (<code>opengl32.dll</code>, <code>hw.dll</code>), they are <em>not</em> the same — you need the hash from a clean client install, and it differs between the Steam build and every non-Steam build in circulation. This is where people get themselves into trouble.</p>
<h2>4. Start in log-only mode. Always.</h2>
<p>For the first week, give every rule an <code>echo</code> command instead of a <code>kick</code> (like the last rule in section 2), and turn on ReChecker's own log by adding this to <code>server.cfg</code>:</p>
<pre>rch_log 1</pre>
<p>With <code>rch_log 1</code>, ReChecker writes a line for every rule that fires, including the client's hash as <code>md5hex</code> and the exact command it ran, to a dated file in <code>addons/rechecker/logs/</code> named <code>L_DD_MM_YYYY.log</code>. <code>rch_log 2</code> also logs every <code>IGNORE</code> rule check and the rule list loaded at each map start. ReChecker re-reads <code>resources.ini</code> at every map load, so a <code>changelevel</code> applies your edits. Then read what actually shows up:</p>
<pre>tail -f "$(ls -t /home/steam/hlds/cstrike/addons/rechecker/logs/L_*.log | head -1)"</pre>
<p>You will discover that legitimate players have a dozen different <code>opengl32.dll</code> hashes, because they are on different client builds — Steam, <code>steam_legacy</code>, and half a dozen non-Steam packs. If you had shipped that rule as <code>kick</code>, you would have kicked most of your regulars on day one. That is exactly the failure described in <a href="/tutorials/fix-rechecker-kicking-legit-players">ReChecker kicking legitimate players</a>, and it is entirely avoidable by not skipping this step.</p>
<p>Only after you have a week of logs, and you understand which hashes are normal on <em>your</em> player base, do you convert a rule to <code>kick</code>. Convert one rule at a time.</p>
<p>Whitelist each legitimate hash with an <code>IGNORE</code> line placed <em>above</em> the <code>UNKNOWN</code> rule for that file, because ReChecker reads the file top to bottom. Copy the <code>md5hex</code> value from the log, not <code>got</code> (the same bytes reversed), and pad it back to 8 characters if the log dropped a leading zero.</p>
<h2>5. Verify</h2>
<pre>meta list</pre>
<pre> [ 1] Rechecker RUN - rechecker_mm_i386. 2.x ini Chlvl ANY</pre>
<p>Then test the pipeline end to end with a rule you can trigger on purpose. Create a file on a test client:</p>
<pre>echo test > cstrike/rechecker_test.cfg</pre>
<p>and a rule, then <code>changelevel</code> so ReChecker reads it:</p>
<pre>"rechecker_test.cfg" UNKNOWN "kick [userid] 'Test rule'"</pre>
<p>Connect from that client. You should be kicked with your message. Connect from a client without the file — you should not be. That proves the plugin loads, parses the config, queries the client, and acts on the answer. Nothing short of that proves ReChecker is working.</p>
<h2>Rules that are worth writing</h2>
<ul>
<li><strong>Server-shipped custom content</strong> — models, sprites and sounds you distribute. The hashes are yours, they are stable, and a mismatch means the player replaced your model with a bright-green wallhack version. This is ReChecker's best use case by a distance.</li>
<li><strong>Known-cheat filenames</strong> — files that no clean client has. Low false-positive rate, low value (renaming a file defeats it), but it costs nothing.</li>
<li><strong>Do not check <code>hw.dll</code>, <code>opengl32.dll</code>, or <code>client.dll</code> with <code>kick</code></strong> unless you have a Steam-only server and you have logged the real distribution first. On a mixed server, the hash space is too wide to enumerate.</li>
</ul>
<h2>Common errors</h2>
<ul>
<li><strong><code>bad load</code> in <code>meta list</code></strong> — wrong architecture. <code>file rechecker_mm_i386.so</code> must report <em>ELF 32-bit, Intel 80386</em>. See <a href="/tutorials/fix-metamod-bad-load">bad load</a>.</li>
<li><strong>Rules never fire</strong> - <code>resources.ini</code> is in the wrong directory (it must sit next to the <code>.so</code> in <code>addons/rechecker/</code>, and a missing file produces no message at all), a line failed to parse (ReChecker skips that line and prints <code>Failed to load "resources.ini"</code> with the reason and line number in the console at map load), or a misspelled keyword is being read as a hash.</li>
<li><strong>Everyone gets kicked at once</strong> - you hashed a file from <em>your</em> machine and it does not match any real client. Switch the rule's command back to <code>echo</code> and <code>changelevel</code>, or run <code>meta unload rechecker</code> to stop it instantly, then read the logs. <a href="/tutorials/fix-rechecker-kicking-legit-players">ReChecker kicking legitimate players</a> has the full recovery.</li>
<li><strong>Every clean player is kicked by a cheat-file rule</strong> - the rule uses <code>MISSING</code>, which fires when the file is absent. Use <code>UNKNOWN</code> to act when a file is present.</li>
<li><strong>Non-Steam players are kicked, Steam players are not</strong> — you are hashing a client binary. Non-Steam builds differ. Drop that rule.</li>
</ul>
<h2>Verification checklist</h2>
<ol>
<li><code>meta list</code> — ReChecker <code>RUN</code>.</li>
<li><code>rch_log 1</code> is set, and <code>addons/rechecker/logs/</code> gets an entry whenever one of your echo rules fires.</li>
<li>A deliberately-planted test file triggers a kick with your message.</li>
<li>After a week in log-only mode, zero legitimate players would have been kicked by your rules.</li>
</ol>
<p>If you want defence in depth, pair this with <a href="/tutorials/install-cs16-server-anticheat">the anti-cheat options overview</a> — ReChecker is one layer, not the answer.</p>