A snapshot of every file Blizzard's classic-games login servers serve over BNFTP - the
unauthenticated Battle.net File Transfer protocol - captured by live-probing *.battle.net:6112
in 2026.
BNFTP is protocol selector 0x02: you open a TCP connection to a Battle.net server, send 0x02,
then a file request, and the server streams the file back. No account, no CD-key, no
authentication. It's how the classic client fetches its version-check module, anti-cheat
modules, the gateway list, channel icons, and the ToS. Everything here is what came back.
Captured with our clientless BNFTP client (bnftp-probe) while reverse-engineering the classic
Battle.net protocol. The protocol details - selectors, request/reply framing, the file namespace,
and what's still live vs. retired - are in BNETDOCS-REFERENCE.md.
Integrity hashes for every file are in SHA256SUMS.
These files are the ground truth for anyone implementing a classic-Battle.net-compatible server (PvPGN-style), studying the version-check / anti-cheat handshake, or preserving the classic Battle.net platform. They're served publicly and unauthenticated by Blizzard's own servers; this is a stable, hash-verified copy so you don't have to re-probe live infrastructure to get them.
All files are under files/.
The MPQs Blizzard sends to run CheckRevision - the client hashes game files against a formula
and returns a checksum + version. The server names one of the ver-* stubs in its challenge.
| file | game |
|---|---|
CheckRevision.mpq |
Diablo II |
CheckRevisionD1.mpq |
Diablo I |
ver-IX86-0...ver-IX86-7.mpq |
version stubs, Windows (x86), indices 0-7 |
ver-PMAC-0.mpq / ver-XMAC-0.mpq / ver-OSXI-0.mpq |
version stubs, PowerPC / Intel Mac / OSX-Intel |
Blizzard's per-session anti-cheat ("Warden"-lineage) modules - the server picks one of ~20 by
index each login. lockdown is the Windows family; psistorm is the Mac family.
| family | platform | files |
|---|---|---|
lockdown-IX86-00...19.mpq |
Windows (x86) | 20 |
psistorm-PMAC-00...19.mpq |
PowerPC Mac | 20 |
psistorm-XMAC-00...19.mpq |
Intel Mac | 20 |
The patch/update MPQs the server offers per product x platform (the _1xx_114d / _108_109
suffix is the version range they bridge).
| product | meaning | platforms present |
|---|---|---|
D2DV_*_1xx_114d.mpq |
Diablo II | IX86, XMAC |
D2XP_*_1xx_114d.mpq |
Diablo II: Lord of Destruction | IX86, XMAC |
DRTL_*_108_109.mpq |
Diablo I (retail) | IX86, PMAC |
DSHR_*_108_109.mpq |
Diablo I (shareware) | IX86, PMAC |
| file | what |
|---|---|
bnserver.ini, bnserver-D2DV.ini, bnserver-connect-forever.ini |
gateway/server lists (region -> hostname/zone) |
icons.bni, icons_STAR.bni, icons_SEXP.bni |
channel/user icon packs |
tos*.txt |
Terms of Service, 9 languages (USA, BRA, DEU, ESP, FRA, ITA, JPN, POL, default) |
Two reference docs cover the historical patch installers (a separate distribution channel from BNFTP) and the debug metadata pulled out of them:
PATCHES.md- Blizzard's live public download server for every released D2 patch installer (D2Patch_*/LODPatch_*), with the full map of which versions resolve.VERSION-RESOURCES.md- what each binary's VS_VERSIONINFO says about itself: exact build numbers per patch, and the internal project names the filenames lostPDB-GUIDS.md- per-version PDB / debug GUIDs for the D2 binaries, extracted from the MPQ payload inside those installers (no debugger needed).
cd files && shasum -a 256 -c ../SHA256SUMSProduct 4CCs probed - dead / no BNFTP patch:
- DIAB (Diablo 1 beta), DTST (Diablo 1 stress), D2ST (Diablo 2 stress), W3DM (WC3 demo): server holds silent / retired
- StarCraft / Brood War / WarCraft II (STAR/SEXP/W2BN): connect + auth work, but their version-check returns 0x102 = no BNFTP game patch served
- WAR3 / W3XP: NLS-auth only, so the MPQ-name oracle cannot enumerate them (not old-SID)
- No undocumented legacy 4CCs (BNET/TEST/BETA/BLIZ/ADMN/RATS/...): all dead
Filenames probed - confirmed absent (0-byte / not hosted):
- IX86ExtraWork.mpq, any Warden / scan.dll module (the 1.14 anti-cheat file the client references is not on BNFTP)
- news / ad / version text
- any .pdb or debug symbol
- path traversal (../, absolute paths): all return 0 bytes
- ToS beyond the 9 present: no KOR/CHN/TWN/GBR/RUS (exactly the official D2 localizations)
Host-specific gaps - connect-forever.classic.blizzard.com (the parked global gateway) omits: CheckRevision.mpq (D2), D2 _1xx_114d patches, psistorm-XMAC / psistorm-IX86, lockdown-XMAC/PMAC, ver-*-1..7, icons_STAR/SEXP. It serves the Diablo-1 + PowerPC-Mac set instead.
Protocol selectors probed - dead / gated:
- 0x03 Telnet chat: retired, silent
- 0x04 MCP, 0x06 interserver, 0x81: silent hold, IP-gated
The files under files/ are re-fetched automatically every 6 hours by a multi-source
Kubernetes poller (d2-bnftp-poller, source in poller/). It builds the
d2-clientless BNFTP client and fetches every entry in
fetch-list from the live Battle.net gateways, compares them, and commits only
when something actually changed. It runs as a 3-shard DAG (one pod per node, so three distinct
egress IPs) fetching (file, source) pairs in parallel; a coordinator then compares, places, and
pushes.
Each classic gateway is probed as its own source so per-region differences surface:
| source | host | what it is |
|---|---|---|
useast |
useast.battle.net | US-East named classic gateway (product D2XP) |
uswest |
uswest.battle.net | US-West named classic gateway |
asia |
asia.battle.net | Asia named classic gateway |
europe |
europe.battle.net | Europe named classic gateway |
vegas |
158.115.218.65 / .77 / .106 | raw IP pool the live classic gateways answer from (see below) |
forever |
connect-forever.classic.blizzard.com | the parked "connect forever" gateway; serves the Diablo-1 + PowerPC-Mac legacy set |
About vegas. The four named regional hostnames all resolve into a single block of IPs in a
Las Vegas datacenter (158.115.218.x): classic Battle.net has been consolidated onto one set of
gateways rather than genuinely separate per-region servers. We include those raw IPs as their own
source and connect to them directly, bypassing the regional DNS names, to check whether the raw
gateway serves anything different from what the named *.battle.net entries return. In practice the
game files match across all of them; the region-specific bnserver.ini and the localized tos*.txt
are where the gateways actually differ.
To have the archive track another file, add a line to fetch-list:
<class> <filename>. Filenames may contain spaces (e.g. Diablo II.pdb); blank lines and lines
starting with # are ignored. The class picks how it is fetched:
d2- fetch from all five D2 gateways and compare. Byte-identical across all five -> canonicalfiles/<filename>; any difference -> per-sourcefiles/<source>/<filename>. Use this for files you expect Blizzard to serve.forever- fetch only fromconnect-forever...; always written tofiles/forever/<filename>. For the Diablo-1 / PowerPC-Mac legacy set.probe- a speculative existence check: fetched from all five gateways, single attempt each, no retry. Most probes miss and cost almost nothing (fetches are paced to stay gentle). A hit on even one gateway is committed and flagged - they only need to leak a file on a single realm for us to catch it. The list already carries a large batch of candidate debug-symbol names (*.pdb/*.map/*.symfor every D2 module) on the off chance Blizzard ever exposes them.
The next scheduled run (every 6 hours) - or a manual trigger - picks up the new line. SHA256SUMS
is regenerated recursively over files/**, so a diff there is the diff of the archive.
FILETIMES.txt records Blizzard's own reported last-write time (the FILETIME in the BNFTP reply
header) for every archived file. A run with no changes commits nothing; either way it streams a
summary - committed changes, new/resolved cross-realm divergences, probe hits, and any errors - to
a Discord webhook.
These files are Blizzard Entertainment's, retrieved verbatim from Blizzard's own public,
unauthenticated BNFTP servers (*.battle.net:6112, protocol 0x02). They are mirrored here for
preservation, research, and classic-Battle.net-server interoperability. No files were modified. All
trademarks and copyrights belong to Blizzard Entertainment; this archive is not affiliated with or
endorsed by Blizzard. If you are a rights holder and want something removed, open an issue.