TW / Independent
← Research audits

Malware Analysis / Artefact: web3-provider.js · SHA-256 b8dae0cab6e9…

CryptoDrainEXE: analysis of a browser-wallet drainer

An obfuscated provider, resolved string table, recipient addresses and telemetry. What the code establishes — and why this copy does not contain a complete backend.

Scope
CryptoDrainEXE browser code and local static analysis tool
Method
Independent research audit; not commissioned by the vendor
Evidence
Pinned browser source set; no backend or transfer execution.
Finding

Findings separated by evidence class

No complete deployment or backend; no dynamic testing

Analyst note

What the evidence actually supports.

The raw code tells us more than the project name. We separate the visible interface, provider call and potential effect so suspicious code does not become a premature verdict.

Evidence anchorchecked locally
Artefact
web3-provider.js
SHA-256
b8dae0cab6e95db8de1d3bb1baef189d9e4956c3ad5f83680c5b0597e255f2f4
Analysis basis
Pinned browser source set; no backend or transfer execution.
Malware / Evidence Atlas

Delivery → Transfer boundary

The analysis path for this report. Every node shows what is supported, where detection can start and where the claim stops.

5flow nodes 1detection artefacts 1rule formats
Claim

Delivery

The report begins with the documented delivery of the browser-wallet drainer.

Detection focus

Capture file origin, signing state and browser context.

Supported by review evidence
Config Surface

Configuration fingerprint

Review pivots derived from the report — not a live configuration or universal family indicator.

01
Browser contextextension / page
support
02
Asset rankingvalue heuristic
core
03
Provider calltransaction request
support
04
Transfer proofopen boundary
boundary
MODEL / 982F059BCore, support and boundary — not risk scores
Detection Pack

Defensive artefacts

Source, validation and limits accompany every rule.

SourceOriginal static source-review rule, not copied from the sample.ValidationSemgrep parser and synthetic positive fixture passed.LimitFinds flows requiring review; proves neither deception nor transfer.
SemgrepOpen rule
Defensive model
rules:
- id: value-ranked-wallet-transfer-review
  languages: [javascript, typescript]
  severity: WARNING
  message: Review value-ranked assets passed to a wallet transfer operation
  patterns:
  - pattern-inside: |
      $A.sort(($X, $Y) => $Y.amount_usd - $X.amount_usd);
      ...
  - pattern-either:
    - pattern: $W.sendTransaction(...)
    - pattern: |
        $W.request({method: "eth_sendTransaction", ...})

Evidence status Supported by review evidenceBound to primary researchBounded or unresolved

What we reviewed

We reviewed a pinned JavaScript snapshot of the GitLab project cryptodrainexe/cryptowalletdrainer. The source dates to 23 February 2025 and the manual audit to 12 October 2026. For this account, existing files were compared statically on 13 October.

The question is what this specific copy shows about wallet behaviour, data transmission and system completeness. No Windows executable was examined, no sample executed and no endpoint contacted.

Reference: ARTIFACT-MANIFEST.md, commit 233cd4e62536170ef67ac12e3ac8f218f1d10517; behaviour assessment in AUDIT-DE.md. The hash ledger below distinguishes the original from derived artifacts.

ARTIFACT MANIFEST

Files and checksums

sample/web3-provider.js
b8dae0cab6e95db8de1d3bb1baef189d9e4956c3ad5f83680c5b0597e255f2f4

Original sample

artifacts/web3-provider.normalized.analysis.txt
02818c11a03deb783b45f89bfbc44409ae39ad7db7bbdc16edb251e30d27f42e

Analysis output / tool

artifacts/web3-provider.deobfuscated.analysis.txt
d3fa51775c324cbb750dbc3e27cb3e834a44dcd2cd23a2b64e5775a65699d230

Analysis output / tool

tools/deobfuscate-provider.mjs
89abae5ced4c67258d7ef4d14f53c05efa44e09ccd0a7889a183b5e917c0bcf1

Analysis output / tool

File relationships and analysis history

The first view shows selected references in the preserved HTML package. The second separates raw file, our tool, existing derived artifacts and report. Lines represent documented file relationships, not an executed wallet or C2 chain.

FILE / EVIDENCE MAP

Which file belongs to which evidence?

File references and processing history are different relationships.

A file reference does not establish runtime behaviour. Recorded processing is not a new execution.

SourceToolDerivedEvidenceMissingVerified referenceRecordedUnresolved

Files

Selected HTML references, preserved files and missing dependencies.

index.html

Original HTML with script references.

File
sample/index.html
SHA-256
fcf7097d63a47ea9b6bf14b613a34cf1199225792d75da4f647c1dd03f1b2e4c
Location
86–97
  • index.html → web3-modal.jsHTML reference · Verified reference

    index.html, line87: static src reference; no browser execution.

  • index.html → web3-loader.jsHTML reference · Verified reference

    index.html, line88: static src reference; no browser execution.

  • index.html → web3-data.jsHTML reference · Verified reference

    index.html, line94: static src reference; no browser execution.

  • index.html → web3-provider.jsHTML reference · Verified reference

    index.html, line97: static src reference; no browser execution.

  • index.html → Axios-Datei fehltHTML reference · Unresolved

    index.html, line86: static src reference; no browser execution.

  • index.html → Seaport-Datei fehltHTML reference · Unresolved

    index.html, line93: static src reference; no browser execution.

Related report section →
web3-modal.js

Local file present; HTML references it at line87.

File
sample/js/web3-modal.js
SHA-256
c2ab8b77f0645edd26fa1c6e0f69d07cc06d9763b9904e01b71902f12d05c6e9
  • index.html → web3-modal.jsHTML reference · Verified reference

    index.html, line87: static src reference; no browser execution.

web3-loader.js

Local file present; HTML references it at line88.

File
sample/js/web3-loader.js
SHA-256
801d62fc02f89e7c1b414392e066dcda139ea3154cb3a48da721ff9a9df49f1f
  • index.html → web3-loader.jsHTML reference · Verified reference

    index.html, line88: static src reference; no browser execution.

web3-data.js

Local file present; HTML references it at line94.

File
sample/js/web3-data.js
SHA-256
0e5f7c28c6614ae5f1fba671c315cbf6d4ff809a305503ddc2eb3e1fe908e0d7
  • index.html → web3-data.jsHTML reference · Verified reference

    index.html, line94: static src reference; no browser execution.

web3-provider.js

Pinned raw code, HTML reference at line97.

File
sample/js/web3-provider.js
SHA-256
b8dae0cab6e95db8de1d3bb1baef189d9e4956c3ad5f83680c5b0597e255f2f4
  • index.html → web3-provider.jsHTML reference · Verified reference

    index.html, line97: static src reference; no browser execution.

Related report section →
Axios-Datei fehlt

HTML line86 references a file outside the preserved package.

  • index.html → Axios-Datei fehltHTML reference · Unresolved

    index.html, line86: static src reference; no browser execution.

Seaport-Datei fehlt

HTML line93 references a file missing from the package.

  • index.html → Seaport-Datei fehltHTML reference · Unresolved

    index.html, line93: static src reference; no browser execution.

Analysis history

Historically documented processing; hashes checked read-only now.

Rohdatei

Original bytes preserved separately.

File
sample/js/web3-provider.js
SHA-256
b8dae0cab6e95db8de1d3bb1baef189d9e4956c3ad5f83680c5b0597e255f2f4
  • Rohdatei → Unser AnalysewerkzeugTool input · Verified reference

    Tool line12 reads a text file; the historical run is only documented.

Related report section →
Unser Analysewerkzeug

Local text parser, read only in this review.

File
tools/deobfuscate-provider.mjs
SHA-256
89abae5ced4c67258d7ef4d14f53c05efa44e09ccd0a7889a183b5e917c0bcf1
Location
12; 110–121
  • Rohdatei → Unser AnalysewerkzeugTool input · Verified reference

    Tool line12 reads a text file; the historical run is only documented.

  • Unser Analysewerkzeug → Decoderersetzte FassungHistorical replacement · Recorded

    ARTIFACT-MANIFEST.md, Derived artifacts: decoder calls statically replaced.

  • Unser Analysewerkzeug → String-MapHistorical mapping · Recorded

    Manifest lists string-table-map.json with its own hash; mapping data not published.

Related report section →
String-Map

Existing derived artifact; contents not published.

