₿ datchecker datchecker Before you buy Anatomy Credits GitHub ↗ 9,518 files dissected · 0 recoverable
forensic autopsies · fully reproducible

Anatomy of a fake wallet.dat

How the “lost wallets” of the cracking packs are manufactured — and how every fabrication signal is detected, one by one.

1,396 unique specimens mkey layout: custom-iv reproducible with wallet_forensic.py

1 · The container: a genuine Berkeley DB

The box is real. That says nothing about what was packed into it.

A Bitcoin Core wallet.dat is a Berkeley DB database (Hash or Btree). The manufacturers use the same container — which is why file reports “Berkeley DB (Btree, version 9, little-endian)” and why these files feel genuine at first touch. But the container format says nothing about the origin of the content. Inside live the same record types Core would write: version, minversion, flags, mkey, key/ckey (the keys), keymeta (metadata), pool (keypool), tx, name, defaultkey, bestblock, hdchain

2 · The counterfeiter's signature: the custom mkey

One swapped field layout makes every password useless — by construction.

When it encrypts a wallet, Core writes the master key (mkey) in one fixed layout. Every encrypted BTC file in this corpus — 1,219 of 1,219 — uses another one:

genuine Bitcoin Core mkey                        salt[8] + key[32] + iters + method
08 [salt · 8]   20 [encrypted key · 32]   [iters · u32]   [method · u32]   00 [params]

counterfeiter tooling (this corpus: 1,219 / 1,219)   IV[16] + key[32] + salt[8] + 0 + iters
30 [IV 16 + encrypted key 32]   08 [salt · 8]   00000000   [iters · u32]   00
                                   ↑ Core misreads: “salt” = 48 B, “key” = 8 B, iters = 0
                                     → decryption impossible, password correct or not

It is the layout of a purpose-built tool: an explicit IV, then the key, then the salt at the end. Bitcoin Core, reading it, takes 48 bytes as the “salt”, 8 as the “key” and 0 as the iteration count: decryption is impossible even if you guess the password. The file only “works” as a hashcat/John hash — which is exactly what the seller attaches (.hash, PasswordHash.txt, wallet.hash).

Practical consequence: any pack whose attached hint hash matches a custom mkey is a challenge file, not a wallet. The bit-for-bit match between the attached hash and the file's custom mkey — verified across the corpus — proves that hints and wallets left the same assembly line.

3 · The dates that betray the factory

Every key carries its birth date in keymeta. Labels can be faked; time cannot.

An authentic 2011 wallet may well have been opened with a modern Core — that updates its version record — but it cannot regenerate its entire keypool with 2020 dates without having been rebuilt.

4 · Mass production: shared keypools

“Unique” wallets that share addresses, iteration counts — even one default key.

specimen: samples/synthetic-86__a8b8fe3afe_17.dat — custom-iv mkey; embeds 3 active third-party addresses (~3.74 BTC today) — not yours.

5 · The bait: real addresses belonging to third parties

Embed funded addresses copied from the chain. The money stays where it was.

The most effective trick in the “premium” packs (folders with a date + a balance): choose real Bitcoin addresses with a real balance — mostly P2PK mining-pool payouts from 2013-2015, whose pubkeys are public on the chain — and embed them as defaultkey/ckey in a rebuilt wallet.

specimen: samples/dated-reconstruction__90e3045c33_36.04910000.dat — the name promises 36.0491 BTC; the address belongs to a third party.

6 · The props

Every “premium” wallet ships with its costume.

Password-Hints.txt with marketing copy (“American OTC trader… still receives whale alerts”), pywallet dumps, hashcat-ready hashes — and sometimes genuinely old imported transactions (2012, uncompressed P2PK) to give the tx record historical texture. The repo's data/seller_evidence/ folder preserves the originals verbatim.

7 · And when they don't even bother: non-BDB fakes

A “19,414 BTC Electrum wallet” that is a text file, and a JSON dump with a wallet's name.

specimen: samples/bait-electrum-19414BTC__base64.txt.dat — 1.8 MB of base64 text with a price tag.

Moral: the pack invoices every format a buyer might recognize by name.

Addendum — the careless fillers: the padding also includes unencrypted wallets of dead altcoins (Primecoin, BBQCoin, Namecoin, old Litecoin…): readable today, networks mostly dead, coins worth cents. Class altcoin-plaintextsamples/altcoin-plaintext__8e799e84df_wallet2.dat

8 · The quick checklist

Five rows that separate an authentic wallet from a pack file.

signalauthenticpack
mkey layout08 salt + 20 key ✓custom with IV ✗
Opens in Bitcoin Core with the right passworddecryptserror / garbage
keymeta vs the claimed agecoherentbursts 2019-2021
Addresses with on-chain lifeowner's ownthird-party (pools) or virgin
Seller hints/hashes attachedusually absentalways present

Open a file right now

Is your file not in the database but shows these signals? Report it on GitHub — this database grows from reports. GitHub issues →