[Release] MUnique OpenMU ChatServer

Joined
Aug 6, 2005
Messages
552
Reaction score
298
Hello,
today I release a first version of the chat server as a result of my http://forum.ragezone.com/f508/chatserver-protocol-research-1127561/.
This is an open source alternative to the original ChatServer of Webzen which uses the OpenMU chat server code and connects to a 'classic' ExDB server.

Important (see also Readme):
To get this working correctly, the XOR32-key needs to match with your game server / game client. This key is usually used by the client to encrypt all data packets which are sent to the server. The chat server uses this key as well to decrypt incoming data packets.

It should at least work up until season 6 - I don't know how the encryption of C1/C2 changed on higher seasons. Some people got it working with IGCN Season 9, though.
It does probably not work correctly when you use the eDataServer - the sources I checked didn't implement the protocol like the ExDB-Server of Webzen. However, with the available documentation, it shouldn't be that hard to add


Source and Documentation:
Compiled Binaries:
Required .NET-Version: 4.6.1

If you find a bug (and you're sure it's one) or have suggestions for improvements please add an issue on GitHub
Of course, you can report me bugs etc. here as well, if you don't like to create a GitHub account.
 
Last edited:
Joined
Aug 6, 2005
Messages
552
Reaction score
298
Thanks for your feedback! At the moment I can't tell you what's going wrong. It seems like the server lacks some error handling...
I added a new version (v0.1.1-alpha) which will log these errors with the required details (check binary link in first post).
 
Joined
Aug 29, 2011
Messages
512
Reaction score
33
It shows the two being online but does not open Chat.


 
Joined
Aug 29, 2011
Messages
512
Reaction score
33
I do not know if I need to do some correction in the Zteam source but I tested it on the muserver Zteam season 8 and it did not work.




In MUEMU muserver does not even open the chat screen I do not know if the Xor32Kays are certain to work with it. Could someone please give me the Xor Key of the muemu ??
 
Last edited:
Joined
Aug 6, 2005
Messages
552
Reaction score
298
Well, I don't know if it would work at season 8. Which packet encryption (S->C, C1 type) does it use? Already with packet twister or just the XOR32 key?
If packet twister, then it doesn't work yet.
 
Newbie Spellweaver
Joined
Jun 26, 2007
Messages
95
Reaction score
10
Strangely, it does not convey the character's name completely, for which EXDB is created, duplicates the characters in the Characters table with any symbols.

I use different versions of servers mu online, screenshots below with a duplicate.


 
Last edited:
Joined
Aug 6, 2005
Messages
552
Reaction score
298
Strangely, it does not convey the character's name completely, for which EXDB is created, duplicates the characters in the Characters table with any symbols.
Are you using an non-english client/server and character names with special symbols?
Maybe it's an encoding issue... currently the server just uses UTF-8 character encoding.
 
Joined
Jun 12, 2005
Messages
746
Reaction score
69
Hi, i'm using s6e3 and trying to capture packages using these guide http://forum.ragezone.com/f508/munique-openmu-source-server-project-1141294/#post8838707 so i can find xor keys but when i'm clicking to "chat" in detaserver i get erro "error-L1: ChatServer not
found.
For capture packages i use wpe pro.

Some pictures:




Can anyone help?
 
Last edited:
Joined
Aug 29, 2011
Messages
512
Reaction score
33
If it's using SimpleModulus and Xor32, there is a chance... otherwise not

Where can I find xorkey in IGCN source? and what would SimpleModulus be?


I researched and found this, would it be the xrokey ??

PHP:
unsigned char XorTable[10]={0xA1, 0xB2, 0xAA, 0x12, 0x23, 0xF1, 0xF3, 0xD3, 0x78, 0x02}; // For some reason this is 16






