Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.07 KB | None | 0 0
  1. package com.rs.net.decoders;
  2.  
  3. import com.rs.Settings;
  4. import com.rs.cache.Cache;
  5. import com.rs.game.World;
  6. import com.rs.game.player.Player;
  7. import com.rs.io.InputStream;
  8. import com.rs.net.Session;
  9. import com.rs.utils.AntiFlood;
  10. import com.rs.utils.Encrypt;
  11. import com.rs.utils.ISAACCipher;
  12. import com.rs.utils.IsaacKeyPair;
  13. import com.rs.utils.Logger;
  14. import com.rs.utils.MachineInformation;
  15. import com.rs.utils.SerializableFilesManager;
  16. import com.rs.utils.Utils;
  17.  
  18. public final class LoginPacketsDecoder extends Decoder {
  19.  
  20. public LoginPacketsDecoder(Session session) {
  21. super(session);
  22. }
  23.  
  24. @Override
  25. public void decode(InputStream stream) {
  26. session.setDecoder(-1);
  27. int packetId = stream.readUnsignedByte();
  28. if (World.exiting_start != 0) {
  29. session.getLoginPackets().sendClientPacket(14);
  30. return;
  31. }
  32. int packetSize = stream.readUnsignedShort();
  33. if (packetSize != stream.getRemaining()) {
  34. session.getChannel().close();
  35. return;
  36. }
  37. if (stream.readInt() != Settings.CLIENT_BUILD) {
  38. session.getLoginPackets().sendClientPacket(6);
  39. return;
  40. }
  41. if (packetId == 16 || packetId == 18) // 16 world login
  42. decodeWorldLogin(stream, session);
  43. else {
  44. if (Settings.DEBUG)
  45. Logger.log(this, "PacketId " + packetId);
  46. session.getChannel().close();
  47. }
  48. }
  49.  
  50. /**
  51. * Decodes the world login.
  52. * @param inputStream The stream.
  53. * @param session The session.
  54. */
  55. private void decodeWorldLogin(InputStream inputStream, Session session) {
  56. inputStream.readUnsignedByte();
  57. int rsaBlockSize = inputStream.readUnsignedShort();
  58. if (rsaBlockSize > inputStream.getRemaining()) {
  59. Logger.log(this.getClass(), "Invalid rsa block size.");
  60. session.getLoginPackets().sendClientPacket(10);
  61. return;
  62. }
  63. byte[] data = new byte[rsaBlockSize];
  64. inputStream.readBytes(data, 0, rsaBlockSize);
  65. InputStream rsaStream = new InputStream(Utils.cryptRSA(data, Settings.RSA_EXPONENT, Settings.RSA_MODULUS));
  66. if (rsaStream.readUnsignedByte() != 10) {
  67. Logger.log(this.getClass(), "Could not read isaac.");
  68. session.getLoginPackets().sendClientPacket(10);
  69. return;
  70. }
  71. final int[] isaacKeys = new int[4];
  72. for (int i = 0; i < isaacKeys.length; i++) {
  73. isaacKeys[i] = rsaStream.readInt();
  74. }
  75. ISAACCipher inCipher = new ISAACCipher(isaacKeys);
  76. ISAACCipher outCipher = new ISAACCipher(isaacKeys);
  77. //session.setIsaacPair(new ISAACPair(inCipher, outCipher)); //removed this beacase no such methods
  78. if (rsaStream.readLong() != 0L) {
  79. Logger.log(this.getClass(), "Could not read the password.");
  80. session.getLoginPackets().sendClientPacket(10);
  81. return;
  82. }
  83. MachineInformation mInformation = null;
  84. final String password = rsaStream.readString();
  85. rsaStream.readLong();
  86. rsaStream.readLong();
  87. rsaStream.readLong();
  88. inputStream.decodeXTEA(isaacKeys, inputStream.getOffset(), inputStream.getLength());
  89. boolean stringUsername = inputStream.readUnsignedByte() == 1;
  90. final String username = (stringUsername ? inputStream.readString() : Utils.longToString(inputStream.readLong()));
  91. final int displayMode = inputStream.readUnsignedByte();
  92. final int screenWidth = inputStream.readUnsignedShort();
  93. final int screenHeight = inputStream.readUnsignedShort();
  94. inputStream.readUnsignedByte();
  95. inputStream.skip(24);
  96. inputStream.readString();
  97. inputStream.readInt();
  98. inputStream.skip(inputStream.readUnsignedByte());
  99. if(inputStream.readUnsignedByte() != 6) {
  100. Logger.log(this.getClass(), "Could not read machine information.");
  101. session.getLoginPackets().sendClientPacket(10);
  102. return;
  103. }
  104. final int os = inputStream.readUnsignedByte();
  105. boolean x64OS = inputStream.readUnsignedByte() == 1;
  106. inputStream.readUnsignedByte();
  107. final int osVendor = inputStream.readUnsignedByte();
  108. final int javaVersion = inputStream.readUnsignedByte();
  109. final int javaBuild = inputStream.readUnsignedByte();
  110. final int javaSubBuild = inputStream.readUnsignedByte();
  111. inputStream.readUnsignedByte();
  112. final int maximumMemory = inputStream.readUnsignedShort();
  113. final int availableProcessors = inputStream.readUnsignedByte();
  114. final int RAM = inputStream.read24BitInt();
  115. final int cpuClockFrequency = inputStream.readUnsignedShort();
  116. inputStream.readJagString();
  117. inputStream.readJagString();
  118. inputStream.readJagString();
  119. inputStream.readJagString();
  120. final int directXDriverDateMonth = inputStream.readUnsignedByte();
  121. final int directXDriverDateYear = inputStream.readUnsignedShort();
  122. final String cpuType = inputStream.readJagString();
  123. final String cpuData = inputStream.readJagString();
  124. final int cpuCores = inputStream.readUnsignedByte();
  125. final int rawCpuInformation = inputStream.readUnsignedByte();
  126. final int[] rawCpuInformationData = new int[3];
  127. for(int i = 0; i < rawCpuInformationData.length; i++) {
  128. rawCpuInformationData[i] = inputStream.readInt();
  129. }
  130. final int rawCpuInformation2 = inputStream.readInt();
  131. inputStream.readInt();
  132. inputStream.readLong();
  133. inputStream.readString();
  134. if (inputStream.readUnsignedByte() == 1) {
  135. inputStream.readString();
  136. }
  137. inputStream.readUnsignedByte();
  138. inputStream.readUnsignedByte();
  139. inputStream.readUnsignedByte();
  140. inputStream.readByte();
  141. inputStream.readInt();
  142. final String token = inputStream.readString();
  143. if(token.length() > 0 && !token.equals(Settings.GRAB_SERVER_TOKEN)) {
  144. Logger.log(this.getClass(), "Invalid server token: " + token);
  145. session.getLoginPackets().sendClientPacket(10);
  146. return;
  147. }
  148. inputStream.readUnsignedByte();
  149. int worldId = inputStream.readInt();
  150. for (int index = 0; index < Cache.STORE.getIndexes().length; index++) {
  151. int crc = Cache.STORE.getIndexes()[index] == null ? -1011863738 : Cache.STORE.getIndexes()[index].getCRC();
  152. int receivedCRC = inputStream.readInt();
  153. if (crc != receivedCRC && index < 32) {
  154. Logger.log(this.getClass(), "Invalid crc received.");
  155. session.getLoginPackets().sendClientPacket(10);
  156. return;
  157. }
  158. }
  159. Player player;
  160. if (!SerializableFilesManager.containsPlayer(username))
  161. player = new Player(password);
  162. else {
  163. player = SerializableFilesManager.loadPlayer(username);
  164. if (player == null) {
  165. session.getLoginPackets().sendClientPacket(20);
  166. return;
  167. }
  168. if (!SerializableFilesManager.createBackup(username)) {
  169. session.getLoginPackets().sendClientPacket(20);
  170. return;
  171. }
  172. if (!password.equals(player.getPassword())) {
  173. session.getLoginPackets().sendClientPacket(3);
  174. return;
  175. }
  176. }
  177. if (player.isPermBanned() || player.getBanned() > Utils.currentTimeMillis()) {
  178. session.getLoginPackets().sendClientPacket(4);
  179. return;
  180. }
  181. player.init(session, username, displayMode, screenWidth, screenHeight, mInformation, new IsaacKeyPair(isaacKeys));
  182. session.getLoginPackets().sendLoginDetails(player);
  183. session.setDecoder(3, player);
  184. session.setEncoder(2, player);
  185. player.start();
  186. /*sendWorldDetails(session, player);
  187. player.init(session);
  188. player.setProperty("world_id", 1);
  189. player.setProperty("display_mode", displayMode);
  190. player.setProperty("screen_width", screenWidth);
  191. player.setProperty("screen_height", screenHeight);
  192. player.setProperty("ip_address", session.getChannel().getRemoteAddress().toString().split(":")[0].replace("/", ""));
  193. session.setDecoder(new PacketsDecoder());
  194. player.start();*/
  195. }
  196. @SuppressWarnings("unused")
  197. public void decodeWorldLogin2(InputStream stream) {
  198. if (stream.readInt() != Settings.CUSTOM_CLIENT_BUILD) {
  199. session.getLoginPackets().sendClientPacket(6);
  200. return;
  201. }
  202. boolean unknownEquals14 = stream.readUnsignedByte() == 1;
  203. int rsaBlockSize = stream.readUnsignedShort();
  204. if(rsaBlockSize > stream.getRemaining()) {
  205. session.getLoginPackets().sendClientPacket(10);
  206. return;
  207. }
  208. byte[] data = new byte[rsaBlockSize];
  209. stream.readBytes(data, 0, rsaBlockSize);
  210. InputStream rsaStream = new InputStream(Utils.cryptRSA(data, Settings.RSA_EXPONENT, Settings.RSA_MODULUS));
  211. if (rsaStream.readUnsignedByte() != 10) {
  212. session.getLoginPackets().sendClientPacket(10);
  213. return;
  214. }
  215. int[] isaacKeys = new int[4];
  216. for (int i = 0; i < isaacKeys.length; i++)
  217. isaacKeys[i] = rsaStream.readInt();
  218. if (rsaStream.readLong() != 0L) { // rsa block check, pass part
  219. session.getLoginPackets().sendClientPacket(10);
  220. return;
  221. }
  222. String password = rsaStream.readString();
  223. /*if (password.length() > 30 || password.length() < 3) {
  224. session.getLoginPackets().sendClientPacket(3);
  225. return;
  226. }*/
  227. password = Encrypt.encryptSHA1(password);
  228. String unknown = Utils.longToString(rsaStream.readLong());
  229. rsaStream.readLong(); // random value
  230. rsaStream.readLong(); // random value
  231. stream.decodeXTEA(isaacKeys, stream.getOffset(), stream.getLength());
  232. boolean stringUsername = stream.readUnsignedByte() == 1; // unknown
  233. String username = Utils
  234. .formatPlayerNameForProtocol(stringUsername ? stream.readString() : Utils.longToString(stream.readLong()));
  235. int displayMode = stream.readUnsignedByte();
  236. int screenWidth = stream.readUnsignedShort();
  237. int screenHeight = stream.readUnsignedShort();
  238. int unknown2 = stream.readUnsignedByte();
  239. stream.skip(24); // 24bytes directly from a file, no idea whats there
  240. String settings = stream.readString();
  241. int affid = stream.readInt();
  242. stream.skip(stream.readUnsignedByte()); // useless settings
  243. /* if (stream.readUnsignedByte() != 6) { //personal data start
  244. session.getLoginPackets().sendClientPacket(10);
  245. return;
  246. }
  247. int os = stream.readUnsignedByte();
  248. boolean x64Arch = stream.readUnsignedByte() == 1;
  249. int osVersion = stream.readUnsignedByte();
  250. int osVendor = stream.readUnsignedByte();
  251. int javaVersion = stream.readUnsignedByte();
  252. int javaVersionBuild = stream.readUnsignedByte();
  253. int javaVersionBuild2 = stream.readUnsignedByte();
  254. boolean hasApplet = stream.readUnsignedByte() == 1;
  255. int heap = stream.readUnsignedShort();
  256. int availableProcessors = stream.readUnsignedByte();
  257. int ram = stream.read24BitInt();
  258. int cpuClockFrequency = stream.readUnsignedShort();
  259. int cpuInfo3 = stream.readUnsignedByte();
  260. int cpuInfo4 = stream.readUnsignedByte();
  261. int cpuInfo5 = stream.readUnsignedByte();
  262. String empty1 = stream.readJagString();
  263. String empty2 = stream.readJagString();
  264. String empty3 = stream.readJagString();
  265. String empty4 = stream.readJagString();
  266. int unused1 = stream.readUnsignedByte();
  267. int unused2 = stream.readUnsignedShort();
  268. MachineInformation mInformation = new MachineInformation(os, x64Arch, osVersion, osVendor, javaVersion, javaVersionBuild, javaVersionBuild2,
  269. hasApplet, heap, availableProcessors, ram, cpuClockFrequency, cpuInfo3, cpuInfo4, cpuInfo5);*/
  270. MachineInformation mInformation = null;
  271. int unknown3 = stream.readInt();
  272. long userFlow = stream.readLong();
  273. boolean hasAditionalInformation = stream.readUnsignedByte() == 1;
  274. if (hasAditionalInformation)
  275. stream.readString(); // aditionalInformation
  276. boolean hasJagtheora = stream.readUnsignedByte() == 1;
  277. boolean js = stream.readUnsignedByte() == 1;
  278. boolean hc = stream.readUnsignedByte() == 1;
  279. int unknown4 = stream.readByte();
  280. int unknown5 = stream.readInt();
  281. String unknown6 = stream.readString();
  282. boolean unknown7 = stream.readUnsignedByte() == 1;
  283. for (int index = 0; index < Cache.STORE.getIndexes().length; index++) {
  284. int crc = Cache.STORE.getIndexes()[index] == null ? -1011863738 : Cache.STORE
  285. .getIndexes()[index].getCRC();
  286. int receivedCRC = stream.readInt();
  287. if (crc != receivedCRC && index < 32) {
  288. /* Logger.log(this,
  289. "Invalid CRC at index: "+index+", "+receivedCRC+", "+crc);*/
  290. session.getLoginPackets().sendClientPacket(6);
  291. return;
  292. }
  293. }
  294. if (Utils.invalidAccountName(username)) {
  295. session.getLoginPackets().sendClientPacket(3);
  296. return;
  297. }
  298. if (World.getPlayers().size() >= Settings.PLAYERS_LIMIT - 10) {
  299. session.getLoginPackets().sendClientPacket(7);
  300. return;
  301. }
  302. if (World.containsPlayer(username)) {
  303. session.getLoginPackets().sendClientPacket(5);
  304. return;
  305. }
  306. if (AntiFlood.getSessionsIP(session.getIP()) > 3) {
  307. session.getLoginPackets().sendClientPacket(9);
  308. return;
  309. }
  310. Player player;
  311. if (!SerializableFilesManager.containsPlayer(username))
  312. player = new Player(password);
  313. else {
  314. player = SerializableFilesManager.loadPlayer(username);
  315. if (player == null) {
  316. session.getLoginPackets().sendClientPacket(20);
  317. return;
  318. }
  319. if (!SerializableFilesManager.createBackup(username)) {
  320. session.getLoginPackets().sendClientPacket(20);
  321. return;
  322. }
  323. if (!password.equals(player.getPassword())) {
  324. session.getLoginPackets().sendClientPacket(3);
  325. return;
  326. }
  327. }
  328. if (player.isPermBanned() || player.getBanned() > Utils.currentTimeMillis()) {
  329. session.getLoginPackets().sendClientPacket(4);
  330. return;
  331. }
  332. player.init(session, username, displayMode, screenWidth, screenHeight, mInformation, new IsaacKeyPair(isaacKeys));
  333. session.getLoginPackets().sendLoginDetails(player);
  334. session.setDecoder(3, player);
  335. session.setEncoder(2, player);
  336. player.start();
  337. }
  338.  
  339. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement