Thread: 816 js5, login

Page 1 of 2 12 LastLast
Results 1 to 10 of 11
  1. #1 816 js5, login 
    Registered Member

    Join Date
    Jan 2014
    Posts
    596
    Thanks given
    328
    Thanks received
    231
    Rep Power
    153
    Spoiler for JS5:

    Code:
    package org.virtue.network.codec.ondemand;
    
    import org.jboss.netty.buffer.ChannelBuffer;
    import org.jboss.netty.channel.Channel;
    import org.jboss.netty.channel.ChannelHandlerContext;
    import org.jboss.netty.handler.codec.frame.FrameDecoder;
    import org.virtue.network.message.update.UpdateEncryptionMessage;
    import org.virtue.network.message.update.UpdateVersionMessage;
    import org.virtue.network.ondemand.FileRequest;
    import org.virtue.utilities.io.BufferUtils;
    
    /**
     * @author James, Kyle
     *
     */
    public final class UpdateDecoder extends FrameDecoder {
    
    	public static final int OUT_OF_DATE = 6, COMPLETED_REQUEST = 0;
    
    	private enum State {
    		READ_VERSION, READ_REQUEST
    	}
    
    	private State state = State.READ_VERSION;
    
    	@Override
    	protected Object decode(ChannelHandlerContext ctx, Channel c, ChannelBuffer buffer) throws Exception {
            if (buffer.readableBytes() < 6)
                return null;
            if (state == State.READ_VERSION) {
                state = State.READ_REQUEST;
                int length = buffer.readUnsignedByte();
                if (buffer.readableBytes() >= length) {
                    int version = buffer.readInt();
                    int subVersion = buffer.readInt();
                    String key = BufferUtils.readString(buffer);
                    //System.out.println("Version:" + version + " SubVersion:" + subVersion + " Key:" + key);
                    return new UpdateVersionMessage(version, subVersion, key);
                }
            } else {
                int opcode = buffer.readUnsignedByte();
                if (opcode == 0 || opcode == 1) {
                    int type = buffer.readUnsignedByte();
                    int file = buffer.readInt();
                    return new FileRequest(opcode == 1, type, file);
                } else if (opcode == 4) {
                    int key = buffer.readUnsignedByte();
                    buffer.readerIndex(buffer.readerIndex() + 2);
                    return new UpdateEncryptionMessage(key);
                } else {
                    buffer.readerIndex(buffer.readerIndex() + 5);
                }
            }
            return null;
        }
    }


    Spoiler for Login:
    Code:
    package org.virtue.network.codec.login;
    
    import java.math.BigInteger;
    import java.net.ProtocolException;
    
    import org.jboss.netty.buffer.ChannelBuffer;
    import org.jboss.netty.buffer.ChannelBuffers;
    import org.jboss.netty.channel.Channel;
    import org.jboss.netty.channel.ChannelHandlerContext;
    import org.jboss.netty.handler.codec.frame.FrameDecoder;
    import org.virtue.Constants;
    import org.virtue.game.character.FileManager;
    import org.virtue.game.character.player.Player;
    import org.virtue.game.character.player.PlayerDefinition;
    import org.virtue.game.character.player.Player.GameState;
    import org.virtue.network.UpstreamHandler;
    import org.virtue.network.message.login.LoginRequest;
    import org.virtue.network.message.login.LoginRequest.LoginType;
    import org.virtue.utilities.base37.Base37Utils;
    import org.virtue.utilities.io.BufferUtils;
    import org.virtue.utilities.krypto.XTEA;
    
    /**
     * @author James, Kyle
     *
     */
    public class LoginDecoder extends FrameDecoder {
    	
    	public enum Stage {
    		CONNECTION_TYPE, CLIENT_DETAILS, LOBBY_PAYLOAD, GAME_PAYLOAD;
    	}
    
    	public enum LoginTypes {
    		LOBBY, WORLD;
    	}
    
    	private Stage stage = Stage.CONNECTION_TYPE;
    	private LoginTypes type;
    	private int size;
    
    	@Override
    	protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
    		switch (stage) {
    		case CONNECTION_TYPE:
    			return decodeConnectionType(buffer);
    		case CLIENT_DETAILS:
    			return decodeClientDetails(buffer);
    		case LOBBY_PAYLOAD:
    			return decodeLobbyPayload(channel, buffer);
    		case GAME_PAYLOAD:
    			return decodeGamePayload(channel, buffer);
    		}
    		return null;
    	}
    
    	private Object decodeConnectionType(ChannelBuffer buffer) throws ProtocolException {
    		if (!buffer.readable())
    			throw new IllegalStateException("Not enough readable bytes from buffer!");
    
    		int loginType = buffer.readByte() & 0xFF;
    		if (loginType != 16 && loginType != 19 && loginType != 18)
    			throw new ProtocolException("Invalid login type: " + loginType);
    
    		type = loginType == 19 ? LoginTypes.LOBBY : LoginTypes.WORLD;
    		size = buffer.readShort() & 0xFFFF;
    
    		stage = Stage.CLIENT_DETAILS;
    		return null;		
    	}
    	
    	private Object decodeClientDetails(ChannelBuffer buffer) throws ProtocolException {
    		if (buffer.readableBytes() < size)
    			throw new IllegalStateException("Not enough readable bytes from buffer!");
    
    		int version = buffer.readInt();
    		int subVersion = buffer.readInt();
    		
    		if (version != Constants.REVISION && subVersion != Constants.SUB_REVISION)
    			throw new IllegalStateException("Invalid client version/sub-version!");
    
    		if (type.equals(LoginTypes.WORLD))
    			buffer.readByte();
    
    		if (type.equals(LoginTypes.LOBBY))
    			stage = Stage.LOBBY_PAYLOAD;
    		else
    			stage = Stage.GAME_PAYLOAD;
    		return null;
    	}
    
    	private Object decodeLobbyPayload(Channel channel, ChannelBuffer buffer) throws ProtocolException {
    		if (buffer.readableBytes() < 2)
    			throw new IllegalStateException("Not enough readable bytes from buffer.");
    
    		int secureBufferSize = buffer.readShort() & 0xFFFF;
    		if (buffer.readableBytes() < secureBufferSize)
    			throw new IllegalStateException("Not enough readable bytes from buffer.");
    
    		byte[] secureBytes = new byte[secureBufferSize];
    		buffer.readBytes(secureBytes);
    		ChannelBuffer secureBuffer = ChannelBuffers.wrappedBuffer(new BigInteger(secureBytes).modPow(Constants.LOGIN_EXPONENT, Constants.LOGIN_MODULUS).toByteArray());
    
    		int blockOpcode = secureBuffer.readByte() & 0xFF;
    		if (blockOpcode != 10)
    			throw new ProtocolException("Invalid block opcode: " + blockOpcode);
    
    		int[] xteaKey = new int[4];
    		for (int i = 0; i < xteaKey.length; i++)
    			xteaKey[i] = secureBuffer.readInt();
    
    		long loginHash = secureBuffer.readLong();
    		//if (loginHash != 0)
    			//throw new ProtocolException("Invalid login hash: " + loginHash);
    
    		secureBuffer.readByte();
    		secureBuffer.readerIndex(secureBuffer.readerIndex() - 4);
    		
    		String password = BufferUtils.readString(secureBuffer);
    
    		long[] loginSeeds = new long[2];
    		for (int i = 0; i < loginSeeds.length; i++)
    			loginSeeds[i] = secureBuffer.readLong();
    
    		byte[] xteaBlock = new byte[buffer.readableBytes()];
    		buffer.readBytes(xteaBlock);
    		
    		XTEA xtea = new XTEA(xteaKey);
    		xtea.decrypt(xteaBlock, 0, xteaBlock.length);
    		
    		ChannelBuffer xteaBuffer = ChannelBuffers.wrappedBuffer(xteaBlock);
    
    		boolean decodeAsString = xteaBuffer.readByte() == 1;
    		String username = decodeAsString ? BufferUtils.readString(xteaBuffer) : Base37Utils.decodeBase37(xteaBuffer.readLong());
    
    		xteaBuffer.readUnsignedByte();
    		xteaBuffer.readUnsignedByte();
    		xteaBuffer.readUnsignedByte();
    
    		xteaBuffer.readUnsignedShort();
    		xteaBuffer.readUnsignedShort();
    		xteaBuffer.readUnsignedByte();
    
    		int[] randomData = new int[24];
    		for (int index = 0; index < randomData.length; index++) {
    			randomData[index] = xteaBuffer.readUnsignedByte();
    		}
    		
    		BufferUtils.readString(xteaBuffer);
    		
    		int length = xteaBuffer.readUnsignedByte();
    
    		byte[] machineData = new byte[length];
    		for (int data = 0; data < machineData.length; data++) {
    			machineData[data] = (byte) xteaBuffer.readUnsignedByte();
    		}
    		
    		xteaBuffer.readInt();
    		BufferUtils.readString(xteaBuffer);
    		xteaBuffer.readInt();
    		xteaBuffer.readInt();
    		BufferUtils.readString(xteaBuffer);
    
    		xteaBuffer.readUnsignedByte();
    		
    		int[] cacheCRC = new int[36];
    		for (int index = 0; index < cacheCRC.length; index++) {
    			cacheCRC[index] = xteaBuffer.readInt();
    		}
    		
    		return new LoginRequest(username, password, LoginType.LOBBY);
    	}
    	
    	private Object decodeGamePayload(Channel channel, ChannelBuffer buffer) throws ProtocolException {
    		if (buffer.readableBytes() < 2)
    			throw new IllegalStateException("Not enough readable bytes from buffer.");
    
    		int secureBufferSize = buffer.readShort() & 0xFFFF;
    		if (buffer.readableBytes() < secureBufferSize)
    			throw new IllegalStateException("Not enough readable bytes from buffer.");
    
    		byte[] secureBytes = new byte[secureBufferSize];
    		buffer.readBytes(secureBytes);
    		ChannelBuffer secureBuffer = ChannelBuffers.wrappedBuffer(new BigInteger(secureBytes).modPow(Constants.LOGIN_EXPONENT, Constants.LOGIN_MODULUS).toByteArray());
    
    		int blockOpcode = secureBuffer.readByte() & 0xFF;
    		if (blockOpcode != 10)
    			throw new ProtocolException("Invalid block opcode: " + blockOpcode);
    
    		int[] xteaKey = new int[4];
    		for (int i = 0; i < xteaKey.length; i++)
    			xteaKey[i] = secureBuffer.readInt();
    
    		long loginHash = secureBuffer.readLong();
    		//if (loginHash != 0)
    			//throw new ProtocolException("Invalid login hash: " + loginHash);
    
    		secureBuffer.readByte();
    		secureBuffer.readerIndex(secureBuffer.readerIndex() - 4);
    		
    		String password = BufferUtils.readString(secureBuffer);
    
    		long[] loginSeeds = new long[2];
    		for (int i = 0; i < loginSeeds.length; i++)
    			loginSeeds[i] = secureBuffer.readLong();
    
    		byte[] xteaBlock = new byte[buffer.readableBytes()];
    		buffer.readBytes(xteaBlock);
    		
    		XTEA xtea = new XTEA(xteaKey);
    		xtea.decrypt(xteaBlock, 0, xteaBlock.length);
    		
    		ChannelBuffer xteaBuffer = ChannelBuffers.wrappedBuffer(xteaBlock);
    		boolean decodeAsString = xteaBuffer.readByte() == 1;
    		String username = decodeAsString ? BufferUtils.readString(xteaBuffer) : Base37Utils.decodeBase37(xteaBuffer.readLong());
    
    		xteaBuffer.readUnsignedByte();
    		xteaBuffer.readUnsignedShort();
    		xteaBuffer.readUnsignedShort();
    
    		xteaBuffer.readUnsignedByte();
    
    		int[] randomData = new int[24];
    		for (int index = 0; index < randomData.length; index++) {
    			randomData[index] = xteaBuffer.readUnsignedByte();
    		}
    		
    		BufferUtils.readString(xteaBuffer);
    		xteaBuffer.readInt();
    		
    		int length = xteaBuffer.readUnsignedByte();
    
    		byte[] machineData = new byte[length];
    		for (int data = 0; data < machineData.length; data++) {
    			machineData[data] = (byte) xteaBuffer.readUnsignedByte();
    		}
    		
    		xteaBuffer.readInt();
    		xteaBuffer.readInt();
    		xteaBuffer.readInt();
    
    		BufferUtils.readString(xteaBuffer);
    		
    		boolean extra = xteaBuffer.readUnsignedByte() == 1;
    		if (extra) {
    			BufferUtils.readString(xteaBuffer);
    		}
    		
    		xteaBuffer.readUnsignedByte();
    		xteaBuffer.readUnsignedByte();
    		xteaBuffer.readUnsignedByte();
    		xteaBuffer.readUnsignedByte();
    
    		xteaBuffer.readInt();
    		BufferUtils.readString(xteaBuffer);
    		xteaBuffer.readUnsignedByte();
    
    		xteaBuffer.readUnsignedShort();
    		xteaBuffer.readUnsignedShort();
    		
    		int[] cacheCRC = new int[36];
    		for (int index = 0; index < cacheCRC.length; index++) {
    			cacheCRC[index] = xteaBuffer.readInt();
    		}
    		
    		return new LoginRequest(username, password, LoginType.WORLD);
    	}
    }


    Spoiler for RootWindow:

    Code:
    	@Override
    	public OutBuffer encode(Player player, RootWidgetEvent msg) {
    		OutBuffer buffer = new OutBuffer();
    		buffer.putPacket(33);
    		buffer.putIntV1(0);
    		buffer.putByte(0);
    		buffer.putLEInt(0);
    		buffer.putIntV1(0);
    		buffer.putLEShort(msg.getWidgetType());
    		buffer.putIntV2(0);
    		return buffer;
    	}


    Spoiler for Map Region:

    Code:
    		public OutBuffer encode(Player player, SceneGraphEvent msg) {
    		OutBuffer buffer = new OutBuffer();
    		buffer.putVarShort(160);
    
    		int chunkX = player.getPosition().getChunkX();
    		int chunkZ = player.getPosition().getChunkY();
    		
    		/**
    		 * 816
    		 */
    		buffer.putS(msg.isRender() ? 1 : 0);
    		buffer.putByte(9);
    		buffer.putShort(chunkZ);
    		buffer.putA(0);
    		buffer.putShortA(chunkX);
    		
    		buffer.finishVarShort();
    		return buffer;
    	}

    [Only registered and activated users can see links. ]
    [Only registered and activated users can see links. ]

    Reply With Quote  
     


  2. #2  
    Registered Member
    Join Date
    Oct 2012
    Posts
    1,280
    Thanks given
    331
    Thanks received
    257
    Rep Power
    69
    I assume that you are Kyle haha

    Nice work, damn useful.
    I'm working on: [Only registered and activated users can see links. ]
    Reply With Quote  
     

  3. #3  
    Registered Member

    Join Date
    Oct 2012
    Posts
    1,463
    Thanks given
    560
    Thanks received
    323
    Rep Power
    122
    That is some good work, nice man. People may need this in the future aswell so nice release.

    “I have not failed. I've just found 10,000 ways that won't work.”
    ― Thomas A. Edison


    [Only registered and activated users can see links. ]


    Reply With Quote  
     

  4. #4  
    Community Veteran



    Join Date
    Jan 2008
    Posts
    3,448
    Thanks given
    46
    Thanks received
    973
    Rep Power
    4723
    who did u beg to for this james???
    Reply With Quote  
     

  5. Thankful user:


  6. #5  
    Reverse Engineering

    freeezr's Avatar
    Join Date
    Dec 2011
    Posts
    1,067
    Thanks given
    280
    Thanks received
    443
    Rep Power
    401
    you forgot to show the lobby login response, how theres a byte of 0 sent before the players rights now.

    Quote Originally Posted by Richard1992 View Post
    who did u beg to for this james???
    I gave it to him. All3n and I found the changes.

    Reply With Quote  
     

  7. Thankful users:


  8. #6  
    Mug Club


    Join Date
    Jul 2011
    Age
    26
    Posts
    1,873
    Thanks given
    509
    Thanks received
    890
    Discord
    View profile
    Rep Power
    332
    Quote Originally Posted by Im Frizzy View Post
    you forgot to show the lobby login response, how theres a byte of 0 sent before the players rights now.



    I gave it to him. All3n and I found the changes.
    That 0 byte isn't new. They do it for tons of things now.


    My Open Source Projects
    [Only registered and activated users can see links. ]
    [Only registered and activated users can see links. ]
    Reply With Quote  
     

  9. Thankful user:


  10. #7  
    WVWVWVWVWVWVWVW

    _jordan's Avatar
    Join Date
    Nov 2012
    Age
    23
    Posts
    2,865
    Thanks given
    62
    Thanks received
    1,528
    Discord
    View profile
    Rep Power
    5000
    Nothing even changed for JS5.

    Spoiler for signature:
    When your vision is crystal clear, they say it's razor-sharp
    A focused mind is said to be like a knife, but the scalpel is wisdom
    All one can do is accept that life is a double-edged sword
    Stay on the edge

    -



    Reply With Quote  
     

  11. Thankful user:


  12. #8  
    Registered Member Gimpy's Avatar
    Join Date
    Jul 2011
    Posts
    87
    Thanks given
    9
    Thanks received
    7
    Rep Power
    0
    You Beast YOU! thanks for this
    Reply With Quote  
     

  13. #9  
    Keyboard Warrior
    Notice's Avatar
    Join Date
    Sep 2014
    Age
    22
    Posts
    67
    Thanks given
    17
    Thanks received
    14
    Rep Power
    10
    Nice release, will put it for good use!
    Reply With Quote  
     

  14. #10  
    Registered Member
    Velocity's Avatar
    Join Date
    Jan 2009
    Age
    25
    Posts
    2,029
    Thanks given
    1,013
    Thanks received
    2,373
    Rep Power
    4112
    Quote Originally Posted by OP
    int chunkX = player.getPosition().getChunkX();
    int chunkZ = player.getPosition().getChunkY();
    Either name both Z or name both Y, but don't start mixing them
    xxxxxxx
    Reply With Quote  
     

Page 1 of 2 12 LastLast

Thread Information
Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)


User Tag List

Similar Threads

  1. [816] World Login
    By Hotyute in forum Show-off
    Replies: 28
    Last Post: 08-25-2014, 01:10 PM
  2. Replies: 7
    Last Post: 02-07-2008, 01:10 PM
  3. Global Login and Logout Messages
    By Runite in forum Tutorials
    Replies: 11
    Last Post: 09-19-2007, 04:12 PM
  4. [TuT]Stopping multi logins through user ips
    By Wolf in forum Tutorials
    Replies: 21
    Last Post: 09-06-2007, 03:20 AM
  5. Getting player's UID at login
    By Pandora in forum Tutorials
    Replies: 10
    Last Post: 08-26-2007, 11:17 AM
Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •