PES 2013 Private Server

izcarti

Non-League
Joined
24 July 2026
Location
Algeria
Bringing PES 2013 back online

I've spent the last while writing a replacement server from
scratch, and as of this week two clients have played a full Ranked match against
each other. Figured it was time to post something.

Where it's at

Working end to end: gate handshake, login, EULA, online menu, NAT discovery,
Quick Match 1v1 matchmaking, P2P connection between the two players, team select,
kickoff, and a full match. Last test ran 7 and a half minutes of actual gameplay
with about 26,500 P2P packets going back and forth. Pause and sync both fine.

Match results just went in but haven't been tested on a clean full-time finish
yet, so I'm not going to claim that one works until I've seen it.


What's left

Post match reporting (stats, ratings, playtime) is next - those commands only
fire on a normal full time finish so I've not seen them arrive yet. After that
it's persistence, so ratings and division actually stick between sessions, and
then friend lists and community stuff.

No public server yet. It's running on a box for testing and I want results and
persistence done before anyone else touches it.

 
What are the chances we get master league online for pes 2013 ? is ir even possible ?
Yes, got the rooms and friendly match working today, and I'm working on master league currently.
Good job!!! From what you're telling you're on a very early stage to release :) I think people will enjoy it even if it doesn't store any stat
its playable but i want to release like a stable release so everyone is happy, with multiple region servers and stuff and i may go open source who knows.
 
Is it possible to setup server on our own instead of joining another private server? 'Cause we'd like to setup our personal server just for ourselves and not like all the other multiplayer mods do including PES6 private servers.
 
sure, its going to be open source.
Very well, because everyone wants to host on their own for themselves since it only requires a basic setup and without needing to make account, something that other private servers won't let others host their own and instead they want everyone to signup on their servers and to give credentials for themselves (looking at you PES6.es requiring a valid serial key to join) as well as they can shut down their private servers or banned your account at anytime without warning.
 
Yes, got the rooms and friendly match working today, and I'm working on master league currently.

its playable but i want to release like a stable release so everyone is happy, with multiple region servers and stuff and i may go open source who knows.
MASTER LEAGUE ONLINE TOP😍😍😍😍😍😍
 
Very well, because everyone wants to host on their own for themselves since it only requires a basic setup and without needing to make account, something that other private servers won't let others host their own and instead they want everyone to signup on their servers and to give credentials for themselves (looking at you PES6.es requiring a valid serial key to join) as well as they can shut down their private servers or banned your account at anytime without warning.

For pes5 and 6 you can setup your own server, the idea of wanting a LAN based is unreal for this game because it's not provided by the game itself, unless you manage to write the whole scene for that, the hardest part of it is the stun server
 
So Ronaldo and Messi prime will take the place of Adriano pes 6 as the favorite player to play with online ?
 
Bringing PES 2013 back online

I've spent the last while writing a replacement server from
scratch, and as of this week two clients have played a full Ranked match against
each other. Figured it was time to post something.

Where it's at

Working end to end: gate handshake, login, EULA, online menu, NAT discovery,
Quick Match 1v1 matchmaking, P2P connection between the two players, team select,
kickoff, and a full match. Last test ran 7 and a half minutes of actual gameplay
with about 26,500 P2P packets going back and forth. Pause and sync both fine.

Match results just went in but haven't been tested on a clean full-time finish
yet, so I'm not going to claim that one works until I've seen it.


What's left

Post match reporting (stats, ratings, playtime) is next - those commands only
fire on a normal full time finish so I've not seen them arrive yet. After that
it's persistence, so ratings and division actually stick between sessions, and
then friend lists and community stuff.

No public server yet. It's running on a box for testing and I want results and
persistence done before anyone else touches it.



Bringing PES 2013 back online

I've spent the last while writing a replacement server from
scratch, and as of this week two clients have played a full Ranked match against
each other. Figured it was time to post something.

Where it's at

Working end to end: gate handshake, login, EULA, online menu, NAT discovery,
Quick Match 1v1 matchmaking, P2P connection between the two players, team select,
kickoff, and a full match. Last test ran 7 and a half minutes of actual gameplay
with about 26,500 P2P packets going back and forth. Pause and sync both fine.