PHP:
bool XorData(int iStart, int iEnd, int iDir)	// Good
	{
		if ( iStart < iEnd  )
		{
			g_Log.AddC(TColor::Red,  "CStreamPacketEngine XorData Error %d,%d", iStart, iEnd);
			return false;
		}

		unsigned char byXorFilter[32];

		byXorFilter[0] = 0xAB;
		byXorFilter[1] = 0x11;
		byXorFilter[2] = 0xCD;
		byXorFilter[3] = 0xFE;
		byXorFilter[4] = 0x18;
		byXorFilter[5] = 0x23;
		byXorFilter[6] = 0xC5;
		byXorFilter[7] = 0xA3;
		byXorFilter[8] = 0xCA;
		byXorFilter[9] = 0x33;
		byXorFilter[10] = 0xC1;
		byXorFilter[11] = 0xCC;
		byXorFilter[12] = 0x66;
		byXorFilter[13] = 0x67;
		byXorFilter[14] = 0x21;
		byXorFilter[15] = 0xF3;
		byXorFilter[16] = 0x32;
		byXorFilter[17] = 0x12;
		byXorFilter[18] = 0x15;
		byXorFilter[19] = 0x35;
		byXorFilter[20] = 0x29;
		byXorFilter[21] = 0xFF;
		byXorFilter[22] = 0xFE;
		byXorFilter[23] = 0x1D;
		byXorFilter[24] = 0x44;
		byXorFilter[25] = 0xEF;
		byXorFilter[26] = 0xCD;
		byXorFilter[27] = 0x41;
		byXorFilter[28] = 0x26;
		byXorFilter[29] = 0x3C;
		byXorFilter[30] = 0x4E;
		byXorFilter[31] = 0x4D;

		for ( int i = iStart ; i != iEnd ; i+=iDir )
		{
			this->m_byBuffer[i] ^= this->m_byBuffer[i-1] ^ byXorFilter[ i%32 ];
		}
		return true;
	}

public:






PHP:
BOOL ExtractPacket(void* pTar)	// Good
	{
		WORD wSize;
		BYTE byXorFilter[32];

		BYTE byTemp[2048];

		

		switch ( this->m_byBuffer[0] )
		{
			case 0xC1:
			case 0xC3:
				wSize = this->m_byBuffer[1];
				break;

			case 0xC2:
			case 0xC4:
				wSize = this->m_byBuffer[1] * 256 + this->m_byBuffer[2];
				break;

			default:
				return true;
				break;
		}

		if ( this->m_wSize < wSize )
		{
			return 2;
		}

		byXorFilter[0] = 0xAB;
		byXorFilter[1] = 0x11;
		byXorFilter[2] = 0xCD;
		byXorFilter[3] = 0xFE;
		byXorFilter[4] = 0x18;
		byXorFilter[5] = 0x23;
		byXorFilter[6] = 0xC5;
		byXorFilter[7] = 0xA3;
		byXorFilter[8] = 0xCA;
		byXorFilter[9] = 0x33;
		byXorFilter[10] = 0xC1;
		byXorFilter[11] = 0xCC;
		byXorFilter[12] = 0x66;
		byXorFilter[13] = 0x67;
		byXorFilter[14] = 0x21;
		byXorFilter[15] = 0xF3;
		byXorFilter[16] = 0x32;
		byXorFilter[17] = 0x12;
		byXorFilter[18] = 0x15;
		byXorFilter[19] = 0x35;
		byXorFilter[20] = 0x29;
		byXorFilter[21] = 0xFF;
		byXorFilter[22] = 0xFE;
		byXorFilter[23] = 0x1D;
		byXorFilter[24] = 0x44;
		byXorFilter[25] = 0xEF;
		byXorFilter[26] = 0xCD;
		byXorFilter[27] = 0x41;
		byXorFilter[28] = 0x26;
		byXorFilter[29] = 0x3C;
		byXorFilter[30] = 0x4E;
		byXorFilter[31] = 0x4D;

#ifndef EMU_NOCRYPT
 
Last edited:
Joined
Aug 6, 2005
Messages
552
Reaction score
298
It's the byXorFilter

And I think that's also the default one

I think the igcn also just uses SimpleModulus as the PacketTwister usage was commented out. I just don't know if they use default keys, too.
Then there is also the question if the ExDb Server is using the same protocol...