Jump to content
  • 0

About Login Packet


Thejuster

Question


  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  28
  • Reputation:   28
  • Joined:  09/16/18
  • Last Seen:  

Hello i try to make a discord bot whit potential feature.

 

One my problem is try to connection in rAthena Server.
Actually i use c#

 

my code

 

//Setting
            Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint host = new IPEndPoint(ip, 6900);

            soc.Connect(host);

            //Static Packet
            byte packet = 0x64;
            byte[] id = Encoding.ASCII.GetBytes("Thejuster");
            byte[] pass = Encoding.ASCII.GetBytes("123456789");

            //Packet Builder
            List<byte> pacchetto = new List<byte>();

            //Assembly packet
            pacchetto.Add(0x64);
            foreach(byte b in id)
            {
                pacchetto.Add(b);
            }
           
            foreach(byte b in pass)
            {
                pacchetto.Add(b);
            }

            //Send full pachet
            soc.Send(pacchetto.ToArray());

 

When i try to connect, rAthena Login Server say this:

 

Cattura.JPG.afcb77c3b6e44722e954a62638d64765.JPG

 

anyone know reason of this problem?

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 1

  • Group:  Members
  • Topic Count:  53
  • Topics Per Day:  0.01
  • Content Count:  411
  • Reputation:   260
  • Joined:  04/25/12
  • Last Seen:  

Link to comment
Share on other sites

  • 1

  • Group:  Developer
  • Topic Count:  36
  • Topics Per Day:  0.01
  • Content Count:  587
  • Reputation:   431
  • Joined:  01/26/16
  • Last Seen:  

Structure padding screwed you up there

 

edit:

Add Pack = 1 to the StructLayout attribute and change version to uint since ulong is 64 bit integer (8 bytes)

Edited by Secrets
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  1
  • Topics Per Day:  0.00
  • Content Count:  37
  • Reputation:   19
  • Joined:  03/28/17
  • Last Seen:  

https://github.com/rathena/rathena/blob/master/src/login/loginclif.cpp#L273

0064 <version>.L <username>.24B <password>.24B <clienttype>.B

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  28
  • Reputation:   28
  • Joined:  09/16/18
  • Last Seen:  

Tanks  jchcc i miss Last param hehe .

Clienttype 

But one question.

.L  .24b .B is?

 

Edited by Thejuster
Link to comment
Share on other sites

  • 0

  • Group:  Developer
  • Topic Count:  36
  • Topics Per Day:  0.01
  • Content Count:  587
  • Reputation:   431
  • Joined:  01/26/16
  • Last Seen:  

The packet ID (0x64) should be a ushort instead of byte.

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  28
  • Reputation:   28
  • Joined:  09/16/18
  • Last Seen:  

Tanks Zell i try whit this example.

First step is done but server cant read my username or password send

in src/loginclif.cpp

 

function

 

/**
 * Received a connection request.
 * @param fd: file descriptor to parse from (client)
 * @param sd: client session
 * @param command: packet type sent
 * @param ip: ipv4 address (client)
 *  S 0064 <version>.L <username>.24B <password>.24B <clienttype>.B
 *  S 0277 <version>.L <username>.24B <password>.24B <clienttype>.B <ip address>.16B <adapter address>.13B
 *  S 02b0 <version>.L <username>.24B <password>.24B <clienttype>.B <ip address>.16B <adapter address>.13B <g_isGravityID>.B
 *  S 01dd <version>.L <username>.24B <password hash>.16B <clienttype>.B
 *  S 01fa <version>.L <username>.24B <password hash>.16B <clienttype>.B <?>.B(index of the connection in the clientinfo file (+10 if the command-line contains "pc"))
 *  S 027c <version>.L <username>.24B <password hash>.16B <clienttype>.B <?>.13B(junk)
 *  S 0825 <packetsize>.W <version>.L <clienttype>.B <userid>.24B <password>.27B <mac>.17B <ip>.15B <token>.(packetsize - 0x5C)B
 * @param fd: fd to parse from (client fd)
 * @return 0 failure, 1 success
 */