File
artifacts/string-table-map.json
SHA-256
f84983431ffcc51171c4060af2f021c14a370a3dd89005c085a2a4be3c4cdc69
  • Unser Analysewerkzeug → String-MapHistorical mapping · Recorded

    Manifest lists string-table-map.json with its own hash; mapping data not published.

Decoderersetzte Fassung

Existing artifact after static replacement.

File
artifacts/web3-provider.deobfuscated.analysis.txt
SHA-256
d3fa51775c324cbb750dbc3e27cb3e834a44dcd2cd23a2b64e5775a65699d230
  • Unser Analysewerkzeug → Decoderersetzte FassungHistorical replacement · Recorded

    ARTIFACT-MANIFEST.md, Derived artifacts: decoder calls statically replaced.

  • Decoderersetzte Fassung → Normalisierte FassungHistorical normalization · Recorded

    Manifest: Terser5.44.0 folding and formatting.

  • Artefaktmanifest → Decoderersetzte FassungArtifact hash · Verified reference

    SHA-256 recalculated locally and compared with manifest.

Related report section →
Normalisierte Fassung

Existing Terser processing; separate hash.

File
artifacts/web3-provider.normalized.analysis.txt
SHA-256
02818c11a03deb783b45f89bfbc44409ae39ad7db7bbdc16edb251e30d27f42e
  • Decoderersetzte Fassung → Normalisierte FassungHistorical normalization · Recorded

    Manifest: Terser5.44.0 folding and formatting.

  • Normalisierte Fassung → Manueller BerichtStatic evidence locations · Verified reference

    AUDIT-DE.md cites lines in normalized output.

  • Artefaktmanifest → Normalisierte FassungArtifact hash · Verified reference

    SHA-256 recalculated locally and compared with manifest.

Related report section →
Artefaktmanifest

Historical counts and hashes, no rerun.

File
ARTIFACT-MANIFEST.md
SHA-256
adf21af3f97609782c007455bd62409ca1aeccd1cca282b00c1075dbfe3e6bce
Location
Derived artifacts
  • Artefaktmanifest → Decoderersetzte FassungArtifact hash · Verified reference

    SHA-256 recalculated locally and compared with manifest.

  • Artefaktmanifest → Normalisierte FassungArtifact hash · Verified reference

    SHA-256 recalculated locally and compared with manifest.

Related report section →
Manueller Bericht

Interpretation and limits, separate from source code.

File
AUDIT-DE.md
SHA-256
0b9cdff32924f03d6aa5bf67be15808956e45a1b3273c1e2dce8bd3a70eb418b
Location
Sources and reproducibility; deobfuscation status
  • Normalisierte Fassung → Manueller BerichtStatic evidence locations · Verified reference

    AUDIT-DE.md cites lines in normalized output.

Related report section →

Limit: Script src is an HTML reference, not proof of successful runtime initialisation. The complete original backend is unavailable. The historical transformation was not rerun.

Original file: HTML metadata

The HTML snapshot places the project name in its title element. The browser file therefore labels itself a drainer; the name alone still does not establish behaviour. Only metadata is shown, not executable script setup.

htmlsample/index.html · original lines 1–5Sample excerpt
sample/index.html · Lines 1–5
Show file hashSHA-256 fcf7097d63a47ea9b6bf14b613a34cf1199225792d75da4f647c1dd03f1b2e4c
<html lang="en"><head></head><body>

    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CryptoDrainEXE Multi-chain Crypto Wallet Drainer</title>
Read the code

What deobfuscation changed

The historical manifest records 3,295 string entries, 403 table rotations, 107 decoder aliases and 7,922 statically replaced calls. Subsequently, 1,722 string concatenations were folded and the normalized output syntax-checked with Terser 5.44.0. This work was not rerun here.

The original, decoder-replaced and normalized artifacts have different hashes. Some opaque variable names remain. The output is readable, not an executed program or verified deployment.

Original evidence: page title

The short original excerpt is displayed as text only. It was located exactly in the raw file and existing normalized output. The page title supplies the name in wallet-connection metadata. This demonstrates the transformation, not the malicious functionality of the whole sample.

ARTIFACT / RECONSTRUCTION

Original evidence: page title

Source artifact · hash of the full file, not the excerpt