Match results just went in but haven't been tested on a clean full-time finish
yet, so I'm not going to claim that one works until I've seen it.


What's left

Post match reporting (stats, ratings, playtime) is next - those commands only
fire on a normal full time finish so I've not seen them arrive yet. After that
it's persistence, so ratings and division actually stick between sessions, and
then friend lists and community stuff.

No public server yet. It's running on a box for testing and I want results and
persistence done before anyone else touches it.


Hi izcarti.

First off, congrats on getting PES 2013 online working end-to-end — that's an incredible achievement, and I imagine it took a huge amount of work.

I'm working on my own attempt at reviving PES 2013's online mode, mainly as a learning project. I've made solid progress on the network side: mapped all 4 domains (gate, info.service, ntl, STUN), confirmed the plaintext HTTP endpoints (info_mx.txt and GateInfo.php work fine with a simple stub server), and traced the gate connection on port 15010 down to a custom Blowfish implementation — found the P-array signature in the .exe, confirmed via hardware breakpoints in x64dbg that it initializes with the standard constants, and ruled out Windows CryptoAPI (confirmed via Frida hooks — CryptGenRandom gets called but never CryptImportKey/CryptHashData, so the network encryption isn't going through CryptoAPI).

Where I'm stuck: finding the actual secret key that gets mixed into the Blowfish key schedule. I'm currently tracing a custom memcpy-like function to find where it copies something other than the known constant tables, but it's slow going.

If you're willing to share anything about how you approached this part — even just confirming whether it's a static hardcoded key vs. something derived — it would save me a lot of time. Totally understand if you'd rather keep implementation details private, no pressure at all. Either way, thanks for inspiring this project.
 
Hi izcarti.

First off, congrats on getting PES 2013 online working end-to-end — that's an incredible achievement, and I imagine it took a huge amount of work.

I'm working on my own attempt at reviving PES 2013's online mode, mainly as a learning project. I've made solid progress on the network side: mapped all 4 domains (gate, info.service, ntl, STUN), confirmed the plaintext HTTP endpoints (info_mx.txt and GateInfo.php work fine with a simple stub server), and traced the gate connection on port 15010 down to a custom Blowfish implementation — found the P-array signature in the .exe, confirmed via hardware breakpoints in x64dbg that it initializes with the standard constants, and ruled out Windows CryptoAPI (confirmed via Frida hooks — CryptGenRandom gets called but never CryptImportKey/CryptHashData, so the network encryption isn't going through CryptoAPI).

Where I'm stuck: finding the actual secret key that gets mixed into the Blowfish key schedule. I'm currently tracing a custom memcpy-like function to find where it copies something other than the known constant tables, but it's slow going.

If you're willing to share anything about how you approached this part — even just confirming whether it's a static hardcoded key vs. something derived — it would save me a lot of time. Totally understand if you'd rather keep implementation details private, no pressure at all. Either way, thanks for inspiring this project.
d8 89 0a f0 66 c9 6b 40 d7 01 ae fc 43 6f f9 fe
c9 89 98 16 7a 74 48 3d 39 14 73 0c 5c 01 c0 3c
e2 8e 86 e5 89 c4 a1 85 f8 54 06 51 d2 ec a3 6b
5c 1a 40 ee c5 e9 da ae
hardcoded in the binary, Schedule pattern: 83 EC 08 53 55 56 BE 10 00 00 00 81 EE ?? ?? ?? ?? 57 8B F9. wire XOR over the whole frame: 5b 9f 2e 64. MD5 is over frame[0:8] + encrypted payload.
 
@Dinamico1023 @izcarti I've been working on my version too and I notice the games from 2010 up to 2013 (no idea from 2014, I believe and I hope its just a different protocol) used the kv protocol and also xor keys, and even better! they share almost all core commands for login, menu, lobby, match. So I have started working on something in C# that could help us get up the servers for the games between 2010 and 2013 pretty easy with a few specific cases for some commands, I will try to publish it between today and tomorrow, yet I couldn't get the room ready working as we talk before @izcarti but anyway, I made the code pretty good structured in a way that we could get this expanded pretty easy and clean code
 
