LivelyIM: MSNP 2+ server written in Go

LivelyIM

Cross-platform, easy to setup, open source*, MSNP 2+ server written in Go. Licensed under LGPL
* Will be after a proper way to manage it and some better code commenting


Background

So my last attempt at an MSNP server flopped pretty hard, the code got very messy, it was poorly architectured and structured, so implementing the planned MSNP 2-7 versions wasn’t viable. This time I implemented forwards rather than backwards! Well, sort of… Going from MSNP4 to 2,3 and then 5,6,7, quite an interesting journey I’d say

Now with this server, I plan (for now atleast) to only reach MSNP9, as after MSNP10, it’s ABCH hell (maybe I will gain some interest in dealing with the best design Microsoft could come up???)

MSN 4.7.0105 under MSNP7:

Same client version talking to a contact using MSN3.6:


Baggage carried over

  1. Access tokens

If you saw my previous post, you will probably remember my idea of an access token system. It has been implemented in this server. Basically, instead of reducing the security of your account by allowing login with MD5/CTP (and as such storing the password in plain text), you use tokens instead of the password that can be easily revoked.

  1. Restoring p2p services

The previous server had a niche feature of being able to force p2p features over a VPN service like Radmin or Hamachi. This was possible due to a custom patcher and some MSG payload tampering. This feature will come back, but currently there is no patcher implemented, so it will have to wait for that. And as previously mentioned, I will probably add a relay system so you don’t have to deal with VPNs or port-forwarding (although this is going to be hard with load balancing :frowning:)

  1. Accuracy

While I did say that the previous server focused on accuracy, I was just being optimistic, the behaviour it had was far from the original Microsoft servers. This one is a little bit better, but still not 100% accurate, and more importantly, not as strict when it comes to the protocol syntax. Accuracy was aimed for where it was feasable and not a pain in the ass :stuck_out_tongue:


Why Go?

I decided to use Go this time since I started learning and wanted to do a major project to help me cross over the finish line. Since I have been a C#/Java developer for over 5 years at this point, I decided to try and spice it up and use something else, and Go is also perfect for server side software due to it’s amazing concurrency, and low resource footprint
image


Current state

The current state of the project (as of 1.6.2025) is as follows:

  • MSNP 2 thru 7 fully implemented (all commands do as expected, or have convincing enough placeholders, mostly FND, SDC, SND, URL etc)
  • Fully secure password storage using bcrypt
  • A token system to not expose your passwords to clients using MD5/CTP
  • Easy to setup, just generate the HTTPS certificates and run
  • Proper privacy, your nickname is hidden by your privacy settings, logs do not show MSG payload contents (although anyone who forks the code can easily change this, so don’t rely on it!!!, and also the messages go thru the server un-encrypted, an unfortunate limitation of MSNP)

The code is currently not open sourced nor hosted publicly, read the top of the post for more information

In the works and planned:

  • MSNP 8 and 9
  • A website, even a basic one should suffice
  • A patcher utility, for easier patching of clients and restoring more features (to also allow the mentioned p2p proxying)
  • Emulating pager devices (via a virtual contact or maybe the website)
  • Emulating hotmail services from the era

Let me know if you have any questions or suggestions! :heart:

3 Likes

Update

I was able to get MSNP8 and 9 working properly
I also changed the database to use bcrypt instead of Argon2id for better performance

Windows Messenger 4.7.0105 (MSNP7) talking to MSN Messenger 6.0.0602 (MSNP9):

Where’s the code?

I have decided to post pone it till a website to manage the server and accounts is made, as currently, I don’t feel too proud to share code that requires you to hardcode the accounts you want to use in the build, or manually edit the database entries

2 Likes

Discord Server

I have made an official Discord server for news and updates, and general talk about the project, which you can join below. Here you can also always find me, as I don’t frequent forums very often

1 Like