The xmrwallet.com operator deployed a custom captcha system with proof-of-work and slider puzzle. Reverse-engineered and defeated within hours. New domains. New developer. Same scam.
The xmrwallet.com operator panicked. After losing two domains and facing sustained pressure, they deployed a custom captcha system with proof-of-work and slider puzzle across all remaining domains. They also registered two new escape domains — xmrwallet.net and xmrwallet.me — reusing the exact same server IPs from their suspended domains. The captcha was reverse-engineered from their JavaScript source and defeated within hours. Their code now has comments. Someone new is writing code for the scam.
In February 2026, PhishDestroy published technical evidence that xmrwallet.com is a Monero theft operation. The investigation led to the suspension of two escape domains. The operator's response was immediate and reveals an active, funded criminal operation — not an abandoned side project.
Three days after losing .cc and .biz, the operator registered two replacement domains. They didn't even change the servers — the new domains point to the exact same IP addresses:
| Suspended Domain | IP Address | Replacement Domain |
|---|---|---|
| xmrwallet.biz SUSPENDED | 190.115.31.40 |
xmrwallet.net ACTIVE |
| xmrwallet.cc SUSPENDED | 185.129.100.248 |
xmrwallet.me ACTIVE |
Both new domains were registered on the same day (February 26, 2026), at two different registrars (NICENIC International for .net, Key-Systems GmbH for .me). Using different registrars is deliberate — it forces abuse teams to coordinate across multiple organizations, slowing down takedown efforts.
Both are paid 10 years in advance (until 2036). For comparison, .biz was 5 years and .cc was 8 years. The operator is spending more money on each generation of escape domains.
All five xmrwallet domains (including suspended ones) share identical MX records — mx1/mx2.privateemail.com — pointing to the same email inbox. Same DDoS-Guard nameservers. Same IPs recycled between generations. This is one person operating under multiple registrar accounts.
For the first time since the 5.3-year commit gap documented in our initial investigation, someone made real code changes to the xmrwallet application. The operator deployed a custom captcha system — not an off-the-shelf solution like reCAPTCHA or hCaptcha, but a bespoke implementation built specifically for this scam site.
The original xmrwallet.com JavaScript is minified, obfuscated, and has zero comments. The new captcha code has inline comments like // Captcha loading functions, // Mining function, and proper variable naming. Different developer. The old operator appears to have brought in outside help to fight back against the investigation.
(nonce² + C) % P == T. Brute-force up to 5M iterations.{x, y, t} points.When authentication fails (error codes 75–80), the client fetches /captcha_api.php, which returns a JSON payload:
The client must find a nonce such that:
This is their "mining function" from the JavaScript source:
It's a simple quadratic brute-force over at most 5 million integers. A Python loop solves it in ~0.1 seconds. No GPU needed. No complexity. This "proof of work" provides essentially zero protection.
The captcha image is a PNG with a noise background and a small dark circle somewhere in the image. The user must drag a red dot from a starting position to the center of the dark circle. The server validates final position, trajectory, and PoW nonce.
The dark circle is trivially detectable with basic image analysis. Convert the PNG to grayscale, scan for clusters of pixels below a darkness threshold, compute the centroid. 15 lines of Python with Pillow. The noise background provides no meaningful camouflage — the target circle is always significantly darker than the surrounding pattern.
The captcha tracks mouse movement during the drag and sends it as a JSON array. This is meant to verify that a human physically dragged their mouse.
Generate synthetic trajectory with an ease-out curve (mimicking natural mouse deceleration), add Gaussian noise for human-like wobble, and space timestamps 3–8ms apart. 20 lines of Python produces trajectories indistinguishable from real mouse input. The server's validation is too weak to differentiate.
The captcha is not loaded on every page visit. It triggers only after an authentication attempt fails with specific error codes (75–80).
User submits login form → POST /auth.php
Server responds with 0:75 through 0:80 (captcha required)
Client fetches GET /captcha_api.php (returns image + PoW params)
Browser mines PoW in a loop (up to 5M iterations)
User drags red dot to dark circle while browser records trajectory
Client resubmits POST /auth.php with final_x, final_y, trajectory, pow_nonce
Server validates and returns session
Our automated bypass follows the same flow: detect error code, fetch captcha, brute-force PoW (0.1s), analyze image (pixel scan), generate synthetic trajectory, resubmit. The entire captcha is solved programmatically in under 2 seconds per attempt. 100% success rate.
The captcha was built by someone who understands web development but not adversarial machine learning or anti-bot systems. A real captcha service (reCAPTCHA, hCaptcha, Cloudflare Turnstile) would have been significantly harder to bypass — but those services require domain verification and would expose the operator to takedown through the captcha provider. The operator can't use legitimate services because their operation is criminal.
The code style shift is unmistakable. The original xmrwallet.com JavaScript (dating back to 2018) is heavily minified, obfuscated, with zero comments. The new captcha code is a completely different hand. Here's the actual source code from the live site:
Properly structured functions with // FIX: comments, numbered steps (// 3. Generate nonce, // 4. Create challenge), parameter validation, and explanatory hex constants. This was not written by the same person who wrote the original wallet code.
And then, just a few lines below all these clean, commented functions, sits the actual theft — the line that steals your private view key:
This session_key is transmitted on 40+ API requests per session. The captcha "protects" the login flow, but the theft mechanism behind it remains identical. Every user who passes the captcha gets their view key exfiltrated on the very next line.
The evidence is in the code itself. Properly structured functions with // FIX: comments, numbered steps, parameter validation, and explanatory hex constants. Then immediately below: bare btoa(xmrwallet_viewkey) crammed into a session cookie with no explanation. The new developer writes clean, educational-style code. The old operator wrote the theft. They are not the same person. Someone was hired to defend a decade-old Monero theft operation.
xmrwallet.com, xmrwallet.net, and xmrwallet.me are actively stealing Monero. New domains, new code, and new defenses do not change what the site does: it exfiltrates your private view key via session_key and hijacks your transactions server-side. Do not use any xmrwallet domain under any circumstances.
| Domain | Status | Registrar | Expires |
|---|---|---|---|
| xmrwallet.com | ACTIVE | NameSilo | 2031 |
| xmrwallet.net | ACTIVE | NICENIC International | 2036 |
| xmrwallet.me | ACTIVE | Key-Systems GmbH | 2036 |
| xmrwallet.cc | SUSPENDED | PublicDomainRegistry | 2034 |
| xmrwallet.biz | SUSPENDED | WebNic.cc | 2031 |
Every abuse report helps. The suspension of .cc and .biz proves that registrars act when presented with evidence.
| Domain | Abuse Contact |
|---|---|
| xmrwallet.com | abuse@namesilo.com |
| xmrwallet.net | abuse@nicenic.net |
| xmrwallet.me | abuse@key-systems.net |
| All (hosting) | abuse@ddos-guard.net |