d8 89 0a f0 66 c9 6b 40 d7 01 ae fc 43 6f f9 fe
c9 89 98 16 7a 74 48 3d 39 14 73 0c 5c 01 c0 3c
e2 8e 86 e5 89 c4 a1 85 f8 54 06 51 d2 ec a3 6b
5c 1a 40 ee c5 e9 da ae
hardcoded in the binary, Schedule pattern: 83 EC 08 53 55 56 BE 10 00 00 00 81 EE ?? ?? ?? ?? 57 8B F9. wire XOR over the whole frame: 5b 9f 2e 64. MD5 is over frame[0:8] + encrypted payload.
Quick update — the decryption works perfectly! I confirmed a full round-trip (decrypt then re-encrypt gives back the exact original packet byte-for-byte), and the plaintext for the first gate message decodes cleanly to rqid=1,timeout=20,svrtype="GATE",lang="MX",client="NETCLIENT",msg="CMD_GET_SVRLIST". Your key and the wire XOR are 100% correct.

One thing I couldn't reproduce: the 16-byte value embedded at the start of the decrypted payload (bytes 0-15). I tried MD5(packet[0:8] + ciphertext[16:]) as you described, plus every other 8-byte window of the raw wire bytes, the de-XORed ciphertext, and the plaintext, in both concatenation orders — none of them match the embedded value.

Could you clarify exactly what "frame[0:8]" refers to? Specifically:
  • Is it the first 8 bytes of the raw wire packet (post wire-XOR, as captured on the network), or something else (e.g. a session counter, a fixed protocol constant)?
  • Does "encrypted payload" mean the Blowfish ciphertext, or the plaintext before encryption?
  • Is there any additional data involved (e.g. a client/session ID not present in this specific packet)?
Happy to share my exact captured bytes if that helps you spot the discrepancy. Thanks again for the huge head start.
 
Quick update — the decryption works perfectly! I confirmed a full round-trip (decrypt then re-encrypt gives back the exact original packet byte-for-byte), and the plaintext for the first gate message decodes cleanly to rqid=1,timeout=20,svrtype="GATE",lang="MX",client="NETCLIENT",msg="CMD_GET_SVRLIST". Your key and the wire XOR are 100% correct.

One thing I couldn't reproduce: the 16-byte value embedded at the start of the decrypted payload (bytes 0-15). I tried MD5(packet[0:8] + ciphertext[16:]) as you described, plus every other 8-byte window of the raw wire bytes, the de-XORed ciphertext, and the plaintext, in both concatenation orders — none of them match the embedded value.

Could you clarify exactly what "frame[0:8]" refers to? Specifically:
  • Is it the first 8 bytes of the raw wire packet (post wire-XOR, as captured on the network), or something else (e.g. a session counter, a fixed protocol constant)?
  • Does "encrypted payload" mean the Blowfish ciphertext, or the plaintext before encryption?
  • Is there any additional data involved (e.g. a client/session ID not present in this specific packet)?
Happy to share my exact captured bytes if that helps you spot the discrepancy. Thanks again for the huge head start.

Code:
/// <summary>
/// Outer packet framing.
/// <code>
/// [2]  packet id      big-endian uint16
/// [2]  data length     big-endian uint16
/// [4]  packet counter  big-endian uint32
/// [16] MD5             over (id|length|counter) + data
/// [N]  data
/// </code>
/// Whole frame is XOR-encrypted with the keystream aligned to the frame start.
/// </summary>

hope it helps
 
Code:
/// <summary>
/// Outer packet framing.
/// <code>
/// [2]  packet id      big-endian uint16
/// [2]  data length     big-endian uint16
/// [4]  packet counter  big-endian uint32
/// [16] MD5             over (id|length|counter) + data
/// [N]  data
/// </code>
/// Whole frame is XOR-encrypted with the keystream aligned to the frame start.
/// </summary>

hope it helps
Quick update: the framing/crypto is 100% solid now (MD5 validates, full round-trip works). But when I send a response to CMD_GET_SVRLIST (rqid=1,result=0,svrlist=""), the game just sits there and times out at the exact same ~91s mark as if no response was sent at all — no RST, no error change, nothing. Feels like the response is being silently discarded at the app layer, likely because it's missing an expected msg= field identifying the response type. Do you know the exact expected response format/schema for CMD_GET_SVRLIST (or any other command)? Even just the response's msg value would help a ton.
 
