dnuhax

Untitled

Mar 27th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.58 KB | None | 0 0
  1. package me.dasneueupdate.nukkitnuller.utils;
  2.  
  3. import java.util.Random;
  4. import java.util.zip.DataFormatException;
  5.  
  6. import com.nukkitx.network.VarInts;
  7. import com.nukkitx.network.raknet.RakNetPriority;
  8. import com.nukkitx.network.raknet.RakNetReliability;
  9. import com.nukkitx.protocol.util.Zlib;
  10.  
  11. import io.netty.buffer.ByteBuf;
  12. import io.netty.buffer.PooledByteBufAllocator;
  13. import io.netty.util.AsciiString;
  14. import io.netty.util.internal.ThreadLocalRandom;
  15. import wode.ProfileHelper;
  16.  
  17. public class PacketGenerator {
  18. private static final Random RAND = new Random();
  19. private static final Zlib zlib = Zlib.DEFAULT;
  20. public static void encodeLoginPacket(ByteBuf buffer,int protocolversion,AsciiString chainData,AsciiString skinData) {
  21. buffer.writeByte(0x01);
  22.  
  23. buffer.writeInt(protocolversion);
  24.  
  25. VarInts.writeUnsignedInt(buffer, chainData.length() + skinData.length() + 8);
  26.  
  27. writeLEAsciiString(buffer, chainData);
  28. writeLEAsciiString(buffer, skinData);
  29. }
  30. public static EncapsulatedPacket[] generateLoginPacket(String displayname,String ip,int port) {
  31. AsciiString[] auth = ProfileHelper.randomAuthData(displayname,ip, port);
  32. AsciiString chaindata = auth[0];
  33. AsciiString skindata = auth[1];
  34. ByteBuf buffer = PooledByteBufAllocator.DEFAULT.buffer(1, 55900);
  35. encodeLoginPacket(buffer, 389, chaindata, skindata);
  36. ByteBuf source = PooledByteBufAllocator.DEFAULT.buffer(1, 55900);
  37. VarInts.writeUnsignedInt(source, buffer.readableBytes());
  38. source.writeBytes(buffer);
  39. buffer.release();
  40. try {
  41. source = zlib.deflate(source);
  42. } catch (DataFormatException e) {
  43. e.printStackTrace();
  44. }
  45. ByteBuf finalpayload = PooledByteBufAllocator.DEFAULT.directBuffer(source.readableBytes() + 9);
  46. finalpayload.writeByte(0xfe);
  47. finalpayload.writeBytes(source);
  48. source.release();
  49. EncapsulatedPacket[] packets = createEncapsulated(finalpayload);
  50. finalpayload.release();
  51. return packets;
  52. }
  53. public static byte[] BytebufferToArray(ByteBuf buf) {
  54. byte[] bytes = new byte[buf.readableBytes()];
  55. for (int i = 0;i < bytes.length;i++) {
  56. bytes[i] = buf.getByte(i);
  57. }
  58. return bytes;
  59. }
  60. private static EncapsulatedPacket[] createEncapsulated(ByteBuf buffer) {
  61. int maxLength = 1463;
  62. RakNetPriority priority = RakNetPriority.MEDIUM;
  63. RakNetReliability reliability = RakNetReliability.RELIABLE_ORDERED;
  64. int orderingChannel = 0;
  65. int splitIndexUpdater = 0;
  66. ByteBuf[] buffers;
  67. int splitId = 0;
  68.  
  69. if (buffer.readableBytes() > maxLength) {
  70. // Packet requires splitting
  71. // Adjust reliability
  72. switch (reliability) {
  73. case UNRELIABLE:
  74. reliability = RakNetReliability.RELIABLE;
  75. break;
  76. case UNRELIABLE_SEQUENCED:
  77. reliability = RakNetReliability.RELIABLE_SEQUENCED;
  78. break;
  79. case UNRELIABLE_WITH_ACK_RECEIPT:
  80. reliability = RakNetReliability.RELIABLE_WITH_ACK_RECEIPT;
  81. break;
  82. }
  83.  
  84. int split = ((buffer.readableBytes() - 1) / maxLength) + 1;
  85. buffer.retain(split);
  86.  
  87. buffers = new ByteBuf[split];
  88. for (int i = 0; i < split; i++) {
  89. buffers[i] = buffer.readSlice(Math.min(maxLength, buffer.readableBytes()));
  90. }
  91. if (buffer.isReadable()) {
  92. throw new IllegalStateException("Buffer still has bytes to read!");
  93. }
  94.  
  95. // Allocate split ID
  96. splitId = splitIndexUpdater;
  97. splitIndexUpdater++;
  98. } else {
  99. buffers = new ByteBuf[]{buffer.readRetainedSlice(buffer.readableBytes())};
  100. }
  101.  
  102. // Set meta
  103. int orderingIndex = 2;
  104. // Now create the packets.
  105. int reliabilityIndex = 3;
  106. EncapsulatedPacket[] packets = new EncapsulatedPacket[buffers.length];
  107. for (int i = 0, parts = buffers.length; i < parts; i++) {
  108. EncapsulatedPacket packet = new EncapsulatedPacket();
  109. packet.buffer = buffers[i];
  110. packet.orderingChannel = (short) orderingChannel;
  111. packet.orderingIndex = orderingIndex;
  112. //packet.setSequenceIndex(sequencingIndex);
  113. packet.reliability = reliability;
  114. packet.priority = priority;
  115. packet.reliabilityIndex = reliabilityIndex;
  116. reliabilityIndex++;
  117. if (parts > 1) {
  118. packet.split = true;
  119. packet.partIndex = i;
  120. packet.partCount = parts;
  121. packet.partId = splitId;
  122. }
  123. packets[i] = packet;
  124. }
  125. return packets;
  126. }
  127. public static String getString(int l) {
  128. String allowed = "abcdefghijklmopqrstuvwxyz123456789";
  129. String out = "";
  130. for (int i = 0;i < l;i++) {
  131. out += String.valueOf(allowed.charAt(RAND.nextInt(allowed.length() - 1)));
  132. }
  133. return out;
  134. }
  135. public static void writeLEAsciiString(ByteBuf buffer, AsciiString string) {
  136. buffer.writeIntLE(string.length());
  137. buffer.writeBytes(string.toByteArray());
  138. }
  139. }
Add Comment
Please, Sign In to add comment