Jump to content

Login Server Packets


Guest swanyboy2

Recommended Posts

I plan to create an implementation of the Login Server in a different language than C++, however, I am not sure as to all of the packet contents. There are certain things I do know, like for example, after the first packet has been received from the game (containing the username, client IP, client language, ect.), the server might then send a packet with contents of [0x00, 0x00, 0x0C] which is determined by [CMD_AUTH_LOGIN_CHALLENGE(0x00), Unknown(0x00), WOW_FAIL_SUSPENDED(0x0C)] in an instance where the account is suspended. If the client receives such a packet, it knows to display the appropriate message of "your account has been suspended..."

That was an overly elaborate example of what I want to know. So could someone please explain to me what packets need to be sent after the first is received in an instance where it was successful (WOW_SUCCESS).

Link to comment
Share on other sites

So that has helped me alot. Especially after running the demo at http://srp.stanford.edu/demo/demo.html (requires Firefox). Now I think I am understanding it but I need some verification.

At line 451 in AuthSocket.cpp: BigNumber gmod = g.ModExp(b, N);

I believe it is the same as g^b % N, but I am not sure. Could anyone verify that this is true or false.

Link to comment
Share on other sites

Okay. So I have looked at the code in depth and have come to a confusing problem. It will be hard for me to compile my thoughts to be understood, but here it goes.

I see how all of the pieces fit together, mostly, the only thing I don't understand is the length of the HexStrings and BigNumbers. For example: databaseV is a 64-character hexString, that is taken from the database. You take that string and run v.SetHexStr(databaseV), which basically turns that hexString into a 64-digit BigNumber and makes v equal to it. Now, say you have that value, you then take it, multiply it by 3 add gmod(which is g^b % N) and take that mod N and set that whole value equal to B (B = ((v * 3) + gmod) % N;). So somehow, you take a 64-digit BigNumber and convert it into a 32-element byte array and append it to the packet (pkt.append(B.AsByteArray(32), 32);).

This is frustrating to me because I see many ways this could work, and still I believe all of them could be incorrect. Perhaps it takes all the digits as twos and puts them into hex values like consecutive digits of 15 would be turned into the byte 0x15. X_X

Someone shed some light on this. If no one helps me I am going to have to setup a server, compile it with extended output, telling me all the variables at any one time and I still believe that will bring me to alot of dead ends.

Link to comment
Share on other sites

Yeah. I am totally aware of how Hexadecimal works, I just didn't understand how it takes a String of consecutive hexadecimal pairs and produces arithmetic through them. I found a SRP ruby library which is simplifying this for me. So far it has proven to replicate the actions done in AuthSocket.cpp.

Link to comment
Share on other sites

Okay. So, now all I need to know is what m1, m2, and crc_hash is in the AUTH_LOGON_PROOF_C and AUTH_LOGON_PROOF_S structures/packets. I understand how the rest of the packet fits in yet I get extremely confused when I see if (!memcmp(M.AsByteArray(), lp.M1, 20)) (line 682) be the if line to verify if it is the correct password or not. The reason I am confused is because I thought the S variable was what needed to be compared. Someone please explain.

And on another note, I thought the S variable was also supposed to be 32 bytes long. The m1, m2, and M variables are all 20 bytes long. What is going on?

I think what I mostly need explanation of is how does the SHA1Hash class work entirely. I don't understand how it compounds each array and BigNumber into one value, if that is what it is doing. The sha variable used as arguments in SendProof is a composition based on all of the arrays and BigNumbers used as arguments in UpdateData() or UpdateBigNumbers() methods correct? Does the finalize method change the digest?

Link to comment
Share on other sites

In case anyone was wondering, I have completed this project. It works entirely. The only thing left for me to do is clean up the code, comment the code, and integrate it with rails or an alternative database. If anyone wants to see the source code, let me know. I will probably upload the code after those revisions.

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use