Here is what was done since last post i made:

MATCH & RATING:

[+] Full ranked match recording. Every finished match is written with both
sides, teams, score, how it ended, region and timestamps.
[+] Live rating ladder. Win, draw and loss each move the rating by a configured
amount, and points accumulate alongside it.
[+] Divisions D5 to D1, awarded from where the rating lands.
[+] Six skill levels from Beginner to Superstar, following the rating.
[+] Full career record: matches, wins, draws, losses, goals for and against,
current win streak and best win streak ever.
[+] Disconnect handling. A player who leaves forfeits, and the side that stayed
is credited with the win.
[+] Fair play counter. The commendation given at the end of a match is stored
and shown on the player card.
[+] Placement ratings. The rating a player carried out of each of their first
five ranked matches is kept, which is what the game reads while a new
player's rating is still settling.
[+] Skill based matchmaking. Players are paired by the level the client
reports.
[+] Match history per player, and a distinct opponent list.


PROFILE & SETTINGS:
[+] Avatars. Upload, storage and delivery, with size and checksum validation.
[+] Manner grade, sent as the nested record the game reads, carrying fair play
count, manner rating and disconnect rate together.
[+] Nickname tags. Fifty tags in the database, unlockable per account, with the
three the game ships with available from the start.
[+] Player card: birthday, country, area, favourite team, favourite player and
intro text.
[+] Global rank, counted live from the rating ladder.
[+] Chat preference per account.
[+] Profile caching with automatic invalidation on every write, so a result
screen always shows the rating from the match that just ended.


ROOMS & LOBBIES:
[+] Four blocks, each with its own lobbies, named the way Konami numbered them
[+] Room creation, joining, leaving and readiness tracking.
[+] Host migration.
[+] Live room list. Rooms and players appear and disappear as they happen,
without needing a screen refresh.
[+] Live player lists inside a room, updated on join and leave.
[+] Region population counts, published every ten seconds, including honest
numbers for regions this machine does not serve.
[+] Lobby match list.


PEER TO PEER:
[+] Full P2P handshake between matched players: host address, reflexive address
and NAT type exchanged both ways.
[+] STUN server on three ports for NAT discovery.
[+] Relay addressing for players who cannot connect directly.
[+] Network quality grading with green, yellow and red thresholds, feeding the
input delay the game picks.


COMMUNITIES:
[+] Create, join, withdraw, delete.
[+] Owner controls: kick a member, set the description, set a password, set how
far the community card opens.
[+] Community browser with keyword and language search, paged.
[+] Community card with the full member roster and who is online.
[+] Joined community list and a default community per player.
[+] Removal notice. A member removed by an owner is told once, the next time
they connect.
[+] Community mode presence, so the server knows who is in the community
section.


FRIENDS & SOCIAL:
[+] Friend list with online state.
[+] Friend requests.
[+] Block list.
[+] Widget matchmaking from the pop-out panel, sharing the same queue as the
main menu.
[+] Recently played opponents list.


ANNOUNCEMENTS & CONTENT:
[+] Pre-login and post-login announcement screens, each targetable separately
from the portal.
[+] Information screen, filterable by language.
[+] Welcome message, licence text and top menu announcements.
[+] Broadcast to everyone currently online.
[+] Data pack and patch version reporting.


MASTER LEAGUE ONLINE:
[+] Team creation with name, short name and base team.
[+] Squad storage and player ratings.
[+] Team funds, power and resources.
[+] Master League record: matches, wins, draws, losses, goals, streaks.
[+] Game plan storage.


ADMIN PORTAL:
[+] Account management.
[+] Announcement and information publishing.
[+] Team and squad data.
[+] Nickname tag management.


INFRASTRUCTURE:
[+] Single configuration file covering both deployment and game values.
[+] Panic isolation. A fault in one session cannot disconnect anyone else.
[+] Full request and response logging with the fields each command carried.
[+] Multi region ready: shared accounts and ladder, isolated play per region.


 
@izcarti first of all congrats m8
i've spent quite sometime trying to do what you did in i dont know how much
as a SWE myself i'd really love it if the code you made was open sourced (please !)
and still congrats, i've seen the videos , really really incredible work
 
Back
Top Bottom