File
sample/web3-provider.js
SHA-256
b8dae0cab6e95db8de1d3bb1baef189d9e4956c3ad5f83680c5b0597e255f2f4
Location
Line 1, column 5485
01 · Before processingOriginal / do not execute
'name':document[_0x24d3e8(0x483)]
02 · ReconstructionExisting normalized analysis output
name: document.title,
Reconstruction file and its own checksum
Reconstruction file
artifacts/web3-provider.normalized.analysis.txt
SHA-256
02818c11a03deb783b45f89bfbc44409ae39ad7db7bbdc16edb251e30d27f42e
Reconstruction location
Line 113

Text view · no execution · original remains unchanged

Decoder call

The hexadecimal call conceals a property or string name here. This short excerpt stays tied to its original file and location.

Statically resolved

The earlier decoder replacement and normalization produce document.title. The location in the derived analysis artifact is recorded separately.

Readable context

The page title becomes the name in wallet-connection metadata. It is neither a recipient address nor a C2 destination.

Limit: Not a complete decoder; no claim about runtime or payment.

Original evidence: DOM element type

Normalized output shows the DOM identifiers actually used: style, div, web3-overlay and web3-modal. The comparison above establishes one string resolution; the longer genuine excerpt below shows its immediate UI context.

This is an excerpt from existing analysis output, not a rebuilt model UI. SHA-256: 02818c11a03deb783b45f89bfbc44409ae39ad7db7bbdc16edb251e30d27f42e.

ARTIFACT / RECONSTRUCTION

Original evidence: DOM element type

Source artifact · hash of the full file, not the excerpt

File
sample/web3-provider.js
SHA-256
b8dae0cab6e95db8de1d3bb1baef189d9e4956c3ad5f83680c5b0597e255f2f4
Location
Line 1, column 63689
01 · Before processingOriginal / do not execute
'FxZSQ':_0x844b4c(0x579)
02 · ReconstructionExisting normalized analysis output
FxZSQ: "style",
Reconstruction file and its own checksum
Reconstruction file
artifacts/web3-provider.normalized.analysis.txt
SHA-256
02818c11a03deb783b45f89bfbc44409ae39ad7db7bbdc16edb251e30d27f42e
Reconstruction location
Line 1672

Text view · no execution · original remains unchanged

Decoder call

The hexadecimal call conceals a property or string name here. This short excerpt stays tied to its original file and location.

Statically resolved

The earlier decoder replacement and normalization produce "style". The location in the derived analysis artifact is recorded separately.

Readable context

style names a DOM element. The adjacent web3-overlay and web3-modal names place the string in the interface code.

Limit: Not a complete decoder; no claim about runtime or payment.

javascriptNormalized analysis artifact · lines 1672–1679Reconstructed sample excerpt
artifacts/web3-provider.normalized.analysis.txt · Lines 1672–1679
Show file hashSHA-256 02818c11a03deb783b45f89bfbc44409ae39ad7db7bbdc16edb251e30d27f42e
        FxZSQ: "style",
        OujMT: "web3-style",
        iviYd: "div",
        kKYbd: "web3-overlay",
        wqNjF: "none",
        XEQTG: ".web3-overlay",
        uoEut: "click",
        luxzn: "web3-modal"
Read the code

Our tool: reading escape sequences

This excerpt comes from our analysis tool, not the drainer. It validates individual escape sequences, returns a character and advances the read position. No eval, browser or network request.

It is not a complete JavaScript parser. It documents one helper step, not execution of the sample.

javascriptGenuine excerpt: our static analysis tool, lines 14–31Analysis tool excerpt
function decodeEscape(text, index) {
  const ch = text[index];
  const simple = { n: "\n", r: "\r", t: "\t", b: "\b", f: "\f", v: "\v", "0": "\0" };
  if (Object.hasOwn(simple, ch)) return [simple[ch], index + 1];
  if (ch === "x") {
    const hex = text.slice(index + 1, index + 3);
    if (!/^[0-9a-f]{2}$/i.test(hex)) throw new Error(`invalid hex escape at ${index}`);
    return [String.fromCharCode(Number.parseInt(hex, 16)), index + 3];
  }
  if (ch === "u") {
    const hex = text.slice(index + 1, index + 5);
    if (!/^[0-9a-f]{4}$/i.test(hex)) throw new Error(`invalid unicode escape at ${index}`);
    return [String.fromCharCode(Number.parseInt(hex, 16)), index + 5];
  }
  if (ch === "\n") return ["", index + 1];
  if (ch === "\r" && text[index + 1] === "\n") return ["", index + 2];
  return [ch, index + 1];
}
Read the code

