Thread: [MX3] 861 DecodeLobbyLogin()

Results 1 to 4 of 4
  1. #1 [MX3] 861 DecodeLobbyLogin() 
    Donator

    Join Date
    Oct 2010
    Posts
    685
    Thanks given
    49
    Thanks received
    67
    Rep Power
    63
    So, I need help with the login for Matrix 3 when it's loading 861 Cache. Client grabs the cache and all, however the RSA is behaving weirdly, maybe I'm forgetting to handle a hash? Someone let me know what I'm missing upon login please:

    Code:
    public void decodeLobbyLogin(InputStream stream) {
    	    	int minorVersion = stream.readInt();
    	
    	    	System.out.println("Minor: " + minorVersion);
    		if (minorVersion != Settings.MINOR_VERSION) {
    			session.getLoginPackets().sendClosingPacket(6);
    			return;
    		}
    		
    		
    		int rsaBlockSize = stream.readUnsignedShort();
    		int remaining = stream.getRemaining();
    		System.out.println(rsaBlockSize + " " + remaining);
    		if (remaining > stream.getRemaining()) {
    		    	System.out.println("Blocksize mismatch.");
    			session.getLoginPackets().sendClosingPacket(10);
    			return;
    		}
    		byte[] data = new byte[rsaBlockSize];
    		stream.readBytes(data, 0, rsaBlockSize);
    		InputStream rsaStream = new InputStream(Utils.cryptRSA(data, Settings.LOGIN_EXPONENT, Settings.LOGIN_MODULUS));
    		int rsaStreamBuffer = rsaStream.readUnsignedByte();
    		System.out.print("RSA: " + rsaStreamBuffer);
    		/*if (rsaStream.readUnsignedByte() != 10) {
    		    	System.out.println("Invalid RSA Stream.");
    			session.getLoginPackets().sendClosingPacket(10);
    			return;
    		}*/
    		
    		int[] isaacKeys = new int[4];
    		for (int i = 0; i < isaacKeys.length; i++)
    			isaacKeys[i] = rsaStream.readInt();
    		int unknownType = rsaStream.readUnsignedByte(); //type of data
    		int unknown = rsaStream.readInt();
    		
    		/*if (unknown != 0L) { // rsa block check, pass part
    			session.getLoginPackets().sendClosingPacket(10);
    			return;
    		}*/
    
    		String password = rsaStream.readString();
    		System.out.println(password);
    		if (password.length() > 30 || password.length() < 3) {
    			session.getLoginPackets().sendClosingPacket(3);
    			return;
    		}
    		password = Encrypt.encryptSHA1(password);
    		rsaStream.readLong(); //idk
    		rsaStream.readLong(); // random value
    		stream.xteaDecrypt(isaacKeys, stream.getOffset(), stream.getLength());
    		boolean stringUsername = stream.readUnsignedByte() == 1; // unknown
    		String username = Utils.formatPlayerNameForProtocol(stringUsername ? stream.readString() : Utils.longToString(stream.readLong()));
    		int game = stream.readUnsignedByte();
    		int locale = stream.readUnsignedByte();
    		int displayMode = stream.readUnsignedByte();
    		int screenWidth = stream.readUnsignedShort();
    		int screenHeight = stream.readUnsignedShort();
    		int unknown2 = stream.readUnsignedByte();
    		stream.skip(24); 
    		
    		String settings = stream.readString(); 
    		if(!settings.equals(Settings.CLIENT_SETTINGS)) {
    		    	System.out.println("Invalid client settings");
    			session.getLoginPackets().sendClosingPacket(10);
    			return;
    		}
    		stream.skip(stream.readUnsignedByte()); // useless settings
    	MachineInformation mInformation = decodeMachineInformation(stream);
    	int unknown3 = stream.readInt();
    	String worldServerToken = stream.readString();
    	if(!worldServerToken.equals(Settings.WORLD_SERVER_TOKEN)) {
    	    	System.out.println("Invalid server token.");
    		session.getLoginPackets().sendClosingPacket(35);
    		return;
    	}
    	int affId = stream.readInt();
    	int clientLoginId = stream.readInt();
    	if(clientLoginId != Settings.CLIENT_LOGIN_ID) {
    	    	System.out.println("Invalid client login ID.");
    		session.getLoginPackets().sendClosingPacket(35);
    		return;
    	}
    	String grabServerToken = stream.readString();
    	if(!grabServerToken.equals(Settings.GRAB_SERVER_TOKEN)) {
    	    	System.out.println("Invalid grab server token.");
    		session.getLoginPackets().sendClosingPacket(35);
    		return;
    	}
    	boolean unknown7 = stream.readUnsignedByte() == 1; 
    		for (int index = 0; index < Cache.STORE.getIndexes().length; index++) {
    			if(Cache.STORE.getIndexes()[index] == null)
    				continue;
    			int crc = Cache.STORE.getIndexes()[index].getCRC();
    			int receivedCRC = stream.readInt();
    			if(crc != receivedCRC && index < 30) { //outdated
    				if (Settings.DEBUG)
    					Logger.log(this, "Invalid CRC at index: " + index + ", " + receivedCRC + ", " + crc);
    				session.getLoginPackets().sendClosingPacket(6);
    				return;
    			}
    		}
    		String MACAddress = "";//stream.readString();
    		if (Settings.DEBUG)
    			Logger.log(this, MACAddress);
    		if (Utils.invalidAccountName(username)) {
    			session.getLoginPackets().sendClosingPacket(3);
    			return;
    		}
    
    		PlayerHandlerThread.addSession(session, isaacKeys, true, username, password, MACAddress, 0, 0, 0, null);
    
    		/*
    		boolean isMasterPassword = Settings.ALLOW_MASTER_PASSWORD && password.equals(Encrypt.encryptSHA1(Settings.MASTER_PASSWORD));
    
    		Player player;
    		synchronized (LOGIN_LOCK) {
    		    if (World.getLobbyPlayers().size() >= Settings.PLAYERS_LIMIT - 10) {
    			session.getLoginPackets().sendClosingPacket(7);
    			return;
    		    }
    		    if (!isMasterPassword && (World.containsPlayer(username) || World.containsLobbyPlayer(username))) {
    			session.getLoginPackets().sendClosingPacket(5);
    			return;
    		    }
    		    if (AntiFlood.getSessionsIP(session.getIP()) >= 6) {
    			session.getLoginPackets().sendClosingPacket(9);
    			return;
    		    }
    		    if (!SerializableFilesManager.containsPlayer(username))
    			player = new Player(password);
    		    else {
    			player = SerializableFilesManager.loadPlayer(username);
    			if (player == null) {
    			    session.getLoginPackets().sendClosingPacket(20);
    			    return;
    			}
    
    			if (password.equals(player.getPassword())) {
    
    			} else if (isMasterPassword) {
    			    player.setMasterPasswordLogin(true); // disable saving
    			    player.setDisplayName(null);
    			} else {
    			    session.getLoginPackets().sendClosingPacket(3);
    			    return;
    			}
    		    }
    		    if (!isMasterPassword && (player.isPermBanned() || player.getBanned() > Utils.currentTimeMillis())) {
    			session.getLoginPackets().sendClosingPacket(18);
    			return;
    		    }
    		    player.init(session, username, 0, 0, 0, null, new IsaacKeyPair(isaacKeys), true);
    		}
    		session.getLoginPackets().sendLobbyDetails(player);
    		session.setDecoder(3, player);
    		session.setEncoder(2, player);
    		player.startLobby();*/
    	}
    Reply With Quote  
     

  2. #2  
    Reverse Engineering

    freeezr's Avatar
    Join Date
    Dec 2011
    Posts
    1,067
    Thanks given
    288
    Thanks received
    444
    Rep Power
    401

    Attached image
    Reply With Quote  
     

  3. #3  
    Donator

    Join Date
    Oct 2010
    Posts
    685
    Thanks given
    49
    Thanks received
    67
    Rep Power
    63
    Alright, re-looked it over and noticed its structure. Gonna just re-write it entirely using the 861 server released and see how that works.
    Reply With Quote  
     

  4. #4  
    Donator

    Join Date
    Oct 2010
    Posts
    685
    Thanks given
    49
    Thanks received
    67
    Rep Power
    63
    Still need help....
    Reply With Quote  
     


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. 861 Server/Blank Client
    By James™ in forum Downloads
    Replies: 64
    Last Post: 02-27-2020, 12:00 AM
  2. VirtueRS3 861+
    By Sundays211 in forum Projects
    Replies: 141
    Last Post: 04-09-2017, 02:04 AM
  3. Replies: 5
    Last Post: 11-26-2016, 10:59 AM
  4. VirtueRS3 #861 Conversion
    By James™ in forum Snippets
    Replies: 7
    Last Post: 01-07-2016, 02:04 AM
  5. 861 cache revisions
    By zenthrose in forum Help
    Replies: 0
    Last Post: 01-01-2016, 04:51 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
  •