static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int command, char* ip){
	size_t packet_len = RFIFOREST(fd);

 

i see for command 0x64  ( Request login authentification )

 

S 0064 <version>.L <username>.24B <password>.24B <clienttype>.B

 

my code

 

Packet Structure

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    struct DataPacket
    {
        public ushort command;

        public ulong version;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)] //.24B byte, Server Code Ask 24B ( 24 Bytes )
        public String Username;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)] //Some 24 Byte Lenght
        public String Password;

        public byte clienttype;  //is wrong?

      public byte[] Serialize()
        {
            // allocate a byte array for the struct data
            var buffer = new byte[Marshal.SizeOf(typeof(DataPacket))];

            // Allocate a GCHandle and get the array pointer
            var gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
            var pBuffer = gch.AddrOfPinnedObject();


            Marshal.StructureToPtr(this, pBuffer, false);
            gch.Free();

            return buffer;
        }


       // this method will deserialize a byte array into the struct.
        public void Deserialize(ref byte[] data)
        {
            var gch = GCHandle.Alloc(data, GCHandleType.Pinned);
            this = (DataPacket)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(DataPacket));
            gch.Free();
        }

    }

 

 

DataPacket packet = new DataPacket();

            packet.command = 0x64;
            packet.version = 55;
            packet.Username = "Thejuster";
            packet.Password = "123456789";
            packet.clienttype = 0;

 var bytes = packet.Serialize();
            soc.Send(bytes);

 

 

Cattura.PNG.77d34f579d488dfd5b60b65936c23511.PNG

If i try to connect whit my code, i see this on server.

I see username and password server dont read.

 

Normal Connection whit Ragnarok Client

 

 

Cattura.PNG.5d92eb58c14f593f0b14433930a0c426.PNG

 

Uhmmm i dont have idea for this problem.

I have download roBrowser, and see src.
because javascript and c# are similar.

 

i find this i on source

 

	// 0x64
	PACKET.CA.LOGIN = function PACKET_CA_LOGIN() {
		this.Version = 0;
		this.ID = '';
		this.Passwd = '';
		this.clienttype = 0;
	};

//Here i think the author build a packet structure.
	PACKET.CA.LOGIN.prototype.build = function() {
		// i think is a size of all packet 
      //[2] Command + [4] ???? No have idea. + [24] Username  + [24] Password + [1] Client type
      var pkt_len = 2 + 4 + 24 + 24 + 1; 
      
		var pkt_buf = new BinaryWriter(pkt_len);

		pkt_buf.writeShort(0x64);
		pkt_buf.writeULong(this.Version);
		pkt_buf.writeString(this.ID, 24);
		pkt_buf.writeString(this.Passwd, 24);
		pkt_buf.writeUChar(this.clienttype);
		return pkt_buf;
	};

 

 

Edited by Thejuster
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  53
  • Topics Per Day:  0.01
  • Content Count:  411
  • Reputation:   260
  • Joined:  04/25/12
  • Last Seen:  

I don't think that username and password should be a string

Get it?

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  28
  • Reputation:   28
  • Joined:  09/16/18
  • Last Seen:  

nope ?

uhmm here are a problem.

Cattura.png

 

look total size sent is 72bytes.

Simple i pack command,verion,username,password,clienttype   total = 72byte

but rAthena server ask:

 

 

static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int command, char* ip){
	size_t packet_len = RFIFOREST(fd);

  
	if( (command == 0x0064 && packet_len < 55)  //For command 0x64 packet max lenght is 55 byte i use this. 0x64
	||  (command == 0x0277 && packet_len < 84)
	||  (command == 0x02b0 && packet_len < 85)
	||  (command == 0x01dd && packet_len < 47)
	||  (command == 0x01fa && packet_len < 48)
	||  (command == 0x027c && packet_len < 60)

 

my packet size is 72byte but a conditional branch on server is limited under 55byte.

Strange for me. 

No have idea for wath reason my structure is 72bytes.
I follow step by step server parameters and Unmanaged conversion.

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  10
  • Topics Per Day:  0.00
  • Content Count:  28
  • Reputation:   28
  • Joined:  09/16/18
  • Last Seen:  

Hello again try whit this error

 

 Connection refused: IP isn't authorised (deny/allow, ip: 127.0.0.1).

 

Cattura.thumb.PNG.254e469e24dad6fd1126871bb9a6223d.PNG

 

changed structure to ulong and int to sbyte and work.

i have an bytes array around  51bytes total

 

 

if( (command == 0x0064 && packet_len < 55)

 

And i think now work but server block 127.0.0.1 address

 

Edited by Thejuster
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...