Analysis tool: reading a bounded string literal

This genuine tool excerpt reads characters between known quotation marks. Escapes are delegated to the separate helper. It evaluates no JavaScript; table markers and sample-specific decoder mappings are excluded.

javascripttools/deobfuscate-provider.mjs · original lines 44–58Analysis tool excerpt
tools/deobfuscate-provider.mjs · Lines 44–58
Show file hashSHA-256 89abae5ced4c67258d7ef4d14f53c05efa44e09ccd0a7889a183b5e917c0bcf1
    const quote = text[i];
    if (quote !== "\"" && quote !== "'") throw new Error(`unexpected token in string table at ${i}`);
    i += 1;
    let value = "";
    while (i < text.length && text[i] !== quote) {
      if (text[i] === "\\") {
        const decoded = decodeEscape(text, i + 1);
        value += decoded[0];
        i = decoded[1];
      } else {
        value += text[i];
        i += 1;
      }
    }
    if (text[i] !== quote) throw new Error("unterminated string table item");
Read the code

Analysis tool: folding string literals

This second tool excerpt joins recognised JSON string literals. The loop stops when no replacement occurs. It is the actual local processing step, not a rebuilt drainer model. The historical run and counts are recorded in the manifest; it was not rerun for this addition.

javascripttools/deobfuscate-provider.mjs · original lines 110–121Analysis tool excerpt
tools/deobfuscate-provider.mjs · Lines 110–121
Show file hashSHA-256 89abae5ced4c67258d7ef4d14f53c05efa44e09ccd0a7889a183b5e917c0bcf1
const jsonString = '"(?:\\\\.|[^"\\\\])*"';
const concatPattern = new RegExp(`(${jsonString})\\s*\\+\\s*(${jsonString})`, "g");
let foldedConcats = 0;
while (true) {
  let round = 0;
  output = output.replace(concatPattern, (_full, left, right) => {
    round += 1;
    foldedConcats += 1;
    return JSON.stringify(JSON.parse(left) + JSON.parse(right));
  });
  if (round === 0) break;
}
Read the code

Wallet behaviour and data transmission

Static analysis documents value sorting by amount_usd (line 4445) and wallet/device telemetry including IP/location data and asset inventory (1938–2258). The code therefore prioritises assets by value and transmits information about the wallet and its environment.

Manual finding CR-01 describes the harmful mismatch: the page frames the action as verification or a claim while code requests broad permissions or direct asset transfers. The wallet branches are documented at 4678–5875; permission-related findings at 3525–3832 and 4529–4677. “Verification Error” appears as UI text at line 4816. The assessment relies on paths and context, not that word alone.

Telegram is a telemetry sink here, not evidence of a complete executing C2 server.

Addresses and services by role

The two configured target addresses below are separate from protocol addresses and services. Address and Receiver name the same value; chain configuration additionally specifies an execution-contract target. The manual audit statically traces the recipient/spender role into value-bearing paths.

Other wallet deep links, chain explorers, price and metadata services are referenced in the sample. They are not standalone malicious indicators. Public-IP lookup references api[.]ipify[.]org in normalized output, line 1950; the table presents representative services rather than every domain.

INDICATOR LEDGER

Indicators and attribution

The two configured target addresses below are separate from protocol addresses and services. Address and Receiver name the same value; chain configuration additionally specifies an execution-contract target. The manual audit statically traces the recipient/spender role into value-bearing paths. Other wallet deep links, chain explorers, price and metadata services are referenced in the sample. They are not standalone malicious indicators. Public-IP lookup references api[.]ipify[.]org in normalized output, line 1950; the table presents representative services rather than every domain.

wallet-1WalletStatic evidence, not live verified
0x3362B269946B8B244FF50cF07cc73f133279A21E
Role
Configured recipient/spender
Evidence
Configuration role statically evidenced; account type not checked on-chain.
Source
Normalized output, lines 134, 271, 284, 297, 310, 323, 358
Limit
No receipt of payment, ownership or current operation established.
wallet-2WalletStatic evidence, not live verified
0x55775D0D339D5B4146699a04fF49feEf8bc1Cff2
Role
Configured execution-contract target
Evidence
Configuration role statically evidenced; account type not checked on-chain.
Source
Normalized output, lines 232, 245, 258
Limit
No receipt of payment, ownership or current operation established.
domain-3TelemetryDefanged; not contacted
api[.]telegram[.]org
Role
telemetry service; bot credential and chat identifiers redacted
Evidence
Domain occurs in pinned source.
Source
Normalized output, lines 2044, 2099, 2138, 2187, 2232
Limit
Do not treat a legitimate service as a standalone malicious indicator. Paths and credentials redacted.
domain-4InfrastructureDefanged; not contacted
avatars[.]githubusercontent[.]com
Role
metadata icon asset
Evidence
Domain occurs in pinned source.
Source
Normalized output, lines 116
Limit
Do not treat a legitimate service as a standalone malicious indicator. Paths and credentials redacted.
domain-14InfrastructureDefanged; not contacted
ipapi[.]co
Role
IP/geolocation lookup
Evidence
Domain occurs in pinned source.
Source
Normalized output, lines 1954
Limit
Do not treat a legitimate service as a standalone malicious indicator. Paths and credentials redacted.
domain-22InfrastructureDefanged; not contacted
rpc[.]ankr[.]com
Role
blockchain RPC
Evidence
Domain occurs in pinned source.
Source
Normalized output, lines 123, 124, 125, 126, 127, 128, 130, 131, 132, 2503
Limit
Do not treat a legitimate service as a standalone malicious indicator. Paths and credentials redacted.
domain-25InfrastructureDefanged; not contacted
toys2025[.]netlify[.]app
Role
declared site metadata
Evidence
Domain occurs in pinned source.
Source
Normalized output, lines 115, 1633
Limit
Do not treat a legitimate service as a standalone malicious indicator. Paths and credentials redacted.
protocol-1InfrastructureStatic context
0x000000000022d473030f116ddee9f6b43ac78ba3
Role
Permit2 protocol address
Evidence
Configuration context, separate from recipient values.
Source
Normalized output, lines 3566, 4138
Limit
No evidence of operator control or payment receipts.

Why this is not a complete C2 reconstruction

In this copy, send_request is a local dispatcher (lines 1795–1858), not a complete HTTP C2 client. Forwarding certain signature data to an executing server is therefore incomplete. The original server source is missing.

Telegram is documented as a telemetry service; bot tokens and chat/user identifiers remain redacted. RPC endpoints and the declared metadata domain do not establish a complete operator backend.

What distinguishes this copy

String tables and opaque names are ordinary obfuscation. More informative is the combination of wallet-oriented behaviour, value sorting and telemetry with incomplete dependencies and missing server source.

This explains why a readable code copy and a fully observed system are not the same. It supports no claim about market position or actual victim losses.

Findings at a glance

  • Original and analysis output are separate artifacts.
  • Wallet and service roles are statically evidenced, not live verified.
  • The complete original server is not available.

Review limits

  • No Windows executable analysis, sample execution or wallet signing.
  • No on-chain verification of account type, ownership or losses.
  • No credentials, request bodies or functioning drainer sequences published.

Context, not evidence

The Evidence Anchor at the start identifies the binary, file or revision actually used. These links provide context and reported observations; they do not substitute for local sample analysis.

Final assessment

Conclusion

The browser functionality is evidenced. The original server is missing.

The pinned code supports classification as a browser-wallet drainer. Original/analysis pairs make selected transformations checkable. Recipient roles and telemetry are statically documented; payments, account types and current operation were not verified. Missing dependencies and the local dispatcher constrain reconstruction of the whole system.

Next steps

  • Retain source version and hashes when sharing findings.
  • Do not present static roles as payment receipts or operator identity.
Basis of this judgmentStatic review of pinned local sources only; no sample execution or contact with sample endpoints.
CryptoDrainEXE browser code and local static analysis tool
← All research audits

Start a conversation

Discuss your project.

Start a conversation