diff --git a/LV7{YX10AQ5TW@E~308_0JN.png b/LV7{YX10AQ5TW@E~308_0JN.png new file mode 100644 index 000000000..ea6b1fd3c Binary files /dev/null and b/LV7{YX10AQ5TW@E~308_0JN.png differ diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt index 0d97271e5..258aff770 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/Protocol.kt @@ -49,8 +49,21 @@ interface Protocol { const val _0836_622_fix1 = "03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19"; const val _0836key1 = "EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA" + private val hexToByteArrayCacheMap: MutableMap = mutableMapOf() + @ExperimentalUnsignedTypes - fun hexToBytes(hex: String): ByteArray = hexToUBytes(hex).toByteArray() + fun hexToBytes(hex: String): ByteArray { + hex.hashCode().let { id -> + if (hexToByteArrayCacheMap.containsKey(id)) { + return hexToByteArrayCacheMap[id]!!.clone() + } else { + hexToUBytes(hex).toByteArray().let { + hexToByteArrayCacheMap[id] = it.clone(); + return it + } + } + } + } @ExperimentalUnsignedTypes fun hexToUBytes(hex: String): UByteArray = Arrays diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt index 8161f9b44..c7534895d 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt @@ -10,12 +10,12 @@ import net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePa import net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePacketEncrypted import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted -import net.mamoe.mirai.util.getRandomKey -import net.mamoe.mirai.util.toHexString +import net.mamoe.mirai.util.* import net.mamoe.mirai.utils.MiraiLogger import java.net.DatagramPacket import java.net.DatagramSocket import java.net.InetSocketAddress +import java.util.* /** * A robot account. @@ -97,15 +97,39 @@ class Robot(val number: Int, private val password: String) { //是ClientPasswordSubmissionPacket之后服务器回复的 is ServerLoginResponseResendPacket -> { - if (packet.token00BA != null) { - this.token00BA = packet.token00BA!! - println(token00BA) + if (packet.tokenUnknown != null) { + //this.token00BA = packet.token00BA!! + //println("token00BA changed!!! to " + token00BA.toUByteArray()) } if (packet.flag == ServerLoginResponseResendPacket.Flag.`08 36 31 03`) { this.tgtgtKey = packet.tgtgtKey - sendPacket(ClientLoginResendPacket3104(this.number, this.password, this.loginTime, this.loginIP, this.tgtgtKey!!, this.token0825, this.token00BA, packet._0836_tlv0006_encr)) + sendPacket(ClientLoginResendPacket3104( + this.number, + this.password, + this.loginTime, + this.loginIP, + this.tgtgtKey!!, + this.token0825, + when (packet.tokenUnknown != null) { + true -> packet.tokenUnknown!! + false -> this.token00BA + }, + packet._0836_tlv0006_encr + )) } else { - sendPacket(ClientLoginResendPacket3106(this.number, this.password, this.loginTime, this.loginIP, this.tgtgtKey!!, this.token0825, this.token00BA, packet._0836_tlv0006_encr)) + sendPacket(ClientLoginResendPacket3106( + this.number, + this.password, + this.loginTime, + this.loginIP, + this.tgtgtKey!!, + this.token0825, + when (packet.tokenUnknown != null) { + true -> packet.tokenUnknown!! + false -> this.token00BA + }, + packet._0836_tlv0006_encr + )) } } @@ -126,8 +150,10 @@ class Robot(val number: Int, private val password: String) { @ExperimentalUnsignedTypes fun sendPacket(packet: ClientPacket) { + sendPacketDebug(packet); + if (true) return; try { - MiraiLogger log "Encoding" + //MiraiLogger log "Encoding" packet.encode() } catch (e: Exception) { e.printStackTrace() @@ -137,12 +163,45 @@ class Robot(val number: Int, private val password: String) { p.socketAddress = this.serverAddress*/ //ctx.writeAndFlush(packet.toByteArray()).sync() MiraiLogger info "Sending: $packet" + packet.logging() + packet.toByteArray().packetSentDebugLogging() //GlobalScope.launch { - send(packet.toByteArray()) + send(packet.toByteArray()) //} //println(channel!!.writeAndFlush(packet.toByteArray()).channel().connect(serverAddress).sync().get()) } + val packetQueue: MutableList = LinkedList() + + init { + packetQueue.add("02 37 13 08 25 31 01 76 E4 B8 DD 00 00 00 13 46 E6 ED CE BF 3B EC 4C A0 B9 0C 84 D5 88 5C DE 99 7A 64 CF CF 59 35 C5 58 AE BD 0B F5 94 65 25 9E 23 01 88 BF D5 B5 51 DC AA 45 C5 97 8E 40 14 0F 46 50 31 CF 1C CB 10 28 33 F7 40 93 A9 B0 F3 EA 18 51 14 FD 61 C3 FD E3 A3 D8 1B 20 6F 60 EA 47 28 91 87 94 2E 5A E4 0A 4D 4D B7 14 57 03 E7 9D D7 28 E2 F4 59 62 34 89 19 1E 10 B8 90 97 C3 11 8A FE D6 3A 9A D8 03") + packetQueue.add("02 37 13 08 25 31 02 76 E4 B8 DD 00 00 00 80 96 0C 13 5F 40 31 75 D6 13 3D 59 65 F0 7A 1E 03 22 0B F1 BE F4 D8 BB 46 6C 2E 55 39 A1 05 8B 85 4E A4 D4 F3 A9 D6 CC CA 4D 2E 1A F2 E4 1D 49 4D 1F 23 66 BB 60 92 17 EC D3 35 32 93 E2 3D 8A A0 CE 3C 83 66 1F 0A A0 9A C7 11 91 8E E5 06 54 09 DE 1D 88 6C 0F 16 EB BC 7B 95 BF 71 A2 71 2B 21 F8 AD C8 03 C0 54 DE 03") + packetQueue.add("02 37 13 08 36 31 03 76 E4 B8 DD 00 00 00 BD 57 C9 45 45 E4 52 BE DA 05 67 A3 49 0F B7 90 AD 3E 47 34 A9 A8 B3 D9 82 E1 45 95 A4 41 F0 66 56 20 D5 0C B7 AF 9E A3 3A 32 FE 89 B2 0A AD 81 EC D0 D1 7A 17 00 51 5E FA BD 75 D1 DB E9 12 DC 89 25 A8 6D 80 F4 00 21 68 70 A0 77 E3 EF FA 9C 80 25 47 5B 55 E1 A0 1D D9 6B FE B7 7F 6A 3B 67 45 A5 F1 CE 33 F4 43 67 1D FD 83 F6 88 9F 2E 7E F3 8B 0E DE 68 76 B1 48 9A 5C B2 B2 8D 12 E3 FA CE 0F 22 F1 7C 20 4D AD 01 09 36 C6 64 3A BE CA 33 68 46 19 8A A9 66 7A 13 DC F2 EE 04 91 74 FB CB 57 B5 48 84 BF 99 24 3C 1E 5C 04 56 F1 28 E1 49 95 0D 71 39 FB A2 AE EE C5 E6 99 91 A3 A3 59 48 CA DE 10 66 F2 FA 88 D8 6F 46 2B B3 F4 33 C0 64 92 92 99 83 06 43 C2 3C FC 0F 34 38 7C 0F F8 3C 35 D0 CD 23 05 06 5B 61 B3 AD 38 D9 E2 5F 51 A4 A0 CA AF 4A A9 86 11 C9 AC 2C 44 11 08 52 E3 3C 0D 1B 91 B6 C6 70 FC 15 CC 16 F6 3B C9 97 C0 82 D1 8B 24 2F AA 35 50 61 E9 11 F8 E1 09 29 B9 20 5E 3A 73 33 BF 78 9C CC D0 A7 BF 23 66 65 3B D1 1F 71 40 C2 E2 0D CA 6F 57 D8 E1 46 B6 47 65 9E 43 04 0E 30 54 EB 70 42 49 6F 75 55 C5 63 3A A4 9D FF 0B F8 56 3B 89 74 14 56 6B 6E 9D 32 D4 DD FA E7 C6 B2 6B 61 F0 54 EF 05 7E E1 49 D6 38 A0 C1 B3 F6 B4 7A 4A 03 31 1D E7 88 BA 56 9D 50 03 95 FF DB 23 DC 3C B9 51 1B 4B 06 1E 5E C5 B1 96 EA 8B 64 92 48 24 65 A4 92 EC BA 90 42 AD BA 04 81 4F 42 FB 41 60 E9 93 68 1F 59 67 57 57 5F 40 22 1B F2 D9 C5 5D 53 34 2C E4 82 ED D2 A8 3B F1 C2 05 2A 4D F9 45 63 21 E7 92 5A 01 D4 A4 3A 98 D8 57 39 34 D4 E2 CC F6 D1 76 12 76 00 A5 89 18 66 9C F9 18 31 52 E6 92 B2 11 46 73 8D 37 92 99 7A 3B FC 82 36 A1 7A 7B 91 D0 F7 59 C2 64 76 7A 4F 7E 88 8A AF 11 AA 90 5C 0D E2 9F F7 A8 9B 04 A7 05 48 EC 92 01 2A 19 0E 8C A7 1B 9C 1F B2 F8 BD C5 AE 98 D5 86 C7 C6 D2 D5 BC B5 BB D7 F9 05 52 F1 5A 6D B5 94 2C 44 86 11 A9 B3 EB 9D D7 30 BF 21 1F 22 2D FB AC 0C 5C 94 C4 69 C2 82 C8 48 6C 86 40 95 EF 67 9B B1 60 17 09 56 AE CB 85 EF FD 60 7D BA A3 1D 13 05 10 93 ED 5D 91 6B 3B 8C 23 C4 45 EF 02 BA 86 0E F7 8E 46 C7 3D 07 8A 67 94 3B 5C 4B 05 BD 64 76 DF 1A 3B A5 C9 26 AA F6 A5 36 4E EC 00 AD D8 B7 5E 32 53 02 9F CF 3C 23 9C 94 BB 03 F8 97 9F 53 CC A0 68 77 4D A4 DE D0 CE DE 68 FC A2 07 A5 9E 65 28 E2 A2 95 E0 1D 45 11 47 E9 03 1A BE F5 1F 48 36 37 B8 EA EA 6B 9C 73 93 7D 21 CA 77 F7 62 73 BF BA 54 BB C2 38 0C 04 68 A4 E0 05 98 18 6E 5D EC 40 EE 54 27 9C 67 5C 79 5D 89 3C 4F DC 29 50 46 87 D9 EB F9 12 03") + } + + + @ExperimentalUnsignedTypes + fun sendPacketDebug(packet: ClientPacket) { + try { + //MiraiLogger log "Encoding" + packet.encode() + } catch (e: Exception) { + e.printStackTrace() + } + packet.writeHex(Protocol.tail) + /*val p = DatagramPacket(packet.toByteArray()); + p.socketAddress = this.serverAddress*/ + //ctx.writeAndFlush(packet.toByteArray()).sync() + MiraiLogger info "Sending: $packet" + packet.logging() + packet.toByteArray().packetSentDebugLogging() + //GlobalScope.launch { + this.onPacketReceived(ServerPacket.ofByteArray(packetQueue.removeAt(0).hexToBytes())) + //send(packet.toByteArray()) + //}a + //println(channel!!.writeAndFlush(packet.toByteArray()).channel().connect(serverAddress).sync().get()) + } + // private val socket = DatagramSocket(15314) @ExperimentalUnsignedTypes @@ -153,7 +212,7 @@ class Robot(val number: Int, private val password: String) { val dp1 = DatagramPacket(ByteArray(22312), 22312) socket.send(DatagramPacket(data, data.size)) - MiraiLogger info "Packet sent: ${data.toUByteArray().toHexString()}" + MiraiLogger info "Packet sent: ${data.toUByteArray().toUHexString()}" socket.receive(dp1) val zeroByte: Byte = 0 var i = dp1.data.size - 1; @@ -164,6 +223,9 @@ class Robot(val number: Int, private val password: String) { onPacketReceived(ServerPacket.ofByteArray(dp1.data.copyOfRange(0, i + 1))) } catch (e: Exception) { e.printStackTrace() + repeat(100) { println() } + println(DebugLogger.buff.toString()) + System.exit(1) } } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt index 4dd63a1bd..c1d557cd8 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt @@ -53,7 +53,15 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet { } override fun toString(): String { - return this.javaClass.simpleName + this.getAllDeclaredFields().joinToString(", ", "{", "}") { it.trySetAccessible(); it.name + "=" + it.get(this) } + return this.javaClass.simpleName + this.getAllDeclaredFields().joinToString(", ", "{", "}") { + it.trySetAccessible(); it.name + "=" + it.get(this).let { value -> + when (value) { + is ByteArray -> value.toUHexString() + is UByteArray -> value.toUHexString() + else -> value.toString() + } + } + } } } @@ -128,8 +136,8 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, log val md5_1 = md5(password); val md5_2 = md5(md5_1 + "00 00 00 00".hexToBytes() + qq.toByteArray()) - println(md5_1.toUByteArray().toHexString()) - println(md5_2.toUByteArray().toHexString()) + println(md5_1.toUByteArray().toUHexString()) + println(md5_2.toUByteArray().toUHexString()) it.write(md5_1) it.writeInt(loginTime) it.writeByte(0); @@ -147,7 +155,7 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, log @ExperimentalUnsignedTypes fun main() { - println(lazyEncode { it.writeTLV0006(1994701021, "D1 A5 C8 BB E1 Q3 CC DD", 131513, "123.123.123.123", "AA BB CC DD EE FF AA BB CC".hexToBytes()) }.toUByteArray().toHexString()) + println(lazyEncode { it.writeTLV0006(1994701021, "D1 A5 C8 BB E1 Q3 CC DD", 131513, "123.123.123.123", "AA BB CC DD EE FF AA BB CC".hexToBytes()) }.toUByteArray().toUHexString()) } @ExperimentalUnsignedTypes @@ -190,7 +198,7 @@ fun Int.toLByteArray(): ByteArray = byteArrayOf( ) @ExperimentalUnsignedTypes -fun Int.toHexString(separator: String = " "): String = this.toByteArray().toUByteArray().toHexString(separator); +fun Int.toHexString(separator: String = " "): String = this.toByteArray().toUByteArray().toUHexString(separator); private fun md5(str: String): ByteArray = MessageDigest.getInstance("MD5").digest(str.toByteArray()) diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientLoginPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientLoginPacket.kt index 3bec8495b..bc2a75ec6 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientLoginPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientLoginPacket.kt @@ -14,6 +14,7 @@ import java.net.InetAddress */ @PacketId("08 36 31 03") @ExperimentalUnsignedTypes +@TestedSuccessfully class ClientPasswordSubmissionPacket( private val qq: Int, private val password: String, @@ -38,8 +39,34 @@ class ClientPasswordSubmissionPacket( } } +fun main() { + val loginTime = "5D 60 F6 33".hexToInt() + println(loginTime) + + val loginIP = "AB 70 E2 96".let { it.split(" ").map { it.hexToByte() }.joinToString(".") { it.toString() } } + + + val tgtgtKey = "68 25 55 61 52 66 4A 54 71 6A 71 5A 24 50 27 6D".hexToBytes() + + val token0825 = "56 3A E4 8B B4 64 D2 72 60 FE 01 54 FC B1 5F 88 E0 BA 64 1A 55 F2 84 FC 97 D0 BF 5F 47 A8 D9 76 BB FB 4A 7A F3 5E 0E A4 8E CA 8F 27 C2 02 6E 5D E7 68 9F 7C CF 91 83 F4".hexToBytes() + val token00ba = "57 3A 37 C3 FB A0 C3 E5 AE F3 0E B6 03 DE BF 9E E2 B5 C5 FE A0 F0 03 4F F7 8A 5C 29 5C E0 5A A2 89 D5 3F 60 E2 B2 81 FE D4 16 04 D4 E3 C6 4A D7 A9 D9 E6 FC 2E 7E 0C F3".hexToBytes() + val tlv_0006_encr = "0D DF 92 9C 5A 08 D1 67 FD 7D D6 DE CE D0 92 39 79 17 53 57 41 9B D6 D3 F9 F8 9A 3B E1 C2 3A E7 CF 02 6E 5E 36 B7 6D CF 33 66 77 FE AC 58 93 A3 85 E7 AF 6F 2D A2 74 E2 60 28 4B 29 17 04 79 95 39 D4 BF 4D C1 ED 61 49 13 23 9D 71 62 29 AF 87 D7 E3 42 49 88 3F D8 5C DB 9F 9E 5A 2A EA 02 F6 4F 2B D3 5B AF BE 0C B2 54 46 AE 99 1B 07 0B BE 6A C2 29 18 25 6A 95 0A".hexToBytes() + + + ClientLoginResendPacket3104( + 1994701021, + "xiaoqqq", + loginTime, + loginIP, + tgtgtKey, + token0825, + token00ba, + tlv_0006_encr + ).let { it.encode();println(it.toUByteArray().toUHexString()) } +} + @PacketId("08 36 31 04") -@ExperimentalUnsignedTypes +@ExperimentalUnsignedTypes//todo 测试出来这个包长度有问题 class ClientLoginResendPacket3104(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null) : ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr) @PacketId("08 36 31 06") @@ -47,7 +74,16 @@ class ClientLoginResendPacket3104(qq: Int, password: String, loginTime: Int, log class ClientLoginResendPacket3106(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null) : ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr) @ExperimentalUnsignedTypes -open class ClientLoginResendPacket internal constructor(val qq: Int, val password: String, val loginTime: Int, val loginIP: String, val tgtgtKey: ByteArray, val token0825: ByteArray, val token00BA: ByteArray, val tlv_0006_encr: ByteArray? = null) : ClientPacket() { +open class ClientLoginResendPacket internal constructor( + val qq: Int, + val password: String, + val loginTime: Int, + val loginIP: String, + val tgtgtKey: ByteArray, + val token0825: ByteArray, + val token00BA: ByteArray, + val tlv_0006_encr: ByteArray? = null +) : ClientPacket() { override fun encode() { this.writeQQ(qq) this.writeHex(Protocol._0836_622_fix1) @@ -72,9 +108,6 @@ open class ClientLoginResendPacket internal constructor(val qq: Int, val passwor } } -fun main() { - println(InetAddress.getLocalHost().hostAddress) -} @ExperimentalUnsignedTypes @PacketId("08 28 04 34") @@ -180,7 +213,7 @@ private fun DataOutputStream.writePart2() { this.writeHex("05 08")//tag this.writeHex("00 05")//length - this.writeHex("10 00 00 00 00")//value + this.writeHex("01 00 00 00 00")//value this.writeHex("03 13")//tag this.writeHex("00 19")//length diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientTouchPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientTouchPacket.kt index 7e2a9f02d..32a3e5fde 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientTouchPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientTouchPacket.kt @@ -8,7 +8,7 @@ import net.mamoe.mirai.network.packet.client.writeIP import net.mamoe.mirai.network.packet.client.writeQQ import net.mamoe.mirai.util.ByteArrayDataOutputStream import net.mamoe.mirai.util.TEACryptor -import net.mamoe.mirai.util.toHexString +import net.mamoe.mirai.util.toUHexString import java.io.IOException /** @@ -23,7 +23,7 @@ class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() { @ExperimentalUnsignedTypes @Throws(IOException::class) override fun encode() { - //println(this.toUByteArray().toHexString(" ")) + //println(this.toUByteArray().toUHexString(" ")) //exitProcess(1) this.writeQQ(qq) @@ -43,7 +43,7 @@ class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() { //this.writeIP("123456789") this.writeHex("00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 00 19") this.writeHex(Protocol.publicKey) - println(super.toUByteArray().toHexString()) + println(super.toUByteArray().toUHexString()) return super.toByteArray() } }.toByteArray())) @@ -58,7 +58,7 @@ fun main() { pk.encode() pk.writeHex(Protocol.tail) //println("pk.toByteArray() = " + pk.toUByteArray().contentToString()) - println(pk.toUByteArray().toHexString(" ")) + println(pk.toUByteArray().toUHexString(" ")) /* println(object : ByteArrayDataOutputStream() { @@ -67,7 +67,7 @@ fun main() { this.writeInt(1994701021) return super.toUByteArray() } - }.toUByteArray().toHexString())*/ + }.toUByteArray().toUHexString())*/ /* @@ -85,7 +85,7 @@ fun main() { this.writeHex(Protocol.publicKey) return super.toUByteArray() } - }.toUByteArray().toHexString(" ")) + }.toUByteArray().toUHexString(" ")) */ } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt index 762a6d52d..32e8df3c2 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt @@ -6,7 +6,7 @@ import net.mamoe.mirai.network.packet.server.login.* import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted import net.mamoe.mirai.util.getAllDeclaredFields -import net.mamoe.mirai.util.toHexString +import net.mamoe.mirai.util.toUHexString import java.io.DataInputStream /** @@ -20,7 +20,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { @ExperimentalUnsignedTypes fun ofByteArray(bytes: ByteArray): ServerPacket { - println("Raw received: ${bytes.toUByteArray().toHexString()}") + println("Raw received: ${bytes.toUByteArray().toUHexString()}") val stream = bytes.dataInputStream() @@ -41,7 +41,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { } if (bytes.size > 700) { - return ServerLoginResponseSuccessPacketEncrypted(stream, bytes.size) + return ServerLoginResponseSuccessPacketEncrypted(stream) } return ServerLoginResponseFailedPacket(when (bytes.size) { @@ -53,7 +53,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { 359 -> ServerLoginResponseFailedPacket.State.TAKEN_BACK //unknown - 63 -> throw IllegalArgumentException(bytes.size.toString()) + 63 -> throw IllegalArgumentException(bytes.size.toString())//可能是已经完成登录, 服务器拒绝第二次登录 351 -> throw IllegalArgumentException(bytes.size.toString()) else -> throw IllegalArgumentException(bytes.size.toString()) @@ -169,7 +169,15 @@ DataArrived >> AnalyMessage } override fun toString(): String { - return this.javaClass.simpleName + this.getAllDeclaredFields().joinToString(", ", "{", "}") { it.trySetAccessible(); it.name + "=" + it.get(this) } + return this.javaClass.simpleName + this.getAllDeclaredFields().joinToString(", ", "{", "}") { + it.trySetAccessible(); it.name + "=" + it.get(this).let { value -> + when (value) { + is ByteArray -> value.toUHexString() + is UByteArray -> value.toUHexString() + else -> value?.toString() + } + } + } } } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseResendPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseResendPacket.kt index 1a336c2ae..97e453bc9 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseResendPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseResendPacket.kt @@ -5,6 +5,9 @@ import net.mamoe.mirai.network.packet.server.ServerPacket import net.mamoe.mirai.network.packet.server.dataInputStream import net.mamoe.mirai.network.packet.server.goto import net.mamoe.mirai.util.TEACryptor +import net.mamoe.mirai.util.TestedSuccessfully +import net.mamoe.mirai.util.hexToUBytes +import net.mamoe.mirai.util.toUHexString import java.io.DataInputStream /** @@ -18,18 +21,21 @@ class ServerLoginResponseResendPacket(input: DataInputStream, val flag: Flag) : } lateinit var _0836_tlv0006_encr: ByteArray; - var token00BA: ByteArray? = null + var tokenUnknown: ByteArray? = null lateinit var tgtgtKey: ByteArray + @TestedSuccessfully override fun decode() { this.input.skip(5) tgtgtKey = this.input.readNBytes(16)//22 - this.input.skip(3)//25 + println(tgtgtKey.toUHexString()) + this.input.skip(2)//25 _0836_tlv0006_encr = this.input.readNBytes(120) when (flag) { Flag.`08 36 31 03` -> { - token00BA = this.input.goto(153).readNBytes(56) + tokenUnknown = this.input.goto(153).readNBytes(56) + println(tokenUnknown!!.toUHexString()) } Flag.OTHER -> { @@ -46,11 +52,26 @@ class ServerLoginResponseResendPacketEncrypted(input: DataInputStream, private v } + @TestedSuccessfully fun decrypt(tgtgtKey: ByteArray): ServerLoginResponseResendPacket { + //this.input.skip(7) this.input goto 14 var data: ByteArray = this.input.readAllBytes() data = TEACryptor.CRYPTOR_SHARE_KEY.decrypt(data.let { it.copyOfRange(0, it.size - 1) }); - data = TEACryptor.decrypt(data, tgtgtKey); + data = TEACryptor.decrypt(data, tgtgtKey) return ServerLoginResponseResendPacket(data.dataInputStream(), flag) } +} + +fun main() { + val tgtgtkey = "9E 83 61 FF 18 61 4B 77 34 FE 1C 9C E2 03 B4 F2".hexToUBytes() + + ServerLoginResponseResendPacketEncrypted("02 37 13 08 36 31 03 76 E4 B8 DD 00 00 00 94 9B 87 00 87 7F 9E D0 E5 6A F6 17 41 02 0C AA F3 AC C8 CF 4E C6 9D EC FA 6C BD F8 7C 4B A5 28 80 CC DE B5 0A 41 8E 63 CE 5E 30 D8 A6 83 92 0E 2E 5C 35 E5 6E 62 3D FE 17 DD 7C 47 9A AD EF F0 F7 2A 6F 21 32 99 1B 6D E1 DA BE 68 2F 26 A9 93 DE 1B 4F 11 F0 AF A1 06 7B 85 53 46 D2 A3 DD A6 BE F2 76 8A 61 BF 15 FD 17 C4 45 DB EC 05 51 56 46 63 48 87 49 79 0D 40 DF 9D D9 99 93 EC D0 44 7B 4A 79 EB BD 08 10 18 29 0E 85 EE 26 A0 CD 40 00 2F 3E ED F4 A4 C3 01 5E 82 F5 A8 02 FA 70 EB F2 07 AD FF 0E DA 08 7A 3A FE B6 F4 5D 98 18 F7 58 C2 19 21 AF 29 D2 95 16 CE C4 A3 5F B0 E6 23 C2 B2 C6 5F 03 42 C2 44 C2 B0 A0 3F 95 8E 89 EF FC EC E4 BF 03 CB DA 9C D3 84 3F 9B A0 F1 B4 14 6E 23 D5 74 79 6F 89 DA B8 33 DB EF 0B 21 E1 27 27 57 8B 56 CB D9 BF C2 A8 25 6E 48 23 EB 31 9D 03".hexToUBytes().toByteArray().dataInputStream(), ServerLoginResponseResendPacket.Flag.`08 36 31 03`).decrypt(tgtgtkey.toByteArray()).let { it.decode();println(it._0836_tlv0006_encr.toUHexString()) } + + val data = "94 9B 87 00 87 7F 9E D0 E5 6A F6 17 41 02 0C AA F3 AC C8 CF 4E C6 9D EC FA 6C BD F8 7C 4B A5 28 80 CC DE B5 0A 41 8E 63 CE 5E 30 D8 A6 83 92 0E 2E 5C 35 E5 6E 62 3D FE 17 DD 7C 47 9A AD EF F0 F7 2A 6F 21 32 99 1B 6D E1 DA BE 68 2F 26 A9 93 DE 1B 4F 11 F0 AF A1 06 7B 85 53 46 D2 A3 DD A6 BE F2 76 8A 61 BF 15 FD 17 C4 45 DB EC 05 51 56 46 63 48 87 49 79 0D 40 DF 9D D9 99 93 EC D0 44 7B 4A 79 EB BD 08 10 18 29 0E 85 EE 26 A0 CD 40 00 2F 3E ED F4 A4 C3 01 5E 82 F5 A8 02 FA 70 EB F2 07 AD FF 0E DA 08 7A 3A FE B6 F4 5D 98 18 F7 58 C2 19 21 AF 29 D2 95 16 CE C4 A3 5F B0 E6 23 C2 B2 C6 5F 03 42 C2 44 C2 B0 A0 3F 95 8E 89 EF FC EC E4 BF 03 CB DA 9C D3 84 3F 9B A0 F1 B4 14 6E 23 D5 74 79 6F 89 DA B8 33 DB EF 0B 21 E1 27 27 57 8B 56 CB D9 BF C2 A8 25 6E 48 23 EB 31 9D".hexToUBytes() + + val d1 = TEACryptor.CRYPTOR_SHARE_KEY.decrypt(data.toByteArray()) + + ServerLoginResponseResendPacket(TEACryptor.decrypt(d1, tgtgtkey.toByteArray()).dataInputStream(), ServerLoginResponseResendPacket.Flag.`08 36 31 03`).let { it.decode();println(it._0836_tlv0006_encr.toUHexString()) } + } \ No newline at end of file diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseSuccessPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseSuccessPacket.kt index ba77b2cf0..d840ca29a 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseSuccessPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseSuccessPacket.kt @@ -7,7 +7,7 @@ import net.mamoe.mirai.network.packet.server.readNBytes import net.mamoe.mirai.network.packet.server.readVarString import net.mamoe.mirai.util.TEACryptor import net.mamoe.mirai.util.hexToBytes -import net.mamoe.mirai.util.toHexString +import net.mamoe.mirai.util.toUHexString import java.io.DataInputStream /** @@ -41,7 +41,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen //?? var b = this.input.readNBytes(2) - val msgLength = when (b.toUByteArray().toHexString()) { + val msgLength = when (b.toUByteArray().toUHexString()) { "01 07" -> 0 "00 33" -> 28 "01 10" -> 65 @@ -99,7 +99,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen this.token38 = this.input.readNBytes(56)//82 this.input.skip(60L)//142 - val msgLength = when (val id = this.input.readNBytes(2).toUByteArray().toHexString()) { + val msgLength = when (val id = this.input.readNBytes(2).toUByteArray().toUHexString()) { "01 07" -> 0 "00 33" -> 28 "01 10" -> 64 @@ -119,19 +119,19 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen } } -class ServerLoginResponseSuccessPacketEncrypted(input: DataInputStream, val length: Int) : ServerPacket(input) { +class ServerLoginResponseSuccessPacketEncrypted(input: DataInputStream) : ServerPacket(input) { override fun decode() { } @ExperimentalUnsignedTypes - fun decrypt(tgtgtKey: ByteArray): ServerLoginResponseSuccessPacket {//todo test - input.skip(7) - var bytes = input.readAllBytes(); - bytes = bytes.copyOfRange(0, bytes.size - 1); - println(bytes.toUByteArray().toHexString()) + fun decrypt(tgtgtKey: ByteArray): ServerLoginResponseSuccessPacket { + input goto 14 + var bytes = input.readAllBytes() + bytes = bytes.copyOfRange(0, bytes.size - 1) + println(bytes.toUByteArray().toUHexString()) - return ServerLoginResponseSuccessPacket(DataInputStream(TEACryptor.decrypt(bytes, Protocol.shareKey.hexToBytes()).inputStream()), length); + return ServerLoginResponseSuccessPacket(DataInputStream(TEACryptor.decrypt(TEACryptor.decrypt(bytes, Protocol.shareKey.hexToBytes()), tgtgtKey).inputStream()), bytes.size); //TeaDecrypt(取文本中间(data, 43, 取文本长度(data) - 45), m_0828_rec_decr_key) } } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseVerificationCodePacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseVerificationCodePacket.kt index 00d4b46aa..6664fef58 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseVerificationCodePacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseVerificationCodePacket.kt @@ -4,7 +4,7 @@ import net.mamoe.mirai.network.packet.server.ServerPacket import net.mamoe.mirai.network.packet.server.dataInputStream import net.mamoe.mirai.network.packet.server.goto import net.mamoe.mirai.util.TEACryptor -import net.mamoe.mirai.util.toHexString +import net.mamoe.mirai.util.toUHexString import java.io.DataInputStream /** @@ -31,7 +31,7 @@ class ServerLoginResponseVerificationCodePacket(input: DataInputStream, val pack this.input.skip(1) val b = this.input.readByte() - println(b.toHexString()) + println(b.toUHexString()) this.token00BA = this.input.goto(packetLength - 60).readNBytes(40) } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/touch/ServerTouchResponsePacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/touch/ServerTouchResponsePacket.kt index 88d4eecfc..684e3d03a 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/touch/ServerTouchResponsePacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/touch/ServerTouchResponsePacket.kt @@ -6,7 +6,7 @@ import net.mamoe.mirai.network.packet.server.readIP import net.mamoe.mirai.util.TEACryptor import net.mamoe.mirai.util.getRandomKey import net.mamoe.mirai.util.hexToBytes -import net.mamoe.mirai.util.toHexString +import net.mamoe.mirai.util.toUHexString import java.io.DataInputStream /** @@ -48,7 +48,7 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp } else -> { - throw IllegalStateException(arrayOf(id.toUByte()).toUByteArray().toHexString()) + throw IllegalStateException(arrayOf(id.toUByte()).toUByteArray().toUHexString()) } } } @@ -64,7 +64,7 @@ class ServerTouchResponsePacketEncrypted(private val type: ServerTouchResponsePa input.skip(7) var bytes = input.readAllBytes(); bytes = bytes.copyOfRange(0, bytes.size - 1); - println(bytes.toUByteArray().toHexString()) + println(bytes.toUByteArray().toUHexString()) return ServerTouchResponsePacket(DataInputStream(TEACryptor.decrypt(bytes, when (type) { ServerTouchResponsePacket.Type.TYPE_08_25_31_02 -> Protocol.redirectionKey.hexToBytes() diff --git a/mirai-core/src/main/java/net/mamoe/mirai/util/DebugLogger.kt b/mirai-core/src/main/java/net/mamoe/mirai/util/DebugLogger.kt new file mode 100644 index 000000000..07a3845e4 --- /dev/null +++ b/mirai-core/src/main/java/net/mamoe/mirai/util/DebugLogger.kt @@ -0,0 +1,34 @@ +package net.mamoe.mirai.util + +import net.mamoe.mirai.network.packet.client.ClientPacket +import net.mamoe.mirai.network.packet.server.ServerPacket + +/** + * @author Him188moe + */ +object DebugLogger { + val buff = StringBuilder() +} + + +fun ByteArray.encryptionDebugLogging() { + DebugLogger.buff.append("TEA encrypt: " + this.toUHexString()).append("\n") +} + +fun ByteArray.packetSentDebugLogging() { + DebugLogger.buff.append("packet sent: " + this.toUHexString()).append("\n") +} + +fun ByteArray.decryptionDebugLogging() { + DebugLogger.buff.append("TEA decrypted: " + this.toUHexString()).append("\n") +} + +fun ServerPacket.logging() { + DebugLogger.buff.append(this.toString()) + +} + +@ExperimentalUnsignedTypes +fun ClientPacket.logging() { + DebugLogger.buff.append(this.toString()) +} \ No newline at end of file diff --git a/mirai-core/src/main/java/net/mamoe/mirai/util/TEACryptor.java b/mirai-core/src/main/java/net/mamoe/mirai/util/TEACryptor.java index 48442db38..3651b975e 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/util/TEACryptor.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/util/TEACryptor.java @@ -239,11 +239,13 @@ public class TEACryptor { } public byte[] encrypt(byte[] plaintext) { + DebugLoggerKt.encryptionDebugLogging(plaintext); System.out.println("TEA加密, 原文=" + UtilsKt.toUHexString(plaintext)); return encrypt(plaintext, 0, plaintext.length); } public byte[] decrypt(byte[] ciphertext) { + DebugLoggerKt.decryptionDebugLogging(ciphertext); return decrypt(ciphertext, 0, ciphertext.length); } } \ No newline at end of file diff --git a/mirai-core/src/main/java/net/mamoe/mirai/util/Tested.kt b/mirai-core/src/main/java/net/mamoe/mirai/util/Tested.kt new file mode 100644 index 000000000..6b3e910ee --- /dev/null +++ b/mirai-core/src/main/java/net/mamoe/mirai/util/Tested.kt @@ -0,0 +1,6 @@ +package net.mamoe.mirai.util + +/** + * @author Him188moe + */ +annotation class TestedSuccessfully \ No newline at end of file diff --git a/mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt b/mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt index b13b2ec2a..a884bc561 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt @@ -32,20 +32,23 @@ object Utils { fun ByteArray.toHexString(): String = toHexString(" ") fun ByteArray.toHexString(separator: String = " "): String = Utils.toHexString(this, separator) @ExperimentalUnsignedTypes -fun ByteArray.toUHexString(separator: String = " "): String = this.toUByteArray().toHexString(separator) +fun ByteArray.toUHexString(separator: String = " "): String = this.toUByteArray().toUHexString(separator) @ExperimentalUnsignedTypes -fun ByteArray.toUHexString(): String = this.toUByteArray().toHexString() +fun ByteArray.toUHexString(): String = this.toUByteArray().toUHexString() @ExperimentalUnsignedTypes -fun UByteArray.toHexString(separator: String = " "): String = Utils.toHexString(this, separator) +fun UByteArray.toUHexString(separator: String = " "): String = Utils.toHexString(this, separator) @ExperimentalUnsignedTypes -fun UByteArray.toHexString(): String = toHexString(" ") +fun UByteArray.toUHexString(): String = this.toUHexString(" ") @ExperimentalUnsignedTypes -fun Byte.toHexString(): String = this.toUByte().toString(16) +fun Byte.toUHexString(): String = this.toUByte().toString(16) +/** + * firstly [Protocol.hexToUBytes], secondly [UByteArray.toByteArray] + */ @ExperimentalUnsignedTypes fun String.hexToBytes(): ByteArray = Protocol.hexToBytes(this) @@ -55,6 +58,9 @@ fun String.hexToUBytes(): UByteArray = Protocol.hexToUBytes(this) @ExperimentalUnsignedTypes fun String.hexToShort(): Short = hexToBytes().let { ((it[1].toInt() shl 8) + it[0]).toShort() } +@ExperimentalUnsignedTypes +fun String.hexToInt(): Int = hexToBytes().let { ((it[3].toInt() shl 24) + (it[2].toInt() shl 16) + (it[1].toInt() shl 8) + it[0]) } + @ExperimentalUnsignedTypes fun String.hexToByte(): Byte = hexToBytes()[0] diff --git a/mirai-core/src/main/java/net/mamoe/mirai/util/_TEAEncryption.java b/mirai-core/src/main/java/net/mamoe/mirai/util/_TEAEncryption.java deleted file mode 100644 index 63a9cc0da..000000000 --- a/mirai-core/src/main/java/net/mamoe/mirai/util/_TEAEncryption.java +++ /dev/null @@ -1,456 +0,0 @@ -package net.mamoe.mirai.util; - -import java.io.ByteArrayOutputStream; -import java.util.Random; - -/** - * 加密解密QQ消息的工具类. QQ消息的加密算法是一个16次的迭代过程,并且是反馈的,每一个加密单元是8字节,输出也是8字节,密钥是16字节 - * 我们以prePlain表示前一个明文块,plain表示当前明文块,crypt表示当前明文块加密得到的密文块,preCrypt表示前一个密文块 - * f表示加密算法,d表示解密算法 那么从plain得到crypt的过程是: crypt = f(plain ˆ preCrypt) ˆ - * prePlain 所以,从crypt得到plain的过程自然是 plain = d(crypt ˆ prePlain) ˆ - * preCrypt 此外,算法有它的填充机制,其会在明文前和明文后分别填充一定的字节数,以保证明文长度是8字节的倍数 - * 填充的字节数与原始明文长度有关,填充的方法是: - * - *
- * 
- *
- *      ------- 消息填充算法 -----------
- *      a = (明文长度 + 10) mod 8
- *      if(a 不等于 0) a = 8 - a;
- *      b = 随机数 & 0xF8 | a;              这个的作用是把a的值保存了下来
- *      plain[0] = b;                   然后把b做为明文的第0个字节,这样第0个字节就保存了a的信息,这个信息在解密时就要用来找到真正明文的起始位置
- *      plain[1 至 a+2] = 随机数 & 0xFF;    这里用随机数填充明文的第1到第a+2个字节
- *      plain[a+3 至 a+3+明文长度-1] = 明文; 从a+3字节开始才是真正的明文
- *      plain[a+3+明文长度, 最后] = 0;       在最后,填充0,填充到总长度为8的整数为止。到此为止,结束了,这就是最后得到的要加密的明文内容
- *      ------- 消息填充算法 ------------
- *
- * 
- * 
- * - * @author b - * @author luma - * @author notXX - */ -final class _TEAEncryption { - // 指向当前的明文块 - private byte[] plain; - // 这指向前面一个明文块 - private byte[] prePlain; - // 输出的密文或者明文 - private byte[] out; - // 当前加密的密文位置和上一次加密的密文块位置,他们相差8 - private int crypt, preCrypt; - // 当前处理的加密解密块的位置 - private int pos; - // 填充数 - private int padding; - // 密钥 - private byte[] key; - // 用于加密时,表示当前是否是第一个8字节块,因为加密算法是反馈的 - // 但是最开始的8个字节没有反馈可用,所有需要标明这种情况 - private boolean header = true; - // 这个表示当前解密开始的位置,之所以要这么一个变量是为了避免当解密到最后时 - // 后面已经没有数据,这时候就会出错,这个变量就是用来判断这种情况免得出错 - private int contextStart; - // 随机数对象 - private static Random random = new Random(); - // 字节输出流 - private ByteArrayOutputStream baos; - - /** - * 构造函数 - */ - public _TEAEncryption() { - baos = new ByteArrayOutputStream(8); - } - - /** - * 把字节数组从offset开始的len个字节转换成一个unsigned int, 因为java里面没有unsigned,所以unsigned - * int使用long表示的, 如果len大于8,则认为len等于8。如果len小于8,则高位填0
- * (edited by notxx) 改变了算法, 性能稍微好一点. 在我的机器上测试10000次, 原始算法花费18s, 这个算法花费12s. - * - * @param in 字节数组. - * @param offset 从哪里开始转换. - * @param len 转换长度, 如果len超过8则忽略后面的 - * @return - */ - private static long getUnsignedInt(byte[] in, int offset, int len) { - long ret = 0; - int end = 0; - if (len > 8) - end = offset + 8; - else - end = offset + len; - for (int i = offset; i < end; i++) { - ret <<= 8; - ret |= in[i] & 0xff; - } - return (ret & 0xffffffffL) | (ret >>> 32); - } - - /** - * 解密 - * - * @param in 密文 - * @param offset 密文开始的位置 - * @param len 密文长度 - * @param k 密钥 - * @return 明文 - */ - public byte[] decrypt(byte[] in, int offset, int len, byte[] k) { - // 检查密钥 - if (k == null) - return null; - - crypt = preCrypt = 0; - this.key = k; - int count; - byte[] m = new byte[offset + 8]; - - // 因为QQ消息加密之后至少是16字节,并且肯定是8的倍数,这里检查这种情况 - if ((len % 8 != 0) || (len < 16)) return null; - // 得到消息的头部,关键是得到真正明文开始的位置,这个信息存在第一个字节里面,所以其用解密得到的第一个字节与7做与 - prePlain = decipher(in, offset); - pos = prePlain[0] & 0x7; - // 得到真正明文的长度 - count = len - pos - 10; - // 如果明文长度小于0,那肯定是出错了,比如传输错误之类的,返回 - if (count < 0) return null; - - // 这个是临时的preCrypt,和加密时第一个8字节块没有prePlain一样,解密时 - // 第一个8字节块也没有preCrypt,所有这里建一个全0的 - for (int i = offset; i < m.length; i++) - m[i] = 0; - // 通过了上面的代码,密文应该是没有问题了,我们分配输出缓冲区 - out = new byte[count]; - // 设置preCrypt的位置等于0,注意目前的preCrypt位置是指向m的,因为java没有指针,所以我们在后面要控制当前密文buf的引用 - preCrypt = 0; - // 当前的密文位置,为什么是8不是0呢?注意前面我们已经解密了头部信息了,现在当然该8了 - crypt = 8; - // 自然这个也是8 - contextStart = 8; - // 加1,和加密算法是对应的 - pos++; - - // 开始跳过头部,如果在这个过程中满了8字节,则解密下一块 - // 因为是解密下一块,所以我们有一个语句 m = in,下一块当然有preCrypt了,我们不再用m了 - // 但是如果不满8,这说明了什么?说明了头8个字节的密文是包含了明文信息的,当然还是要用m把明文弄出来 - // 所以,很显然,满了8的话,说明了头8个字节的密文除了一个长度信息有用之外,其他都是无用的填充 - padding = 1; - while (padding <= 2) { - if (pos < 8) { - pos++; - padding++; - } - if (pos == 8) { - m = in; - if (!decrypt8Bytes(in, offset, len)) return null; - } - } - - // 这里是解密的重要阶段,这个时候头部的填充都已经跳过了,开始解密 - // 注意如果上面一个while没有满8,这里第一个if里面用的就是原始的m,否则这个m就是in了 - int i = 0; - while (count != 0) { - if (pos < 8) { - out[i] = (byte) (m[offset + preCrypt + pos] ^ prePlain[pos]); - i++; - count--; - pos++; - } - if (pos == 8) { - m = in; - preCrypt = crypt - 8; - if (!decrypt8Bytes(in, offset, len)) - return null; - } - } - - // 最后的解密部分,上面一个while已经把明文都解出来了,就剩下尾部的填充了,应该全是0 - // 所以这里有检查是否解密了之后是不是0,如果不是的话那肯定出错了,返回null - for (padding = 1; padding < 8; padding++) { - if (pos < 8) { - if ((m[offset + preCrypt + pos] ^ prePlain[pos]) != 0) - return null; - pos++; - } - if (pos == 8) { - m = in; - preCrypt = crypt; - if (!decrypt8Bytes(in, offset, len)) - return null; - } - } - return out; - } - - /** - * @param in 需要被解密的密文 - * @param k 密钥 - * @return Message 已解密的消息 - * @paraminLen 密文长度 - */ - public byte[] decrypt(byte[] in, byte[] k) { - return decrypt(in, 0, in.length, k); - } - - /** - * 加密 - * - * @param in 明文字节数组 - * @param offset 开始加密的偏移 - * @param len 加密长度 - * @param k 密钥 - * @return 密文字节数组 - */ - public byte[] encrypt(byte[] in, int offset, int len, byte[] k) { - // 检查密钥 - if (k == null) - return in; - - plain = new byte[8]; - prePlain = new byte[8]; - pos = 1; - padding = 0; - crypt = preCrypt = 0; - this.key = k; - header = true; - - // 计算头部填充字节数 - pos = (len + 0x0A) % 8; - if (pos != 0) - pos = 8 - pos; - // 计算输出的密文长度 - out = new byte[len + pos + 10]; - // 这里的操作把pos存到了plain的第一个字节里面 - // 0xF8后面三位是空的,正好留给pos,因为pos是0到7的值,表示文本开始的字节位置 - plain[0] = (byte) ((rand() & 0xF8) | pos); - - // 这里用随机产生的数填充plain[1]到plain[pos]之间的内容 - for (int i = 1; i <= pos; i++) - plain[i] = (byte) (rand() & 0xFF); - pos++; - // 这个就是prePlain,第一个8字节块当然没有prePlain,所以我们做一个全0的给第一个8字节块 - for (int i = 0; i < 8; i++) - prePlain[i] = 0x0; - - // 继续填充2个字节的随机数,这个过程中如果满了8字节就加密之 - padding = 1; - while (padding <= 2) { - if (pos < 8) { - plain[pos++] = (byte) (rand() & 0xFF); - padding++; - } - if (pos == 8) - encrypt8Bytes(); - } - - // 头部填充完了,这里开始填真正的明文了,也是满了8字节就加密,一直到明文读完 - int i = offset; - while (len > 0) { - if (pos < 8) { - plain[pos++] = in[i++]; - len--; - } - if (pos == 8) - encrypt8Bytes(); - } - - // 最后填上0,以保证是8字节的倍数 - padding = 1; - while (padding <= 7) { - if (pos < 8) { - plain[pos++] = 0x0; - padding++; - } - if (pos == 8) - encrypt8Bytes(); - } - - return out; - } - - /** - * @param in 需要加密的明文 - * @param k 密钥 - * @return Message 密文 - * @paraminLen 明文长度 - */ - public byte[] encrypt(byte[] in, byte[] k) { - return encrypt(in, 0, in.length, k); - } - - /** - * 加密一个8字节块 - * - * @param in 明文字节数组 - * @return 密文字节数组 - */ - private byte[] encipher(byte[] in) { - // 迭代次数,16次 - int loop = 0x10; - // 得到明文和密钥的各个部分,注意java没有无符号类型,所以为了表示一个无符号的整数 - // 我们用了long,这个long的前32位是全0的,我们通过这种方式模拟无符号整数,后面用到的long也都是一样的 - // 而且为了保证前32位为0,需要和0xFFFFFFFF做一下位与 - long y = getUnsignedInt(in, 0, 4); - long z = getUnsignedInt(in, 4, 4); - long a = getUnsignedInt(key, 0, 4); - long b = getUnsignedInt(key, 4, 4); - long c = getUnsignedInt(key, 8, 4); - long d = getUnsignedInt(key, 12, 4); - // 这是算法的一些控制变量,为什么delta是0x9E3779B9呢? - // 这个数是TEA算法的delta,实际是就是(sqr(5) - 1) * 2^31 (根号5,减1,再乘2的31次方) - long sum = 0; - long delta = 0x9E3779B9; - delta &= 0xFFFFFFFFL; - - // 开始迭代了,乱七八糟的,我也看不懂,反正和DES之类的差不多,都是这样倒来倒去 - while (loop-- > 0) { - sum += delta; - sum &= 0xFFFFFFFFL; - y += ((z << 4) + a) ^ (z + sum) ^ ((z >>> 5) + b); - y &= 0xFFFFFFFFL; - z += ((y << 4) + c) ^ (y + sum) ^ ((y >>> 5) + d); - z &= 0xFFFFFFFFL; - } - - // 最后,我们输出密文,因为我用的long,所以需要强制转换一下变成int - baos.reset(); - writeInt((int) y); - writeInt((int) z); - return baos.toByteArray(); - } - - /** - * 解密从offset开始的8字节密文 - * - * @param in 密文字节数组 - * @param offset 密文开始位置 - * @return 明文 - */ - private byte[] decipher(byte[] in, int offset) { - // 迭代次数,16次 - int loop = 0x10; - // 得到密文和密钥的各个部分,注意java没有无符号类型,所以为了表示一个无符号的整数 - // 我们用了long,这个long的前32位是全0的,我们通过这种方式模拟无符号整数,后面用到的long也都是一样的 - // 而且为了保证前32位为0,需要和0xFFFFFFFF做一下位与 - long y = getUnsignedInt(in, offset, 4); - long z = getUnsignedInt(in, offset + 4, 4); - long a = getUnsignedInt(key, 0, 4); - long b = getUnsignedInt(key, 4, 4); - long c = getUnsignedInt(key, 8, 4); - long d = getUnsignedInt(key, 12, 4); - // 算法的一些控制变量,sum在这里也有数了,这个sum和迭代次数有关系 - // 因为delta是这么多,所以sum如果是这么多的话,迭代的时候减减减,减16次,最后 - // 得到0。反正这就是为了得到和加密时相反顺序的控制变量,这样才能解密呀~~ - long sum = 0xE3779B90; - sum &= 0xFFFFFFFFL; - long delta = 0x9E3779B9; - delta &= 0xFFFFFFFFL; - - // 迭代开始了, @_@ - while (loop-- > 0) { - z -= ((y << 4) + c) ^ (y + sum) ^ ((y >>> 5) + d); - z &= 0xFFFFFFFFL; - y -= ((z << 4) + a) ^ (z + sum) ^ ((z >>> 5) + b); - y &= 0xFFFFFFFFL; - sum -= delta; - sum &= 0xFFFFFFFFL; - } - - baos.reset(); - writeInt((int) y); - writeInt((int) z); - return baos.toByteArray(); - } - - /** - * 写入一个整型到输出流,高字节优先 - * - * @param t - */ - private void writeInt(int t) { - baos.write(t >>> 24); - baos.write(t >>> 16); - baos.write(t >>> 8); - baos.write(t); - } - - /** - * 解密 - * - * @param in 密文 - * @return 明文 - */ - private byte[] decipher(byte[] in) { - return decipher(in, 0); - } - - /** - * 加密8字节 - */ - private void encrypt8Bytes() { - // 这部分完成我上面所说的 plain ^ preCrypt,注意这里判断了是不是第一个8字节块,如果是的话,那个prePlain就当作preCrypt用 - for (pos = 0; pos < 8; pos++) { - if (header) - plain[pos] ^= prePlain[pos]; - else - plain[pos] ^= out[preCrypt + pos]; - } - // 这个完成我上面说的 f(plain ^ preCrypt) - byte[] crypted = encipher(plain); - // 这个没什么,就是拷贝一下,java不像c,所以我只好这么干,c就不用这一步了 - System.arraycopy(crypted, 0, out, crypt, 8); - - // 这个完成了 f(plain ^ preCrypt) ^ prePlain,ok,下面拷贝一下就行了 - for (pos = 0; pos < 8; pos++) - out[crypt + pos] ^= prePlain[pos]; - System.arraycopy(plain, 0, prePlain, 0, 8); - - // 完成了加密,现在是调整crypt,preCrypt等等东西的时候了 - preCrypt = crypt; - crypt += 8; - pos = 0; - header = false; - } - - /** - * 解密8个字节 - * - * @param in 密文字节数组 - * @param offset 从何处开始解密 - * @param len 密文的长度 - * @return true表示解密成功 - */ - private boolean decrypt8Bytes(byte[] in, int offset, int len) { - // 这里第一步就是判断后面还有没有数据,没有就返回,如果有,就执行 crypt ^ prePlain - for (pos = 0; pos < 8; pos++) { - if (contextStart + pos >= len) - return true; - prePlain[pos] ^= in[offset + crypt + pos]; - } - - // 好,这里执行到了 d(crypt ^ prePlain) - prePlain = decipher(prePlain); - if (prePlain == null) - return false; - - // 解密完成,最后一步好像没做? - // 这里最后一步放到decrypt里面去做了,因为解密的步骤有点不太一样 - // 调整这些变量的值先 - contextStart += 8; - crypt += 8; - pos = 0; - return true; - } - - /** - * 这是个随机因子产生器,用来填充头部的,如果为了调试,可以用一个固定值 - * 随机因子可以使相同的明文每次加密出来的密文都不一样 - * - * @return 随机因子 - */ - private int rand() { - return random.nextInt(); - } -} diff --git a/mirai-core/src/test/java/HexComparator.java b/mirai-core/src/test/java/HexComparator.java index 7f447bddd..58b0b103d 100644 --- a/mirai-core/src/test/java/HexComparator.java +++ b/mirai-core/src/test/java/HexComparator.java @@ -173,17 +173,19 @@ public class HexComparator { public static void main(String[] args) { System.out.println(HexComparator.compare( //mirai - "01 12 00 38 D7 B4 57 68 68 BA 91 9D 2C 6F F0 B8 1A 77 4A DC 10 FE 74 E6 03 CE EA 90 5A 43 FD 19 21 94 EF 41 C3 2B 48 B7 91 70 DD AE 47 EA C7 EC 69 5A 6D 16 3B CA E8 DC 82 81 24 74 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 78 F4 FC F9 F2 B0 04 32 4A 01 F7 0B 23 7A 5E 30 E9 42 83 89 C4 D2 7A F7 7D 6E 71 FF FC 97 81 3A FC 11 75 3B D6 7C E8 C2 04 3E CD B1 34 57 C3 B4 AF 40 87 BD 06 18 7F 7B E8 8E F5 42 0F A8 A8 87 44 3A A5 51 69 61 F1 12 F4 94 DE BA 37 D9 50 5C 03 ED CB DE 6E 68 B4 DE 79 6E BF A9 07 D2 E5 56 7A AF 35 12 00 0C 4D 9D F4 E5 0C 36 9C 5C 5A CE F7 2D 95 28 82 8A FC E5 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 56 5C 1A 38 F9 6A 88 F8 34 EF 68 FC 83 9D 61 9B 7A 07 F6 37 CD 1E C4 9A C9 B2 81 B3 F5 67 C4 74 63 23 30 64 E8 32 6F BD 35 14 0D 75 2D DF 0F 38 80 D3 3C 11 0D 1B 74 EF C8 6D 54 42 E7 DB 94 B9 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 10 00 3C 00 01 00 38 E0 65 0C 69 9A EE D9 90 CE 5D AF 23 6B 49 03 0D 98 47 25 3F B5 BD 88 BB 54 50 72 E0 37 8E 66 ED A6 37 18 77 71 5D 66 A6 A3 CD A5 BC 9B CD 87 42 DB 41 59 3E 54 A7 90 DC 03 12 00 05 01 00 00 00 01 05 08 00 05 10 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 32 8C B5 CB 10 2E 0A 31 F2 EB 6D FC 13 CB 14 83 31 CD 75 C6" + + "01 12 00 38 56 3A E4 8B B4 64 D2 72 60 FE 01 54 FC B1 5F 88 E0 BA 64 1A 55 F2 84 FC 97 D0 BF 5F 47 A8 D9 76 BB FB 4A 7A F3 5E 0E A4 8E CA 8F 27 C2 02 6E 5D E7 68 9F 7C CF 91 83 F4 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 0D DF 92 9C 5A 08 D1 67 FD 7D D6 DE CE D0 92 39 79 17 53 57 41 9B D6 D3 F9 F8 9A 3B E1 C2 3A E7 CF 02 6E 5E 36 B7 6D CF 33 66 77 FE AC 58 93 A3 85 E7 AF 6F 2D A2 74 E2 60 28 4B 29 17 04 79 95 39 D4 BF 4D C1 ED 61 49 13 23 9D 71 62 29 AF 87 D7 E3 42 49 88 3F D8 5C DB 9F 9E 5A 2A EA 02 F6 4F 2B D3 5B AF BE 0C B2 54 46 AE 99 1B 07 0B BE 6A C2 29 18 25 6A 95 0A 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 E2 9A D0 B3 7D CD 3D F4 55 DB 04 A4 68 2A AF 4E 38 46 8B E0 1F 2D 2A B8 F6 C6 AB 4F DF D1 5F 8C D4 CA 2A 91 25 14 33 A3 C5 08 F8 01 4C E6 3D 89 5F 23 38 3A EC 01 58 F6 B1 F6 7F 2E 6A 02 17 4A 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 10 00 3C 00 01 00 38 57 3A 37 C3 FB A0 C3 E5 AE F3 0E B6 03 DE BF 9E E2 B5 C5 FE A0 F0 03 4F F7 8A 5C 29 5C E0 5A A2 89 D5 3F 60 E2 B2 81 FE D4 16 04 D4 E3 C6 4A D7 A9 D9 E6 FC 2E 7E 0C F3 03 12 00 05 01 00 00 00 01 05 08 00 05 10 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 10 21 DF C4 F3 DD 42 09 6F A0 93 8C 7E 0E 78 EF 22 8D 88 35" , //e - "01 12 00 38 D5 CC FC 5E BF 39 4C 07 7F FF AE 3C C2 10 E0 0E 3D C1 7B 6C 1C 58 9C 97 AB DE DC 4C B7 8E AB DA 77 BE 5F AD 8D 3C EA 7D B8 3D 5E B3 5B 6B DD 32 E6 A5 0C 6F B7 93 E4 C3 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 64 5C 48 D5 BF 98 6A 81 8F B5 09 DA A5 83 0E 45 BB 99 9B 03 42 2A 87 95 48 88 52 0D 5F 0B C1 4D A7 5F BF 60 4F 3D A1 04 D3 B4 E4 D2 45 71 5C 74 95 80 86 45 E0 26 EA B2 B1 09 0B 56 22 68 7C 5D 8D 9E 69 E4 C5 4E 0C EA F5 6F 90 FF 4B 43 43 EB 4F 76 45 70 DA 12 C7 1E A5 14 B8 5B 78 79 75 5E 2C F3 5D 1A C4 39 D5 AE 1A 70 EC AF A1 F5 FF D6 D3 B9 C6 DA 71 7E 15 52 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 9D AB 45 74 6A E5 3F E2 8E 81 16 6C BB FA 0D A1 37 28 2F B9 02 3D EB 07 C7 ED 95 99 F9 35 27 35 58 67 4A FA 6E E4 89 37 8A 00 3B 19 C5 15 7E F6 83 D5 CF 66 9C FD 10 9F 27 90 31 3B 2E 98 F9 4C 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 10 00 3C 00 01 00 38 3A 51 49 BC 3C 44 78 A1 A7 6D B7 98 03 05 9F 42 E1 15 E5 53 0C C1 03 82 5E AE AD FC 44 C6 E9 85 66 51 F2 E2 67 B4 60 DC 89 EC E4 56 13 52 E6 AA C4 5A D1 FA 3D E7 10 92 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 D5 4E 31 3E 5E B3 28 6C 94 FB 25 CA E8 C4 A4 28 09 02 B2 58" + "01 12 00 38 56 3A E4 8B B4 64 D2 72 60 FE 01 54 FC B1 5F 88 E0 BA 64 1A 55 F2 84 FC 97 D0 BF 5F 47 A8 D9 76 BB FB 4A 7A F3 5E 0E A4 8E CA 8F 27 C2 02 6E 5D E7 68 9F 7C CF 91 83 F4 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 0D DF 92 9C 5A 08 D1 67 FD 7D D6 DE CE D0 92 39 79 17 53 57 41 9B D6 D3 F9 F8 9A 3B E1 C2 3A E7 CF 02 6E 5E 36 B7 6D CF 33 66 77 FE AC 58 93 A3 85 E7 AF 6F 2D A2 74 E2 60 28 4B 29 17 04 79 95 39 D4 BF 4D C1 ED 61 49 13 23 9D 71 62 29 AF 87 D7 E3 42 49 88 3F D8 5C DB 9F 9E 5A 2A EA 02 F6 4F 2B D3 5B AF BE 0C B2 54 46 AE 99 1B 07 0B BE 6A C2 29 18 25 6A 95 0A 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 26 2B FE EB 21 8E 08 16 BA 42 B3 A3 C5 6A 5B 31 33 A9 B3 F0 EB 16 80 BE F0 58 D3 51 98 2F A7 23 27 7C 06 97 F4 85 01 77 5C 5B D6 A2 82 54 06 A0 07 53 39 E2 E7 62 E5 09 1A 25 79 6F D9 E0 ED B6 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 10 00 3C 00 01 00 38 57 3A 37 C3 FB A0 C3 E5 AE F3 0E B6 03 DE BF 9E E2 B5 C5 FE A0 F0 03 4F F7 8A 5C 29 5C E0 5A A2 89 D5 3F 60 E2 B2 81 FE D4 16 04 D4 E3 C6 4A D7 A9 D9 E6 FC 2E 7E 0C F3 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 4C 97 73 32 83 1A 6F C4 94 91 0A 7A D8 21 81 58 73 3D 24 F6" )); + /* System.out.println(HexComparator.compare( //e "90 5E 39 DF 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 55 35 05 8E C9 BA 16 D0 01 63 5B 59 4B 59 52 31 01 B9 00 00 00 00 00 00 00 00 00 00 00 00 00 7B 7B 7B 7B 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B AA BB CC DD EE FF AA BB CC", //mirai "6F 0B DF 92 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 55 35 05 8E C9 BA 16 D0 01 63 5B 59 4B 59 52 31 01 B9 00 00 00 00 00 00 00 00 00 00 00 00 00 E9 E9 E9 E9 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B AA BB CC DD EE FF AA BB CC\n\n\n" - )); + ));*/ } } diff --git a/mirai-core/src/test/java/PacketTest.kt b/mirai-core/src/test/java/PacketTest.kt index bcd087adf..8cc9f7f01 100644 --- a/mirai-core/src/test/java/PacketTest.kt +++ b/mirai-core/src/test/java/PacketTest.kt @@ -1,10 +1,5 @@ import net.mamoe.mirai.network.packet.client.login.ClientPasswordSubmissionPacket -import net.mamoe.mirai.network.packet.server.login.ServerLoginResponseVerificationCodePacket -import net.mamoe.mirai.util.hexToBytes -import net.mamoe.mirai.util.toHexString -import java.io.DataInputStream -import java.io.File -import java.io.FileOutputStream +import net.mamoe.mirai.util.toUHexString @ExperimentalUnsignedTypes fun main(){ @@ -13,8 +8,8 @@ fun main(){ val s = DataInputStream(data.hexToBytes().inputStream()) val packet = ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, s) packet.decode() - System.out.println(packet.token.toUByteArray().toHexString(" ")) - System.out.println(packet.loginTime.toHexString(" ")) + System.out.println(packet.token.toUByteArray().toUHexString(" ")) + System.out.println(packet.loginTime.toUHexString(" ")) System.out.println(packet.loginIP) */ @@ -25,10 +20,10 @@ fun main(){ val s = DataInputStream(data.hexToBytes().inputStream()) val packet = ServerLoginResponseSuccessPacket(s,(data.length+1)/3) packet.decode() - System.out.println("0828key: \n" + packet._0828_rec_decr_key.toUByteArray().toHexString(" ")) - System.out.println("token88: \n" + packet.token88.toUByteArray().toHexString(" ")) - System.out.println("token38: \n" + packet.token38.toUByteArray().toHexString(" ")) - System.out.println("enckey: \n" + packet.encryptionKey.toUByteArray().toHexString(" ")) + System.out.println("0828key: \n" + packet._0828_rec_decr_key.toUByteArray().toUHexString(" ")) + System.out.println("token88: \n" + packet.token88.toUByteArray().toUHexString(" ")) + System.out.println("token38: \n" + packet.token38.toUByteArray().toUHexString(" ")) + System.out.println("enckey: \n" + packet.encryptionKey.toUByteArray().toUHexString(" ")) System.out.println("nick: " + packet.nick) System.out.println("age: " + packet.age) System.out.println("gender: " + packet.gender) @@ -39,8 +34,8 @@ fun main(){ val s = DataInputStream(data.hexToBytes().inputStream()) val packet = ServerLoginResponseVerificationCodePacket(s,(data.length+1)/3) packet.decode() - println(packet.token00BA.toUByteArray().toHexString(" ")) - println(packet.verifyCode.toUByteArray().toHexString(" ")) + println(packet.token00BA.toUByteArray().toUHexString(" ")) + println(packet.verifyCode.toUByteArray().toUHexString(" ")) println(packet.verifyCodeLength) File(System.getProperty("user.dir") + "/5.png").createNewFile() @@ -48,5 +43,5 @@ fun main(){ */ val packet = ClientPasswordSubmissionPacket(1994701021,"xiaoqqq",131513,"123.123.123.123","tgtgtKey".toByteArray(),"".toByteArray()) - packet.encodeToByteArray().toUByteArray().toHexString(" ") + packet.encodeToByteArray().toUByteArray().toUHexString(" ") } \ No newline at end of file diff --git a/mirai-core/src/test/java/data.txxt b/mirai-core/src/test/java/data.txxt new file mode 100644 index 000000000..e3a4a12b9 --- /dev/null +++ b/mirai-core/src/test/java/data.txxt @@ -0,0 +1,81 @@ +TEA 加密, 内容=78 69 61 6F 71 71 71 00 +serverip = 61.151.180.143 +TEA 加密, 内容=00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 03 09 00 08 00 01 3D 97 B4 8F 00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 +paccket sent: 02 37 13 08 25 31 01 76 E4 B8 DD 03 00 00 00 01 2E 01 00 00 68 52 00 00 00 00 A4 F1 91 88 C9 82 14 99 0C 9E 56 55 91 23 C8 3D A5 23 FD 2A C0 51 40 D7 AF F9 12 90 6A 87 6E 6E 31 2A 1C 7B 2C 4D 54 53 ED 9F A7 39 4F 0A 0A A6 3A 74 EA F9 1E 7B 7F CE 8E AE D0 97 7F CF 92 ED 77 91 8F 80 ED DA 4E 8B 5C 39 FC BE 18 3A 03 D0 ED 0C 31 E6 7A 3A 6B D3 71 8B B5 97 F8 A3 3C 05 1E FE BE 68 F8 86 9C 79 68 10 F7 6A B8 44 B5 7D 3A 78 95 F5 BD 0E 9A 42 03 +flag = 08 25 31 01 +收到 ServerTouchResponsePacketEncrypted = 02 37 13 08 25 31 01 76 E4 B8 DD 00 00 00 13 46 E6 ED CE BF 3B EC 4C A0 B9 0C 84 D5 88 5C DE 99 7A 64 CF CF 59 35 C5 58 AE BD 0B F5 94 65 25 9E 23 01 88 BF D5 B5 51 DC AA 45 C5 97 8E 40 14 0F 46 50 31 CF 1C CB 10 28 33 F7 40 93 A9 B0 F3 EA 18 51 14 FD 61 C3 FD E3 A3 D8 1B 20 6F 60 EA 47 28 91 87 94 2E 5A E4 0A 4D 4D B7 14 57 03 E7 9D D7 28 E2 F4 59 62 34 89 19 1E 10 B8 90 97 C3 11 8A FE D6 3A 9A D8 03 +flag = 08 25 31 01 +使用#_0825key解密结果: = 02 37 13 08 25 31 01 76 E4 B8 DD 00 00 00 13 46 E6 ED CE BF 3B EC 4C A0 B9 0C 84 D5 88 5C DE 99 7A 64 CF CF 59 35 C5 58 AE BD 0B F5 94 65 25 9E 23 01 88 BF D5 B5 51 DC AA 45 C5 97 8E 40 14 0F 46 50 31 CF 1C CB 10 28 33 F7 40 93 A9 B0 F3 EA 18 51 14 FD 61 C3 FD E3 A3 D8 1B 20 6F 60 EA 47 28 91 87 94 2E 5A E4 0A 4D 4D B7 14 57 03 E7 9D D7 28 E2 F4 59 62 34 89 19 1E 10 B8 90 97 C3 11 8A FE D6 3A 9A D8 03 +需要重定向 +得到server ip, g_server = 123.151.77.211 +发送 ClientServerRedirectionPacket +变量: g_server +TEA 加密, 内容=00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 01 00 00 03 09 00 0C 00 01 7B 97 4D D3 01 6F A1 58 22 01 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 +paccket sent: 02 37 13 08 25 31 02 76 E4 B8 DD 03 00 00 00 01 2E 01 00 00 68 52 00 00 00 00 A8 F2 14 5F 58 12 60 AF 07 63 97 D6 76 B2 1A 3B F8 19 BB 1E FD 3B B7 FA B4 2B DA B4 41 14 44 49 2D 01 FC 88 A7 C9 FE A0 DD 21 91 65 4F A2 6A 88 C7 65 1E 64 8E AE 0F 4B 5D 16 4F 61 C2 48 DD E4 DA 01 3C 99 58 13 81 7F 4B 1D 6C 9E F6 4F 2C A0 D4 EC 24 1B 13 CD C7 56 E2 20 8D C2 8D D2 4F 5C 27 56 C2 0C A4 C7 FB 37 B1 3B 90 14 31 65 47 E9 C7 22 AE A5 C3 6F EF 89 38 87 B4 D5 D8 11 10 1E 03 +flag = 08 25 31 02 +收到 ServerTouchResponsePacketEncrypted = 02 37 13 08 25 31 02 76 E4 B8 DD 00 00 00 80 96 0C 13 5F 40 31 75 D6 13 3D 59 65 F0 7A 1E 03 22 0B F1 BE F4 D8 BB 46 6C 2E 55 39 A1 05 8B 85 4E A4 D4 F3 A9 D6 CC CA 4D 2E 1A F2 E4 1D 49 4D 1F 23 66 BB 60 92 17 EC D3 35 32 93 E2 3D 8A A0 CE 3C 83 66 1F 0A A0 9A C7 11 91 8E E5 06 54 09 DE 1D 88 6C 0F 16 EB BC 7B 95 BF 71 A2 71 2B 21 F8 AD C8 03 C0 54 DE 03 +flag = 08 25 31 02 +不需要redirect +得到m_loginTime = 5D 61 20 F9 +得到m_loginIP = AB 70 E2 96 +得到m_0825token = BF A4 B1 36 7C 5D 5A A6 3B 2E 65 E9 20 59 7B 04 3B 7C 36 A2 0F 56 79 BA 9D 66 95 08 F3 B1 56 80 AF C6 C7 C0 AC A8 C2 39 1C AC B5 D5 F8 CD 47 F7 33 06 96 85 1F BA 6E AF +得到m_tgtgtKey = CE AD BA 22 50 A9 FE 62 AF C4 29 86 2C AF 17 5C +发送 ClientPasswordSubmissionPacket +PCName 取主机名 () = DESKTOP-M17JREU +PCName 处理后 = 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 +g_pass = xiaoqqq +g_QQ = 76 E4 B8 DD +crc32_code(Random) = B9 11 E7 AB 9D AB 61 35 4B B2 2D E0 EA 78 C6 C0 +crc32_data = 95 9D B2 30 +m_tgtgtKey = CE AD BA 22 50 A9 FE 62 AF C4 29 86 2C AF 17 5C +packet = 79 35 21 65 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 61 20 F9 00 00 00 00 00 00 00 00 00 00 00 00 00 AB 70 E2 96 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B CE AD BA 22 50 A9 FE 62 AF C4 29 86 2C AF 17 5C +TEA 加密, 内容=79 35 21 65 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 61 20 F9 00 00 00 00 00 00 00 00 00 00 00 00 00 AB 70 E2 96 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B CE AD BA 22 50 A9 FE 62 AF C4 29 86 2C AF 17 5C +TEA 加密, 内容=00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B +构建包加密原文 = 01 12 00 38 BF A4 B1 36 7C 5D 5A A6 3B 2E 65 E9 20 59 7B 04 3B 7C 36 A2 0F 56 79 BA 9D 66 95 08 F3 B1 56 80 AF C6 C7 C0 AC A8 C2 39 1C AC B5 D5 F8 CD 47 F7 33 06 96 85 1F BA 6E AF 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 E4 09 E9 48 57 45 49 D8 9A 35 3C E0 39 78 D6 D2 E2 EA 77 2C B1 DE AC 85 FD 08 CF AD 79 AA E5 36 99 5A FD 82 EC 7C B0 6F FB 5B DD CB A1 DF 8E 31 94 0D 9D 8A 6B 4B B6 F2 1F D0 F3 35 0D 3C 58 1C 19 59 04 12 49 25 D2 D5 24 73 83 00 F0 58 B7 85 05 A5 36 4A E0 FD 14 7C 30 4E FD 7C D5 A1 64 22 D6 55 D8 FA 0C CD 3A 15 90 BF A5 6A 78 57 74 65 79 33 5F 6C 8A 85 CE E0 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 3A AB 51 6D A5 1A D8 E0 0F 6D D2 D9 DB 5E 8D 86 A3 57 75 FE 75 4C 4A 0E 0A F5 16 91 72 D6 BA 05 74 97 99 B1 16 FA 56 6E 27 C5 84 97 4E 31 80 8D DE 16 38 D2 A4 1A 3B AB AA E8 77 FB E7 DB FE E7 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 B9 11 E7 AB 9D AB 61 35 4B B2 2D E0 EA 78 C6 C0 95 9D B2 30 +TEA 加密, 内容=01 12 00 38 BF A4 B1 36 7C 5D 5A A6 3B 2E 65 E9 20 59 7B 04 3B 7C 36 A2 0F 56 79 BA 9D 66 95 08 F3 B1 56 80 AF C6 C7 C0 AC A8 C2 39 1C AC B5 D5 F8 CD 47 F7 33 06 96 85 1F BA 6E AF 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 E4 09 E9 48 57 45 49 D8 9A 35 3C E0 39 78 D6 D2 E2 EA 77 2C B1 DE AC 85 FD 08 CF AD 79 AA E5 36 99 5A FD 82 EC 7C B0 6F FB 5B DD CB A1 DF 8E 31 94 0D 9D 8A 6B 4B B6 F2 1F D0 F3 35 0D 3C 58 1C 19 59 04 12 49 25 D2 D5 24 73 83 00 F0 58 B7 85 05 A5 36 4A E0 FD 14 7C 30 4E FD 7C D5 A1 64 22 D6 55 D8 FA 0C CD 3A 15 90 BF A5 6A 78 57 74 65 79 33 5F 6C 8A 85 CE E0 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 3A AB 51 6D A5 1A D8 E0 0F 6D D2 D9 DB 5E 8D 86 A3 57 75 FE 75 4C 4A 0E 0A F5 16 91 72 D6 BA 05 74 97 99 B1 16 FA 56 6E 27 C5 84 97 4E 31 80 8D DE 16 38 D2 A4 1A 3B AB AA E8 77 FB E7 DB FE E7 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 B9 11 E7 AB 9D AB 61 35 4B B2 2D E0 EA 78 C6 C0 95 9D B2 30 +PCName 取主机名 () = DESKTOP-M17JREU +PCName 处理后 = 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 +g_pass = xiaoqqq +g_QQ = 76 E4 B8 DD +crc32_code(Random) = A0 99 89 10 F4 AB AD F5 C1 03 CE 74 FE FB 49 FD +crc32_data = 5B 1F 17 CA +m_tgtgtKey = CE AD BA 22 50 A9 FE 62 AF C4 29 86 2C AF 17 5C +packet = A5 FD E6 15 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 61 20 F9 00 00 00 00 00 00 00 00 00 00 00 00 00 AB 70 E2 96 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B CE AD BA 22 50 A9 FE 62 AF C4 29 86 2C AF 17 5C +TEA 加密, 内容=A5 FD E6 15 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 61 20 F9 00 00 00 00 00 00 00 00 00 00 00 00 00 AB 70 E2 96 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B CE AD BA 22 50 A9 FE 62 AF C4 29 86 2C AF 17 5C +TEA 加密, 内容=00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B +构建包加密原文 = 01 12 00 38 BF A4 B1 36 7C 5D 5A A6 3B 2E 65 E9 20 59 7B 04 3B 7C 36 A2 0F 56 79 BA 9D 66 95 08 F3 B1 56 80 AF C6 C7 C0 AC A8 C2 39 1C AC B5 D5 F8 CD 47 F7 33 06 96 85 1F BA 6E AF 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 00 D9 61 DA 12 4B DE 6B 5A A0 43 25 0A D6 87 28 57 6E 59 70 C2 6C D1 F3 BE B5 FD 74 C7 45 76 1B 2B 96 F4 BF 7C EB F4 8E C1 C2 42 F9 FC 42 3D D0 3D 1D 53 CD DC 9C 92 64 25 E2 61 35 FD 76 DD BA 13 0C 49 B9 47 77 5D B7 17 3D 2A 4C 24 16 4F FD EF 6D D9 B9 17 7C FA 65 33 04 DF C4 10 21 C2 F3 B5 F0 3B BB 35 47 DB B8 54 C7 27 90 54 76 98 E3 BA F7 67 0C 74 4D C4 56 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 47 97 98 C5 BE E2 6E 6C E4 B4 97 2F 8D 89 6B 86 BF 2D C9 75 7F 06 1F 26 45 4A 75 9F 78 1F 9D CA FD 63 BD 10 AB 5B 46 DE 4F B0 63 D4 38 9C D3 CD C2 AC F1 E0 26 AB DE C9 E9 FF 8A D9 C9 0C 08 5D 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 A0 99 89 10 F4 AB AD F5 C1 03 CE 74 FE FB 49 FD 5B 1F 17 CA +TEA 加密, 内容=01 12 00 38 BF A4 B1 36 7C 5D 5A A6 3B 2E 65 E9 20 59 7B 04 3B 7C 36 A2 0F 56 79 BA 9D 66 95 08 F3 B1 56 80 AF C6 C7 C0 AC A8 C2 39 1C AC B5 D5 F8 CD 47 F7 33 06 96 85 1F BA 6E AF 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 00 D9 61 DA 12 4B DE 6B 5A A0 43 25 0A D6 87 28 57 6E 59 70 C2 6C D1 F3 BE B5 FD 74 C7 45 76 1B 2B 96 F4 BF 7C EB F4 8E C1 C2 42 F9 FC 42 3D D0 3D 1D 53 CD DC 9C 92 64 25 E2 61 35 FD 76 DD BA 13 0C 49 B9 47 77 5D B7 17 3D 2A 4C 24 16 4F FD EF 6D D9 B9 17 7C FA 65 33 04 DF C4 10 21 C2 F3 B5 F0 3B BB 35 47 DB B8 54 C7 27 90 54 76 98 E3 BA F7 67 0C 74 4D C4 56 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 47 97 98 C5 BE E2 6E 6C E4 B4 97 2F 8D 89 6B 86 BF 2D C9 75 7F 06 1F 26 45 4A 75 9F 78 1F 9D CA FD 63 BD 10 AB 5B 46 DE 4F B0 63 D4 38 9C D3 CD C2 AC F1 E0 26 AB DE C9 E9 FF 8A D9 C9 0C 08 5D 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 A0 99 89 10 F4 AB AD F5 C1 03 CE 74 FE FB 49 FD 5B 1F 17 CA +paccket sent: 02 37 13 08 36 31 03 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA D3 E5 0D A8 D1 77 18 4A C6 56 87 45 E0 A8 DD 8A 9C AF 93 80 D4 1C E9 BE 9E 4A E9 91 3D 16 CD 4C 6E 55 63 CA 7C E7 8F E8 06 3B 9B CE E7 5B EA D7 4E EB 59 69 0C A9 A1 29 60 B6 25 57 9E E6 79 4D 2C 97 DA D6 C8 C4 66 CF F5 3A A6 3A 7C 01 8C B9 B8 D5 06 A9 93 21 10 1F 19 D0 3D C2 01 ED 42 3E B2 9D C6 E9 5D E9 DC 50 28 6A C4 D9 EF 0D 6A 1F D4 6E 39 A1 52 1D 40 28 86 AE 77 4B C1 43 8A 58 CE 6F A1 FE 6F 1B C4 0A 02 14 EE 09 51 3C 78 DF 89 7A 94 08 AC B7 56 5F B1 B5 B2 22 30 2C 5F 8C 93 39 17 EA DB D4 33 D8 93 76 56 2A D5 69 5D 78 0C 4D BC F0 74 80 8C EA 7A FE FD 90 97 DC 6E 58 94 9E E7 7B A3 BC 23 CB 62 F3 F1 51 CE C8 49 B3 BD E3 82 61 15 24 8B 35 31 0F FB DB DC FE BA 49 32 24 DB 41 7E 7E 08 F9 B0 70 64 DC 33 A8 FD 68 57 EB FA 50 35 29 8F 1E 26 79 EC 18 3A C8 79 13 7B 92 DE A6 85 3E 1C 5F 7F 8E B4 E9 D8 F3 11 5E 34 4D B6 D4 40 1B 83 8C 6D 88 BF 19 44 B4 9C AF 3E 8D 27 C2 A3 C8 4E 50 44 C4 37 E3 85 86 46 F7 43 67 17 E9 7A A8 C1 3A 8A E4 4A 11 2C 29 70 A4 28 1D 19 04 07 B6 26 62 CE 4A 6E FC 7A F4 3F EF 15 25 C3 0E 0E B5 4A 2E 4A 63 E2 EC 80 FE 92 59 CA EF 89 0E 5C DC 10 4C 92 52 BD 2B D6 C1 D0 FB 05 A7 4D 68 AE F7 E6 C2 52 C1 BF B3 7C 81 87 44 0A 93 9D 0E E7 E3 9F 4B F5 C6 2F 5B AE 16 50 85 25 24 19 7C 23 A9 AE 38 B5 2B 68 DF 5A A8 08 71 12 FC 1B D9 05 77 5A E3 B3 C5 6F E2 E5 49 04 DE 01 61 13 E4 79 39 D0 26 80 5D 73 89 32 AD 18 48 A5 0C B1 F0 1D 2C 63 17 EF C6 C9 EA 5E E7 B2 48 0A 07 0C A8 44 A4 F5 1F D3 2E 45 8F C8 C5 70 C5 5A B4 5A 43 2A 39 3D 91 AF 08 46 52 57 1C 2B 59 7C DA 14 BF A3 0A E5 11 C2 0C C2 F1 8B 8D C1 60 B9 65 B5 12 29 AF 02 B0 FC FF C8 F1 48 26 9E 27 AC 48 B2 18 B6 EA E4 E5 89 74 0C 3B 5D 84 BC DC 03 +flag = 08 36 31 03 +收到 ServerLoginResponseSucceedPacket +原文 = 02 37 13 08 36 31 03 76 E4 B8 DD 00 00 00 BD 57 C9 45 45 E4 52 BE DA 05 67 A3 49 0F B7 90 AD 3E 47 34 A9 A8 B3 D9 82 E1 45 95 A4 41 F0 66 56 20 D5 0C B7 AF 9E A3 3A 32 FE 89 B2 0A AD 81 EC D0 D1 7A 17 00 51 5E FA BD 75 D1 DB E9 12 DC 89 25 A8 6D 80 F4 00 21 68 70 A0 77 E3 EF FA 9C 80 25 47 5B 55 E1 A0 1D D9 6B FE B7 7F 6A 3B 67 45 A5 F1 CE 33 F4 43 67 1D FD 83 F6 88 9F 2E 7E F3 8B 0E DE 68 76 B1 48 9A 5C B2 B2 8D 12 E3 FA CE 0F 22 F1 7C 20 4D AD 01 09 36 C6 64 3A BE CA 33 68 46 19 8A A9 66 7A 13 DC F2 EE 04 91 74 FB CB 57 B5 48 84 BF 99 24 3C 1E 5C 04 56 F1 28 E1 49 95 0D 71 39 FB A2 AE EE C5 E6 99 91 A3 A3 59 48 CA DE 10 66 F2 FA 88 D8 6F 46 2B B3 F4 33 C0 64 92 92 99 83 06 43 C2 3C FC 0F 34 38 7C 0F F8 3C 35 D0 CD 23 05 06 5B 61 B3 AD 38 D9 E2 5F 51 A4 A0 CA AF 4A A9 86 11 C9 AC 2C 44 11 08 52 E3 3C 0D 1B 91 B6 C6 70 FC 15 CC 16 F6 3B C9 97 C0 82 D1 8B 24 2F AA 35 50 61 E9 11 F8 E1 09 29 B9 20 5E 3A 73 33 BF 78 9C CC D0 A7 BF 23 66 65 3B D1 1F 71 40 C2 E2 0D CA 6F 57 D8 E1 46 B6 47 65 9E 43 04 0E 30 54 EB 70 42 49 6F 75 55 C5 63 3A A4 9D FF 0B F8 56 3B 89 74 14 56 6B 6E 9D 32 D4 DD FA E7 C6 B2 6B 61 F0 54 EF 05 7E E1 49 D6 38 A0 C1 B3 F6 B4 7A 4A 03 31 1D E7 88 BA 56 9D 50 03 95 FF DB 23 DC 3C B9 51 1B 4B 06 1E 5E C5 B1 96 EA 8B 64 92 48 24 65 A4 92 EC BA 90 42 AD BA 04 81 4F 42 FB 41 60 E9 93 68 1F 59 67 57 57 5F 40 22 1B F2 D9 C5 5D 53 34 2C E4 82 ED D2 A8 3B F1 C2 05 2A 4D F9 45 63 21 E7 92 5A 01 D4 A4 3A 98 D8 57 39 34 D4 E2 CC F6 D1 76 12 76 00 A5 89 18 66 9C F9 18 31 52 E6 92 B2 11 46 73 8D 37 92 99 7A 3B FC 82 36 A1 7A 7B 91 D0 F7 59 C2 64 76 7A 4F 7E 88 8A AF 11 AA 90 5C 0D E2 9F F7 A8 9B 04 A7 05 48 EC 92 01 2A 19 0E 8C A7 1B 9C 1F B2 F8 BD C5 AE 98 D5 86 C7 C6 D2 D5 BC B5 BB D7 F9 05 52 F1 5A 6D B5 94 2C 44 86 11 A9 B3 EB 9D D7 30 BF 21 1F 22 2D FB AC 0C 5C 94 C4 69 C2 82 C8 48 6C 86 40 95 EF 67 9B B1 60 17 09 56 AE CB 85 EF FD 60 7D BA A3 1D 13 05 10 93 ED 5D 91 6B 3B 8C 23 C4 45 EF 02 BA 86 0E F7 8E 46 C7 3D 07 8A 67 94 3B 5C 4B 05 BD 64 76 DF 1A 3B A5 C9 26 AA F6 A5 36 4E EC 00 AD D8 B7 5E 32 53 02 9F CF 3C 23 9C 94 BB 03 F8 97 9F 53 CC A0 68 77 4D A4 DE D0 CE DE 68 FC A2 07 A5 9E 65 28 E2 A2 95 E0 1D 45 11 47 E9 03 1A BE F5 1F 48 36 37 B8 EA EA 6B 9C 73 93 7D 21 CA 77 F7 62 73 BF BA 54 BB C2 38 0C 04 68 A 4 E0 05 98 18 6E 5D EC 40 EE 54 27 9C 67 5C 79 5D 89 3C 4F DC 29 50 46 87 D9 EB F9 12 03 +进行解密, key=m_tgtgtKey = CE AD BA 22 50 A9 FE 62 AF C4 29 86 2C AF 17 5C +得到m_0828_rec_decr_key = 79 44 42 48 54 78 7D 76 35 2D 37 5F 74 58 77 66 +得到nick_length = 20 +得到m_nick = (?ω) +得到m_age = 5 +得到m_gender = 02 +得到g_clientKey = 00015D6120F900686462B19DE4E17E7D0DB1BBBFBF156F01CFD2A113B3405B8B9B3AB0BB52CD0E34D2F6B22D2DB8F5A48F04E93A7B02544CBD975DF663364C7D100AEA1B05C0D98D0A65549F0C97BA6854566746938051A2B2B99CA6B9390EEC029998A32866635068C89BA9D679082E +得到token38 = 87 7B B4 34 81 46 D2 F9 24 F4 FE DA 15 B8 7E 0E FE AD D0 5C E5 E5 27 A6 DD 64 C9 37 26 0E 7E 46 39 CA E3 A8 20 17 E0 C7 8C D2 7B B6 70 7C 50 4F 77 20 E6 22 B6 61 D6 30 +得到token88 = 00 04 5D 61 20 F9 AB 70 E2 96 00 00 00 00 00 78 C4 B6 4D 8D B1 48 E9 0F 75 22 A9 EC FD 7E 1D 90 A1 90 AC D4 CB 73 4D 76 6C 29 1D 59 58 97 8D 1C 9D 6F 05 1D 9A 4E 27 08 2F A6 5E 52 5C 47 CF CF 12 F0 66 4D 58 74 DD 70 96 44 4D 45 AC 4B 40 37 B2 16 FD D0 DA CB 70 96 E9 39 1F EA 17 2F A2 71 8A 39 A5 A5 D6 3E 93 8C B5 A7 E4 8C EC 96 34 29 43 9B 57 9F 65 2F 16 D8 0D 9E F6 1C F4 2A EB 07 C7 4F A2 E5 AF ED 21 4D +得到encryptionKey = 35 F2 B1 8C 26 C3 67 77 E5 79 3D 16 68 F9 7A FD +发送未知新包 +TEA 加密, 内容=00 07 00 88 00 04 5D 61 20 F9 AB 70 E2 96 00 00 00 00 00 78 C4 B6 4D 8D B1 48 E9 0F 75 22 A9 EC FD 7E 1D 90 A1 90 AC D4 CB 73 4D 76 6C 29 1D 59 58 97 8D 1C 9D 6F 05 1D 9A 4E 27 08 2F A6 5E 52 5C 47 CF CF 12 F0 66 4D 58 74 DD 70 96 44 4D 45 AC 4B 40 37 B2 16 FD D0 DA CB 70 96 E9 39 1F EA 17 2F A2 71 8A 39 A5 A5 D6 3E 93 8C B5 A7 E4 8C EC 96 34 29 43 9B 57 9F 65 2F 16 D8 0D 9E F6 1C F4 2A EB 07 C7 4F A2 E5 AF ED 21 4D 00 0C 00 16 00 02 00 00 00 00 00 00 00 00 00 00 7B 97 4D D3 1F 40 00 00 00 00 00 15 00 30 00 01 01 92 A5 D2 59 00 10 54 2D CF 9B 60 BF BB EC 0D D4 81 CE 36 87 DE 35 02 AE 6D ED DC 00 10 06 A9 12 97 B7 F8 76 25 AF AF D3 EA B4 C8 BC E7 00 36 00 12 00 02 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 00 1F 00 22 00 01 1A 68 73 66 E4 BA 79 92 CC C2 D4 EC 14 7C 8B AF 43 B0 62 FB 65 58 A9 EB 37 55 1D 26 13 A8 E5 3D 01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00 C2 D9 3F A5 A0 1B 6C 03 A2 EF AB CB 42 92 44 8E 15 97 28 1F DE B6 E9 0A 5C 53 01 CE A2 CC 95 3F E0 CB 30 3F 5C 67 09 22 83 CC 8A 80 8F D6 26 F5 EF EC 24 15 95 8E CE 99 00 40 02 02 03 3C 01 03 00 00 A1 4D 57 52 9E 5B 1F BB 48 75 09 67 F8 C0 64 F6 9B 2A 44 61 78 29 C1 26 9C 3C 59 0E DF 9B D1 59 97 0B 0C 2B 09 27 C6 7C 20 63 11 02 E1 4E A4 DE E2 59 CF A7 A1 47 0A B6 01 0B 00 85 00 02 B9 ED EF D7 CD E5 47 96 7A B5 28 34 CA 93 6B 5C 37 10 00 00 00 00 00 00 00 02 00 63 3E 00 63 02 04 03 06 02 00 04 00 52 D9 00 00 00 00 A9 58 3E 6D 6D 49 AA F6 A6 D9 33 0A E7 7E 36 84 03 01 00 00 68 20 15 8B 00 00 01 02 00 00 03 00 07 DF 00 0A 00 0C 00 01 00 04 00 03 00 04 20 5C 00 92 71 EE B0 CC 65 63 B5 3E BF DE 6E 1E 46 78 AD 09 38 03 07 C4 83 B7 84 F3 B4 C2 64 2C 57 69 61 68 00 00 00 00 00 2D 00 06 00 01 C0 A8 89 01 +paccket sent: 02 37 13 08 28 04 34 76 E4 B8 DD 02 00 00 00 01 2E 01 00 00 68 52 00 30 00 3A 00 38 87 7B B4 34 81 46 D2 F9 24 F4 FE DA 15 B8 7E 0E FE AD D0 5C E5 E5 27 A6 DD 64 C9 37 26 0E 7E 46 39 CA E3 A8 20 17 E0 C7 8C D2 7B B6 70 7C 50 4F 77 20 E6 22 B6 61 D6 30 43 93 A7 0B 49 A4 4A 0F D8 DB 40 F4 CA DC EA 8F 79 90 A7 39 A4 9E B1 77 28 12 30 1E 30 1E D1 E1 A8 8E EA 87 53 AF 83 94 4C 30 99 DD 3E 6F A0 BE 42 6C B0 B5 A8 E7 35 AA 5B 10 0F 0D 37 BA 48 C2 B1 A7 84 AD 93 E0 82 6F 1B 44 62 7D 69 37 35 68 25 B7 EF BD A5 BB 78 5F 90 54 61 38 92 E5 1E 87 8C F4 E3 57 30 B3 70 C8 EB CD B8 27 3F ED 59 19 6C DA F4 2B 09 57 6C 8B 9D 02 D7 91 E8 52 1E BA 98 6B 89 2A 0B C4 99 CE 17 45 B1 1A F7 47 88 1B 0B B8 65 08 E4 04 0F 2B F4 01 3D 00 EA 3B B0 58 D5 4B 84 96 55 A0 EB D1 FB 00 7F 92 B6 D5 BF 56 02 06 C8 94 D0 63 36 63 30 01 33 F7 60 B6 83 47 AE 78 BC 1E 64 E2 8F 7C B9 67 3B 35 A0 09 AF 33 33 EA 96 C9 0A DA 4C 66 DA 86 A5 7A CB C2 D7 2D 7F EF 36 48 32 DD B3 BB C4 52 F0 DB 2A 36 86 61 7A D0 E8 F6 06 53 C5 AA 53 2B 51 F6 46 4A 1C CB E6 78 FD A4 52 0A F0 DB 2F 80 BA 83 63 32 09 1F 8D C1 EB 18 41 1F C8 6F 7F 57 94 8C F7 2D 34 1F 3C 01 3A 7D 7E F9 66 1D 99 2C 0C 76 29 EE 6C 66 A8 8E 45 B7 5F 9E 3B 26 2F 05 61 B7 CC 61 2E 43 CE 89 83 53 8A B4 93 93 63 42 A6 F5 54 1D 9A 1D 76 24 78 59 3D 3F CA F5 38 4B 0B 7F D4 D7 EE C0 3B FD CB 85 DC 95 A0 0D 88 34 97 6E AD B5 C4 95 19 8F 4C AA 14 A0 F5 F4 CB 75 26 6D 6A D8 4C 43 4A 3D EE 89 52 92 48 6F A7 86 B9 2E 45 EE CB CD DD 33 0C DB 03 91 45 10 95 D7 62 1E 34 37 A3 17 B7 82 7A C3 EF A8 D8 52 08 8A CF 72 7E 8B EE 3A 1A 58 C4 65 17 B5 EE 46 16 0A B3 CB 6A 74 74 2E D2 2A 3D 83 5C 8A A1 4A 72 AB 97 28 DD CD 2B 16 03 4D 94 C9 6C 1E C4 7B F8 7D 7A 56 7D 7A A5 DF FD 12 19 91 96 AA 7D 00 75 12 04 58 D9 69 85 93 0A BB 23 9F 60 BC 8B 00 AE 4D D6 36 30 33 0F 80 F7 B0 CB 72 39 9A 1D 61 76 2E 39 E9 75 16 2C 07 7E FF 68 95 5E 90 73 58 98 72 4D AC 94 B9 43 F0 90 E9 AB 51 31 4C 74 24 90 86 47 B5 F7 E1 97 86 BB 96 47 B4 8F 1E 2C F7 D2 D2 14 F4 CE D5 EF 27 97 CD F8 8B B1 7C 24 D4 73 E1 C0 8E 3C A0 F2 7D 93 74 15 17 99 48 D0 8D 69 65 A6 36 4D 2A DB A7 03 +flag = 08 28 04 34 +g_sessionKey = E0 29 20 0D 31 82 38 F8 A1 AC 71 C6 07 F3 CB 54 +g_tlv0105 = 01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00 C2 D9 3F A5 A0 1B 6C 03 A2 EF AB CB 42 92 44 8E 15 97 28 1F DE B6 E9 0A 5C 53 01 CE A2 CC 95 3F E0 CB 30 3F 5C 67 09 22 83 CC 8A 80 8F D6 26 F5 EF EC 24 15 95 8E CE 99 00 40 02 02 03 3C 01 03 00 00 A1 4D 57 52 9E 5B 1F BB 48 75 09 67 F8 C0 64 F6 9B 2A 44 61 78 29 C1 26 9C 3C 59 0E DF 9B D1 59 97 0B 0C 2B 09 27 C6 7C 20 63 11 02 E1 4E A4 DE E2 59 CF A7 A1 47 0A B6 +g_loginStatus = 0A +TEA 加密, 内容=01 00 0A00 01 00 01 00 04 00 00 00 00 +paccket sent: 02 37 13 00 EC 35 DB 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 80 88 1D E3 D9 DF BD 03 EB BF 3D A0 8A E3 DF FF 1A C4 26 40 02 FF 34 FF 03 +flag = 00 EC 35 DB +TEA 加密, 内容=33 00 05 00 08 74 2E 71 71 2E 63 6F 6D 00 0A 71 75 6E 2E 71 71 2E 63 6F 6D 00 0C 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 00 0C 6A 75 62 61 6F 2E 71 71 2E 63 6F 6D 00 09 6B 65 2E 71 71 2E 63 6F 6D +paccket sent: 02 37 13 00 1D B9 B1 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 57 90 2B 4A 54 89 D9 5E 40 F1 13 4F C9 6D 0D 22 B2 1A 92 FF 28 0A 2A 21 E3 75 9C 91 22 BD 5D F8 2B 1A ED 6A D8 5A 9F F0 B8 13 B8 A1 C2 25 31 77 98 3D 9A 3D B1 E5 B6 39 1C 04 84 7C 93 3A 84 BF 88 92 45 03 B0 9D CC 1E BC 87 9C 98 F6 03 14 C1 03 +flag = 00 1D B9 B1 +TEA 加密, 内容=88 76 E4 B8 DD 00 +paccket sent: 02 37 13 00 5C CB C6 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 16 F2 82 2B F9 A2 D4 A2 A8 1A 13 93 FB CD EC 43 03 +flag = 00 5C CB C6 +flag = 00 17 D2 48 +TEA 加密, 内容=76 E4 B8 DD 76 E4 B8 DD 00 02 BB 83 0A 3C 90 09 +paccket sent: 02 37 13 00 17 D2 48 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 4E B7 9E C3 F0 AF 38 6B C1 DA D8 32 15 57 66 FE 8D EA 49 5D D0 FE CA C5 11 B9 54 35 B3 3D 7D 6A 03 +AnalyMessage diff --git a/mirai-core/src/test/java/packets.txt b/mirai-core/src/test/java/packets.txt new file mode 100644 index 000000000..52e85d3d6 --- /dev/null +++ b/mirai-core/src/test/java/packets.txt @@ -0,0 +1,50 @@ +from epl + +TEA decrypted: FE 01 12 00 38 C2 3B BA 7D E2 EA B6 66 7D F1 F5 7E 8A 28 5E ED 45 16 37 AA C0 CD A0 0C 43 CC 27 48 EB 9B 86 EE F0 87 76 E6 B5 DE B4 16 C8 23 9C AE DD 6F EC AF B6 4A 23 4B 36 68 88 14 00 17 00 0E 00 01 5D 5E 8D 70 1B 12 55 CB B3 A5 00 00 00 0C 00 16 00 02 00 00 00 00 00 12 00 00 00 00 3D 97 B4 F0 00 00 00 00 00 00 +TEA encrypt: 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 01 00 00 03 09 00 0C 00 01 3D 97 B4 F0 01 6F A1 58 22 01 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 +Packet sent: 02 37 13 08 25 31 02 76 E4 B8 DD 03 00 00 00 01 2E 01 00 00 68 52 00 00 00 00 A8 F2 14 5F 58 12 60 AF 07 63 97 D6 76 B2 1A 3B BC 09 3B D1 C3 13 E7 1E B0 D4 B4 57 EC D7 E1 54 1C B9 C7 9B FF E2 86 31 79 98 08 F5 C5 36 7B F8 C2 AC 65 7B A2 25 D9 14 25 42 7A 89 BF AB 1D 3F D9 6A DD E8 45 2E 47 C1 D4 4E 0C 09 B5 16 FA A5 68 B1 86 E9 10 43 0A 3F 97 9C 17 59 27 38 04 82 49 A7 08 21 F6 DB DA 56 12 C2 5B F7 76 1A CD 49 23 4B 28 E0 73 3D 74 98 DB 07 B2 72 FE 32 AC EB 03 +TEA decrypted: 00 01 12 00 38 6E 42 D2 18 7A 9A D1 C0 E9 56 D3 64 16 4A 0D 46 40 EF 27 B9 79 25 2D 06 E0 28 C5 5B E5 77 3D 55 2D DC DE 13 ED 46 1E 90 2B B8 C9 13 60 39 53 53 01 A3 C1 A1 FC 44 07 E2 00 17 00 0E 00 01 5D 5E 8D 70 1B 12 55 CB B3 A5 00 00 03 10 00 04 3D 97 B4 F0 +TEA encrypt: 28 0C F3 77 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 5E 8D 70 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 12 55 CB 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 4E EB C9 19 82 AB 72 4E 9E 6A C9 A5 22 50 96 5D +TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B +TEA encrypt: 01 12 00 38 6E 42 D2 18 7A 9A D1 C0 E9 56 D3 64 16 4A 0D 46 40 EF 27 B9 79 25 2D 06 E0 28 C5 5B E5 77 3D 55 2D DC DE 13 ED 46 1E 90 2B B8 C9 13 60 39 53 53 01 A3 C1 A1 FC 44 07 E2 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 C9 DB 44 90 AF 8C E6 35 98 46 54 41 48 C1 86 BE DD 11 81 5E B5 E3 32 E2 00 60 B7 82 52 E3 FC 15 E0 18 BC 5F 93 5E 75 F9 E6 05 12 4E 3E 40 6F 65 A6 A3 E3 57 EC B2 8F 76 25 12 76 76 8C E9 88 6E 1C 26 03 55 EA A8 8A 02 3D 31 E6 E3 17 D3 BE 41 2C D0 05 F6 70 9B 34 9A 40 A6 A6 48 D8 65 A2 39 5D 8A 32 28 90 06 0D 29 9E 24 6E C4 92 87 D1 CB 2B E2 97 BA A0 EF 16 63 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 B2 DE B3 6A F2 64 C3 43 AA 9A CB BA 2B 22 24 BD C6 8A EA D0 37 8B 61 E0 C6 BB 62 68 A8 2D 22 79 F8 AD 39 6E 20 F6 D2 DD DD 39 E8 D2 BF 1A 58 E5 D3 99 D6 6F 72 1B 02 6D 9E B5 10 D0 C9 BC 37 27 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 7B 4F 8E 6D C9 26 F0 8A BB 27 B3 74 BC 55 50 95 DF 07 D6 A0 +TEA encrypt: AB C7 B2 DB 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 5E 8D 70 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 12 55 CB 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 4E EB C9 19 82 AB 72 4E 9E 6A C9 A5 22 50 96 5D +TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B +TEA encrypt: 01 12 00 38 6E 42 D2 18 7A 9A D1 C0 E9 56 D3 64 16 4A 0D 46 40 EF 27 B9 79 25 2D 06 E0 28 C5 5B E5 77 3D 55 2D DC DE 13 ED 46 1E 90 2B B8 C9 13 60 39 53 53 01 A3 C1 A1 FC 44 07 E2 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 9C 8B 87 A0 A6 42 5B E4 3E C2 D2 50 80 22 19 E3 60 5F 90 FA DF 4F 33 F5 26 24 9A 6C 0F F2 08 A4 91 42 C0 73 C6 D3 7F D9 FA F6 9E D4 9E B1 B7 64 51 B5 45 F3 5F D3 5E C1 7A C6 3D 19 5D 44 E3 75 EB 76 D3 A5 8B D8 0E 4B B2 7C 32 96 4C FF 52 18 81 A0 85 19 3D 4B A2 B4 3B 78 CD AA CE 9D E3 8D D5 B9 D3 6E ED B0 0F 02 96 57 3D DD C9 D4 8D 8B CC FA 1B 83 78 89 7C E1 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 23 6E 7B 0C 0E 31 31 E9 E1 5C 48 C4 4D 55 CF 2B 20 91 EE 24 CA D9 2D 9C 75 C5 D9 08 6A AE BB 61 DB 16 27 E0 AE A8 96 07 57 01 FC 24 E2 52 3F 69 AE DD BB 34 F4 85 B8 6D E6 B8 22 2C 79 52 BD A5 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 F4 96 24 B8 52 17 7B B8 F6 09 3C 4D 9E BC 86 F1 0A 68 B1 59 +Packet sent: 02 37 13 08 36 31 03 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA E8 C2 34 2F E3 2B 37 00 72 21 83 B7 11 D8 C9 9C 3E D2 16 75 72 AE E4 F2 E7 24 0D 87 7E FB 7D 83 64 22 6E 1F 97 01 44 36 9E A6 A8 68 4F 9F 81 F5 B3 F3 14 8C 7A 4D 79 FD 9C 03 DD B6 46 97 62 4E 39 8C 45 0A 43 8F 57 C8 11 28 EC 0D AF 87 B9 72 7A D9 F8 D3 99 C4 96 7B 26 B5 0B 3E 7A 61 2B 13 27 B4 14 A2 EE DC DB 5B 0E B3 9E 3C 92 1C 97 2E 48 10 4C 04 F0 FC 20 DF 77 BF 1A BC 77 81 3D EA 03 83 2D F5 14 61 C7 8A DA AC 72 C4 EF 47 75 48 8B 8A 9E 94 06 64 FB 12 C7 31 4D 64 89 11 D3 B8 60 AB BB 50 8C F1 EE B2 5B C7 B9 DB A3 7D F0 1A 17 75 0D 9F 9E 7B 79 0B 83 A0 89 53 4A C4 C7 8D 51 E4 1E 4A D0 73 D0 F7 01 03 C8 A7 10 6F A2 98 B1 33 78 E9 7F 02 96 80 00 E7 07 7F 3B DA CC C8 C7 F6 AD C3 D9 98 5B B6 75 C0 9F 6D 53 94 4A 18 78 C4 C3 A0 B3 E0 F3 C2 61 89 CC 15 A4 57 8B 7A B9 1B DE 48 4E 2F 83 25 46 45 2B 5C 6E 36 38 2E 92 5A A9 99 45 1D AA 97 64 F1 46 2A 1F 23 9F DD 9F 5E 9F 03 9F E0 0D A5 7F D6 12 A5 DD 2F FA 42 9C 4B A0 8B DD 31 95 BD 14 CD 0D 79 9D 1E 78 E5 07 E4 8C A2 53 59 9E A4 0F 37 B3 98 A3 C6 B4 08 FC 9E C7 F6 90 DF 31 8A 6E EA 98 4B 6D C9 6B 4D A2 92 D6 B7 6E 0D BD 82 04 5A 94 4F 1D 1E 8C CB 52 76 A0 95 63 27 15 70 E1 65 7D 1E 1A A3 14 E3 28 16 29 37 29 40 B2 82 9E 32 3C E6 62 88 95 E3 F2 4C F2 0C 7F 31 3D 70 88 A5 88 C2 A3 1F DB 82 E9 7F 16 56 EF 8C 64 86 B3 56 5E DB AC 5F 51 89 57 7E 62 17 20 A8 C2 CC F3 6E 38 3A 8B 35 EE F6 D0 3A FD 48 E7 D1 22 58 F4 8C EF E1 EC 61 F3 A6 6C 81 A9 1E 29 D2 8B 06 A3 78 24 10 F4 74 81 DF 44 C9 FA A0 64 A4 3F 35 D5 1E 56 C6 E0 3F 19 77 AB C1 2F C4 5E 69 5A E8 F1 8D 2F 92 B6 F1 BC 97 A4 65 A6 87 3B D6 A5 D1 EF 27 84 04 2D 6F D7 B8 05 05 B2 B5 97 7B 66 A9 B1 5E 53 63 96 FD B5 A4 03 +TEA decrypted: 01 DB C5 C7 48 9C 83 25 8A C4 9C 57 B1 57 28 22 B6 E3 4C 76 B9 91 67 D8 1B C2 45 70 21 59 F5 C0 A2 32 D0 9A E6 CD 20 C1 F7 AE 1F 8A 1E D7 6A 29 9C 5A 10 95 43 14 CB 3F AE 58 6F 9D 34 03 54 66 DE 32 8D 88 43 2E 95 F3 80 F7 B8 F3 7F 73 AC 37 E4 8C 8B 22 57 83 54 79 E9 E5 82 8E A7 17 C8 D8 69 67 CD 55 7F EF 07 EB D0 78 D5 55 AC 5A EC E1 FD 29 30 2D 73 D5 8E 10 12 49 A7 DB 0E B4 65 96 A3 8F A2 09 08 46 32 C2 E0 D6 C7 58 4B A1 82 B3 48 47 2D 41 37 FD FB E0 87 A3 18 DF F4 80 7F D5 44 73 A3 67 79 AC 22 86 99 A4 33 00 AE C9 AD 0E F2 5B 45 00 AA A0 B1 35 BE F2 5B 53 61 CD 97 46 B0 BB 35 13 BB 37 64 60 8F 96 84 A3 82 D0 27 9A 87 D3 43 3C 7C 51 EF 58 8C 7D 8E 9B F6 ED B0 66 36 1E 43 0B 86 49 DE E3 E1 4E 59 1C 3C A2 14 15 +TEA decrypted: 01 00 1E 00 10 53 6D 21 50 5A 42 76 74 7D 2D 7A 2E 3C 2D 2A 57 00 06 00 78 ED A3 A3 19 F1 99 59 44 47 79 93 39 00 23 3B 50 9C 2C 25 B8 EC AE 1B 2E 1F A4 0F 70 EE B5 74 80 5D B4 FB 58 0E 92 73 9F 6D BC 4A 65 59 52 FC 1F 38 07 16 A0 67 30 E4 E6 0B F4 AC 98 50 2C B3 51 2D 9E 79 5E B0 EB 15 F5 90 2C 1C 49 74 64 BA 42 8B 3D 9D B1 8F 9B B3 24 D5 7E 4D 93 19 62 58 13 3A FF 41 0C 0B BF AB AD 9A C6 C9 79 C7 A1 1D 8E 2E A3 D9 E6 A9 38 E2 F8 01 10 00 3C 00 01 00 38 ED 3A 44 E9 3F 24 3D F6 71 0F 50 2E 6B 7B 69 C6 02 AD BA 4C 0B AF CF 8E 1C 96 A8 08 A6 A6 DE 18 46 94 12 02 6A 8B CD 67 CB 4D 18 BB 2D F2 06 44 B8 1D 19 C8 14 4C A1 37 01 15 00 10 69 B7 6B EB 4D C0 6D E5 7C FB E4 6B 5D 6C 86 9A +TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B +TEA encrypt: 01 12 00 38 6E 42 D2 18 7A 9A D1 C0 E9 56 D3 64 16 4A 0D 46 40 EF 27 B9 79 25 2D 06 E0 28 C5 5B E5 77 3D 55 2D DC DE 13 ED 46 1E 90 2B B8 C9 13 60 39 53 53 01 A3 C1 A1 FC 44 07 E2 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 ED A3 A3 19 F1 99 59 44 47 79 93 39 00 23 3B 50 9C 2C 25 B8 EC AE 1B 2E 1F A4 0F 70 EE B5 74 80 5D B4 FB 58 0E 92 73 9F 6D BC 4A 65 59 52 FC 1F 38 07 16 A0 67 30 E4 E6 0B F4 AC 98 50 2C B3 51 2D 9E 79 5E B0 EB 15 F5 90 2C 1C 49 74 64 BA 42 8B 3D 9D B1 8F 9B B3 24 D5 7E 4D 93 19 62 58 13 3A FF 41 0C 0B BF AB AD 9A C6 C9 79 C7 A1 1D 8E 2E A3 D9 E6 A9 38 E2 F8 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 A1 2F CE 46 45 62 54 0A 21 9C 32 EA A9 B9 4E FC 90 86 1B 97 3D A9 3B 45 20 02 89 63 7D 14 B2 E4 E4 DF ED 5C 3F 82 63 B1 E6 23 61 65 C5 E2 32 11 69 4D 1E 8E 80 81 BF 76 4F 46 03 32 45 39 C9 2E 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 10 00 3C 00 01 00 38 ED 3A 44 E9 3F 24 3D F6 71 0F 50 2E 6B 7B 69 C6 02 AD BA 4C 0B AF CF 8E 1C 96 A8 08 A6 A6 DE 18 46 94 12 02 6A 8B CD 67 CB 4D 18 BB 2D F2 06 44 B8 1D 19 C8 14 4C A1 37 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 08 4D 8B 2A EE 77 E3 28 25 DB CF 94 F3 DF 1C 3F E0 88 0B E1 +Packet sent: 02 37 13 08 36 31 04 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA 10 54 F4 51 F3 3A 48 6E 76 ED BD 89 E3 0A AA 23 4D 82 81 7E C8 2A 36 22 D1 4E 2D 15 90 16 41 DA DD 9C C3 D3 22 4A 25 84 26 4B C0 68 71 03 90 99 E4 73 10 0D 82 38 1E 1A 5D 4E 99 0E 58 C2 C7 AD 31 0E C6 AA DC 0F 29 D7 38 E1 14 27 64 41 FC 50 4B 4B 84 31 F9 DE 20 7D 83 67 EA F2 69 89 D3 07 0C 62 9A E2 2C 59 58 CA A7 27 A1 7F 92 C6 6D DA 73 F6 7F F1 1E EF 94 20 81 A0 5B 5C 82 78 27 DE 81 FB D2 B5 4F 05 90 F4 60 7B F0 07 D2 9D 36 09 28 4A 6A 83 F3 52 08 2E C2 53 20 71 D8 F1 CD 57 7A ED 7C 6F 57 F5 89 50 A2 68 DD A6 32 0A 4A 3E F8 61 93 90 A7 B8 37 F4 C6 25 AF 76 04 E4 08 AD F1 3E 76 9F 14 25 24 6A C0 B3 21 54 70 37 55 70 C1 30 4B 50 4A E3 76 4B A3 93 D0 D3 46 67 51 92 2D D0 85 CB 6A F0 AC 16 F0 2B 41 3A 1A 29 E1 90 8F A3 8B 65 A1 61 54 6F 71 06 D2 8E CF 28 70 9E 4B 35 7A 56 C9 58 16 68 E5 44 3E EA 69 A3 0C C5 3C BD FC 7A 5A D4 28 9D 81 67 C1 A1 03 79 28 04 5D 66 B3 E3 A3 69 48 E0 4E 79 A7 3F AD F3 5F BB 2D 1C 3F FE A4 30 BE 7D 36 54 B1 B3 BB A4 F5 C4 A8 04 8B 68 DE 04 E8 FC FF DA 16 39 8B 7D F5 2B 25 B8 2E A5 08 2A FE 53 52 74 F5 99 B7 BF 34 C5 10 E1 A1 B4 DF 2C CA 2C E3 99 D1 97 88 95 D2 DF E6 1B 3F 28 5B B0 8F 66 F2 55 E7 7B 52 49 DE 7F FE B0 17 E1 C3 97 0A 38 00 4F 0A EA EF 5A 15 DE 09 47 AB C0 D5 B2 BF 08 28 37 2B 07 CA BF 7B A8 F7 3D 34 DD 12 52 C4 94 B2 B8 D7 C6 7E 99 FC 10 52 3D AE 31 93 01 51 2B C7 AC BE 06 76 7C 93 9B 50 E6 B3 42 A5 B8 B3 C1 7D 5C 65 73 81 53 D6 D6 1C 42 DA DB D4 78 D2 DA 76 A1 7D 5A 87 5A FB 9A C6 D6 B0 99 58 E2 F2 42 05 E0 7B A9 BD BA C7 D8 06 23 9D EE 2A E7 43 CC 96 CC 79 D0 18 40 36 4E 4B 3A BD F5 9D B9 E3 A0 06 7F AE F3 E0 D2 F9 87 30 2F 5C E0 D1 4E A9 81 A0 5B 63 39 FB FC 98 33 F7 06 32 27 B4 E4 BE BB 26 A4 92 72 BD 5C 12 2A F8 D5 89 A6 F9 8B 4D 19 C2 EC FB 99 ED F7 E9 5C 6E 25 49 F6 D5 48 23 08 C4 19 48 33 E6 73 F2 BD AD 37 95 CE 80 E1 7E 06 E9 A4 F6 1C F0 53 CE CF 03 +TEA decrypted: 20 D0 B5 46 30 25 73 7B 26 C5 7A A3 4B CA 3F CB 02 0C 7C 09 3F 90 F0 47 B4 A5 F9 3D 7A DF 53 2B 80 9D 9C F6 ED 77 88 CD A3 42 FF 7B 39 EB 05 D0 D6 18 C4 5E 7F 58 A9 2A 94 C8 FA 11 33 68 9A AC D0 5C 9D CE D4 10 59 AF 59 7F 49 A5 56 D9 35 07 36 25 31 DC 4F 64 FD A6 78 D9 31 DA 26 30 BE 4B 8D D3 92 0D B2 C7 FC 50 68 E6 D0 64 87 E9 8D 22 10 68 32 E2 50 9F 19 0A 5C C4 DB 04 A2 6B A5 D1 40 E5 67 B1 88 13 04 20 8F 92 F1 CF 8D C8 B1 BB 54 4D 1E A2 FA 7E 7B 65 67 8F 58 0D 97 88 92 69 D3 6C B6 67 70 B4 D8 54 A4 0B 01 B2 3A 88 89 32 C0 91 E1 10 16 0F 8B 61 D7 D6 8D D1 32 34 23 3A C6 79 95 79 E4 1C 0D BA CE DF A3 76 23 0F C5 9D AE 63 24 6D 79 76 4F BB F8 FE A7 DE 3D 0E 84 9E 28 5A 8F F7 9D BA FD F1 22 61 E3 20 93 AA FA 9D C6 69 13 A4 52 98 6D ED E6 9D 84 35 A8 50 90 5E 3A F8 28 36 ED C0 C1 40 A8 E4 FD 78 26 E2 52 F5 EB 89 C5 42 D9 AB A4 24 87 BD AB 07 F3 C5 F1 1A B0 87 78 20 85 3E B4 D9 D1 2E 01 5D 3A DB F0 56 AB 12 B1 37 98 FE EA 88 4C EB 5B 1B 29 0A 99 A5 54 CE F6 6A F7 12 5A EE 18 B4 4E 03 5E 36 33 29 6C E9 4F F7 FD F0 76 AE 0B 37 74 06 07 F5 E7 FC 1B AA C7 BA 4F 02 96 DA 83 B6 D0 33 08 71 EE 19 31 57 8C 57 F3 BA F2 CE F2 B7 73 77 E9 5B A3 A4 4D F9 80 2B 59 87 20 A2 FF AB 56 C5 D6 9F 5F 8C CA 13 3F CE 6B 95 42 B9 E1 A2 AE E8 FB E1 B3 A0 AA 80 8A C2 D6 CD FE 52 D4 2A 89 4B 36 8F 7B 0C FF 63 74 83 1C 2E C5 25 B7 F7 D3 D6 B9 71 00 8E 2C 69 88 23 5E 70 98 E7 A6 86 76 1D 6B E3 26 65 7C AC 40 CF 9E A8 A5 D4 3E 41 38 1A 27 06 4B 68 88 11 B3 D3 3C 70 88 AB 6F 50 FC F3 DC D7 C3 82 20 62 1B 3E 90 29 6E 0A 2A 42 26 EA 0E B2 7D 3D D6 25 C6 CE B0 BB 5F 09 09 10 56 EE DA EC 2A 95 53 BD ED 02 89 60 E5 25 0A 21 05 34 26 05 CF BE C5 EB 56 08 9A 83 D8 19 77 11 F5 6D 81 92 C6 F2 B9 06 4C D4 E4 10 78 1D 94 3E 41 72 9A 7B 26 3B FF 06 34 11 F8 8C FE 18 E1 95 BB A6 B1 52 60 EF EA 39 A6 B3 F9 48 63 6B 34 7C 69 4A 9E B5 FD A3 AE DD C0 51 8F 46 BB CC C9 E5 96 D4 3F 72 01 CA C1 92 D6 E9 28 44 15 6D D5 22 2E 7B 4E B2 42 A8 BC 13 18 C3 9A 4E B7 C0 A7 A8 F5 99 FB 07 27 48 00 90 B3 61 BE A2 60 41 24 14 B0 68 0C FD 59 22 2B CB 1D 3F 42 F8 9A 95 A5 05 D6 FF 63 E2 3E 51 +TEA decrypted: 00 01 09 00 70 00 01 19 43 F9 12 75 3F E9 C9 9C 79 33 02 E6 42 1D 35 00 38 6A EA FA 99 C2 BE CA 5A B1 8E 83 12 28 B2 CD 0D 6F F8 21 0A CA 62 8A BE AE 8B 01 9D 16 D4 7C 7E E7 FA 0C 83 16 5D 76 05 2C 74 88 C8 1C EB 99 B3 03 F8 66 E0 B0 A5 0C 63 00 20 B9 55 18 2D CB F3 19 1B 90 4D B6 D9 98 28 17 BE E2 5E 05 13 A2 03 93 20 62 52 B3 E1 45 C3 48 DD 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 07 01 D3 00 01 00 16 00 00 00 01 00 00 00 64 00 00 0D C6 00 09 3A 80 00 00 00 3C 00 02 27 50 57 6D 6A 7D 2B 34 29 64 23 3C 41 3E 34 6B 00 88 00 04 5D 5E 8D 71 1B 12 55 CB 00 00 00 00 00 78 4C 2C DD A9 01 1B DB BC 1D 74 C8 F2 5D 0C 3D 10 DF 68 9F 72 BE 2B CD C8 3E F1 00 7B FD DC 71 12 E6 3C EE C4 FE 7B 25 E2 72 0F 06 52 21 6D 44 B4 E7 61 0D A8 8E F3 3D E4 DD FE F5 12 84 0A EA A6 08 29 83 37 0B D5 F8 91 69 EB B5 D5 39 99 47 4C 42 E9 7A 40 A9 0B 0C 97 A7 E6 FA 78 88 DD C8 6F 5A 0D D2 31 E1 DC B3 73 8E 5A 9A 66 0E C5 80 A8 74 A8 E8 B4 D1 50 B2 C0 68 2B 74 3C 2D 3F 3B 34 3A 57 50 65 73 4D 69 4B 00 78 00 01 5D 5E 8D 71 00 70 52 5A 52 54 29 56 A0 32 31 61 06 C2 E4 4D 09 5B 81 28 F2 D0 7B 2B 3A F4 4F 54 CD 9A 3E E6 FC 80 F9 DC 1A 43 8A 8A 8B 09 89 3A C2 8B 41 68 A1 E8 07 98 19 9D 2E 56 98 0B 96 D8 0C D3 16 0A 37 76 65 D4 3C 47 9C 27 65 20 F3 DD 86 B9 F4 31 57 00 53 10 50 82 3F DF 74 08 01 50 83 0C DB 15 6D 68 23 CB 14 93 28 4A 0B CB 19 CC 90 B4 5F D4 63 C7 00 83 01 7E 4E 50 35 33 75 65 5D 27 23 44 50 4D 4B 50 2B 00 70 00 01 5D 5E 8D 71 00 68 7B AE 3D 10 36 2B EB 2C 78 42 03 09 C4 F6 D5 9D 54 11 D3 1B F6 1C 69 D5 00 CD 8B 36 02 35 2E F5 29 64 72 90 38 F2 AE 99 AE EE 23 CA 1C EC 3C 9A 1C C0 C2 B3 4B EE 26 C4 95 4D EF 14 B5 C3 E0 C2 0C 52 CF 49 6A 57 5E D2 33 1F D2 62 9A 00 40 6E 13 6E E9 A6 C5 00 DB 93 2D 21 58 22 DC AA DD E1 CE EE E0 7B A4 1E 01 21 6B 7E 4B 47 68 47 66 66 4E 33 7B 4D 74 23 3F 68 01 08 00 29 00 01 00 25 00 1D 02 5B 14 28 E0 B9 91 E2 80 A2 CC 80 CF 89 E2 80 A2 CC 81 E0 B9 91 29 02 13 80 02 00 05 00 04 00 00 00 01 01 15 00 10 CA E0 70 A0 99 E1 14 4E 74 20 46 74 9F 36 14 C0 +TEA encrypt: 00 07 00 88 00 04 5D 5E 8D 71 1B 12 55 CB 00 00 00 00 00 78 4C 2C DD A9 01 1B DB BC 1D 74 C8 F2 5D 0C 3D 10 DF 68 9F 72 BE 2B CD C8 3E F1 00 7B FD DC 71 12 E6 3C EE C4 FE 7B 25 E2 72 0F 06 52 21 6D 44 B4 E7 61 0D A8 8E F3 3D E4 DD FE F5 12 84 0A EA A6 08 29 83 37 0B D5 F8 91 69 EB B5 D5 39 99 47 4C 42 E9 7A 40 A9 0B 0C 97 A7 E6 FA 78 88 DD C8 6F 5A 0D D2 31 E1 DC B3 73 8E 5A 9A 66 0E C5 80 A8 74 A8 E8 B4 D1 50 B2 C0 00 0C 00 16 00 02 00 00 00 00 00 00 00 00 00 00 3D 97 B4 F0 1F 40 00 00 00 00 00 15 00 30 00 01 01 92 A5 D2 59 00 10 54 2D CF 9B 60 BF BB EC 0D D4 81 CE 36 87 DE 35 02 AE 6D ED DC 00 10 06 A9 12 97 B7 F8 76 25 AF AF D3 EA B4 C8 BC E7 00 36 00 12 00 02 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 00 1F 00 22 00 01 1A 68 73 66 E4 BA 79 92 CC C2 D4 EC 14 7C 8B AF 43 B0 62 FB 65 58 A9 EB 37 55 1D 26 13 A8 E5 3D 01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00 C2 D9 3F A5 A0 1B 6C 03 A2 EF AB CB 42 92 44 8E 15 97 28 1F DE B6 E9 0A 5C 53 01 CE A2 CC 95 3F E0 CB 30 3F 5C 67 09 22 83 CC 8A 80 8F D6 26 F5 EF EC 24 15 95 8E CE 99 00 40 02 02 03 3C 01 03 00 00 A1 4D 57 52 9E 5B 1F BB 48 75 09 67 F8 C0 64 F6 9B 2A 44 61 78 29 C1 26 9C 3C 59 0E DF 9B D1 59 97 0B 0C 2B 09 27 C6 7C 20 63 11 02 E1 4E A4 DE E2 59 CF A7 A1 47 0A B6 01 0B 00 85 00 02 B9 ED EF D7 CD E5 47 96 7A B5 28 34 CA 93 6B 5C BB 10 00 00 00 00 00 00 00 02 00 63 3E 00 63 02 04 03 06 02 00 04 00 52 D9 00 00 00 00 A9 58 3E 6D 6D 49 AA F6 A6 D9 33 0A E7 7E 36 84 03 01 00 00 68 20 15 8B 00 00 01 02 00 00 03 00 07 DF 00 0A 00 0C 00 01 00 04 00 03 00 04 20 5C 00 46 FA 5E 5A 2D 7A 2F 2F BB 87 BB C3 BD 65 12 B6 C9 37 45 FD 2D D2 60 A9 64 E4 32 85 22 6E B0 8B 68 00 00 00 00 00 2D 00 06 00 01 C0 A8 89 01 +Packet sent: 02 37 13 08 28 04 34 76 E4 B8 DD 02 00 00 00 01 2E 01 00 00 68 52 00 30 00 3A 00 38 6A EA FA 99 C2 BE CA 5A B1 8E 83 12 28 B2 CD 0D 6F F8 21 0A CA 62 8A BE AE 8B 01 9D 16 D4 7C 7E E7 FA 0C 83 16 5D 76 05 2C 74 88 C8 1C EB 99 B3 03 F8 66 E0 B0 A5 0C 63 89 7E 03 26 34 DF 29 49 11 71 16 8E 8E 51 A4 9A B1 7F 0D D6 2A AD E7 69 43 69 9D C1 88 C0 CC 1B D9 4F 14 C0 CE 5B 0D F2 AA F6 72 7D 6E 50 93 B9 D0 D7 D8 B8 E3 AF E9 68 33 66 02 68 BD C1 43 D4 95 22 CE B9 16 0D 3B 7A D1 B4 CE 35 78 9F 67 8D 41 60 05 4F 89 6C B8 F5 BD CC 41 B8 5E 48 A1 28 8F 66 BC 4B 76 3A 8D 83 2E 1C A5 B5 26 69 EE 21 95 E5 1A 2F E7 DD CB BA 7F 87 F3 F5 69 A5 D7 E8 21 A7 E8 A2 FF E1 BB 7F 8D 89 91 5A D3 8D 72 9E D3 70 AB D4 F7 7E B2 5C C8 1E 5F FF F5 BC 9B 84 7F 3F 16 E1 6B 4C CD 6C D6 CD A2 58 C5 94 54 E9 1F CB 8A 43 D5 AE 9E C5 75 86 0C 3D 0F 8A 7D 72 DA AE 2D 66 81 DE E3 E1 16 40 BE 63 F6 99 C7 5C 7A 72 5A DD 35 41 69 76 3E 10 1C 7B DE C4 43 F4 EC 7C C5 98 ED 5E 06 0D B7 AF C9 7C F8 27 93 76 22 44 9A 32 F6 86 C3 84 EE AE C3 6B CE F4 FA 34 DA EA 68 D6 D0 39 8B 5B 8D 10 0D 9D BA 9C A3 F8 5A 86 56 A8 F6 5C 6A E4 31 FC 6E F8 95 49 4F 4D 49 E3 7F 74 75 8A DA 5D 7C C0 1F 03 9C 1C 69 1B 18 A0 63 B3 24 C4 AF 8C 64 2A 8A A0 E6 2E C3 3D 10 9E 08 EF 53 A4 11 2B 33 BA E8 92 BB 4B 25 B8 F2 79 12 0F F4 4C DB 0C BE BD 78 25 3C 8A 2B 66 B8 A7 34 8D F5 C9 D0 7E BE 35 E9 3F 3E 02 D3 43 AA 18 45 A7 00 B2 06 BF 5E 21 FA F5 28 A5 47 6A 0C AB 20 78 A5 EF 93 68 B7 7F DC 90 B1 F6 46 60 8A 16 BF F3 4B A2 2D 00 F0 72 68 CC 31 27 CE 84 4E 7B 4D ED 06 1C 3E ED F5 D0 EB DE 1F CC C2 CA 4C 98 76 E3 86 06 62 7D 04 07 84 A5 50 EF 6C 53 BD DA 80 1F 23 E3 1D CC F4 B2 33 74 A1 A2 C0 49 AB E4 9E 76 B7 4F B7 CD 9B 77 B5 DB 09 69 A1 F4 42 E3 88 D1 38 1A D2 92 B0 50 82 C6 97 BC A7 ED 99 5F F5 DD 21 B6 FF FB 3B 4D 2A 3B 73 67 92 BB CA 48 F8 D5 3C A8 DF B5 8B F3 17 21 47 42 E9 2F DB 53 77 CD 7C DA DE F3 76 EA A4 34 FD AD 58 E6 98 5A A4 D7 8B 6E 08 11 DE 5C 14 D9 A0 13 E0 8A 0C 4E 15 E8 09 59 F7 1A AF 0E 99 D9 22 73 81 63 21 54 D9 5C 29 D2 DB C0 59 72 D3 28 C6 27 B2 5C E0 A7 BF 13 02 38 8B 71 E1 75 A9 47 5C 66 A1 5B 03 +TEA decrypted: 00 00 0D 00 06 00 01 00 00 00 00 00 1F 00 22 00 01 A7 15 4D B7 2C 4E 36 31 5C A2 36 D4 2A 57 7A E9 E6 17 63 32 17 BD AA 14 21 82 BE F4 80 97 40 22 00 14 00 04 00 01 00 3C 01 0C 00 73 00 01 AE 21 31 3D 20 97 FE 61 C3 34 4F BA 8C DF D3 AC 76 E4 B8 DD 1B 12 55 CB B3 A5 5D 5E 8D 72 00 00 00 B4 03 3D 97 B4 F0 3D 97 B4 AA 00 00 00 07 00 30 C2 FB 5F 26 E7 98 02 F1 94 8F A4 88 03 F1 31 71 56 C9 7F DB 4E ED 5E DB AF 0D 0E 2E 9A C3 66 43 57 36 3E 60 80 8B 1A 9D 89 0A 2A 92 EF D7 5E 83 08 02 04 08 08 08 08 08 04 00 05 01 3A 3C 0A 22 01 0E 00 56 00 01 00 52 13 80 42 00 00 02 02 00 00 18 28 16 1D 6D 33 45 6D EE E7 AB 20 FF A2 69 CB 77 AA AE 5C AA 64 DD 5D 9B 00 20 A5 77 50 C4 8B 2F 5F 1C 4D CE 2D EC 48 A3 E4 EC 8D 05 3E E6 71 9C D7 6F 7F A5 59 B0 44 0D 95 DA 00 0C 00 00 00 01 00 00 00 00 00 00 00 40 00 2F 00 2A 00 01 8F FE 4F BB B2 63 C7 69 C3 F1 3C DC A1 E8 77 A3 DD 97 FA 00 36 04 40 EF 11 7A 31 02 4E 10 13 94 02 28 00 00 00 00 00 00 01 0D 00 2C 00 01 00 28 7C 2B 95 F9 A3 87 C0 B6 4D D0 C0 40 26 B7 EA 2B D9 B5 A9 A3 29 FD 38 E7 E4 80 68 70 AB 62 52 21 56 1B AF 3D 8D 01 58 16 01 05 00 32 00 01 02 02 00 15 02 00 01 03 10 AC 4B 56 16 B8 EB 07 2E 2F E7 EA F5 07 33 7C 3B 00 15 02 00 02 03 10 ED 62 2E 2A AF B1 3A ED C5 0B 98 D5 3F E2 48 11 +TEA encrypt: 01 00 0A00 01 00 01 00 04 00 00 00 00 +Packet sent: 02 37 13 00 EC 83 E4 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 A8 FE BA F9 5B 03 20 0E 85 1F 3E D9 41 75 33 F1 93 72 D9 BF F7 06 67 0E 03 +TEA encrypt: 33 00 05 00 08 74 2E 71 71 2E 63 6F 6D 00 0A 71 75 6E 2E 71 71 2E 63 6F 6D 00 0C 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 00 0C 6A 75 62 61 6F 2E 71 71 2E 63 6F 6D 00 09 6B 65 2E 71 71 2E 63 6F 6D +Packet sent: 02 37 13 00 1D 77 21 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 DA 9D 02 8E 4D A3 C7 37 73 BA 44 F9 BB 49 0E D0 13 87 D2 38 29 2D 6F 75 55 58 35 06 46 A3 31 50 8E 15 28 8A AB A4 EE B1 B7 96 8C 8A 23 F3 A4 18 D5 CB 50 34 04 C2 60 22 4B 4F 72 7D DC D1 EF 2C 28 84 07 C4 CF A1 1D 79 78 8D 90 47 50 E5 E5 ED 03 +TEA decrypted: 33 00 00 0A 5A 52 65 77 55 51 4C 6A 30 52 00 2C 53 78 44 6F 53 73 6E 61 56 66 36 76 4A 69 65 32 6A 76 76 56 49 51 2D 66 46 2D 62 46 6B 76 55 45 6D 78 4C 51 6E 47 69 4B 38 4A 59 5F 00 05 00 08 74 2E 71 71 2E 63 6F 6D 00 2C 6C 4A 41 4D 71 31 38 64 45 48 4F 53 45 74 35 49 75 52 58 42 66 49 45 37 75 46 79 52 71 5A 2A 6F 6D 30 65 77 57 6C 43 67 76 77 45 5F 00 0A 71 75 6E 2E 71 71 2E 63 6F 6D 00 2C 51 71 38 6C 71 73 51 6D 47 30 6F 6A 64 6D 35 57 4C 6F 44 63 62 78 36 38 36 51 56 36 7A 43 48 38 43 68 79 44 47 68 49 64 34 6B 41 5F 00 0C 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 00 2C 49 76 31 30 69 67 31 6B 33 43 4F 64 31 74 42 6B 6D 71 64 49 32 38 72 45 66 6D 6F 5A 6F 65 41 31 48 42 77 4D 57 48 78 35 35 36 73 5F 00 0C 6A 75 62 61 6F 2E 71 71 2E 63 6F 6D 00 2C 67 6F 39 7A 49 58 74 71 74 71 67 7A 56 6B 6A 37 47 51 73 6F 41 62 30 6F 4D 67 6F 6C 2A 6F 53 52 41 79 67 33 34 4A 59 68 75 6E 34 5F 00 09 6B 65 2E 71 71 2E 63 6F 6D 00 2C 6C 51 6C 31 69 6A 59 68 69 67 62 72 51 57 46 39 62 51 6F 48 74 68 32 73 37 42 43 38 39 6A 52 71 72 6D 4F 48 52 35 66 53 75 44 6B 5F +TEA encrypt: 88 76 E4 B8 DD 00 +Packet sent: 02 37 13 00 5C B3 0F 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 DD F0 A1 34 7C 49 67 B7 EB 22 C4 65 48 0F 69 C6 03 +TEA decrypted: 88 76 E4 B8 DD 00 00 00 03 00 15 02 13 00 00 00 29 00 33 E5 B0 9A E6 9C AA E5 BC 80 E9 80 9A E4 BC 9A E5 91 98 EF BC 8C E7 AB 8B E5 8D B3 E7 82 B9 E5 87 BB E4 BA 86 E8 A7 A3 E4 BC 9A E5 91 98 E7 89 B9 E6 9D 83 00 0A E7 AD 89 E7 BA A7 3A 20 32 31 00 13 51 51 E6 B4 BB E8 B7 83 E5 A4 A9 E6 95 B0 3A 20 35 33 31 00 1C E5 8D 87 E7 BA A7 E5 89 A9 E4 BD 99 E6 B4 BB E8 B7 83 E5 A4 A9 E6 95 B0 3A 20 34 31 00 1C E4 BC 9A E5 91 98 E6 88 90 E9 95 BF E9 98 B6 E6 AE B5 3A 20 56 49 50 24 56 49 50 24 00 10 E7 AD 89 E7 BA A7 3A 20 24 4C 45 56 45 4C 24 20 00 31 E7 AD 89 E7 BA A7 3A 20 24 4C 45 56 45 4C 24 EF BC 8C 51 51 E4 BC 9A E5 91 98 E5 8A A0 E9 80 9F E5 8D 87 E7 BA A7 51 51 E7 AD 89 E7 BA A7 E4 B8 AD + + +mirai +TEA decrypted: D2 FF 53 90 44 72 12 24 99 11 6F 49 BB 2B 2B 78 1B 96 AD 72 BB F1 B4 DA 7A FA F7 BF 23 5C 01 A1 C9 71 80 C5 F8 8D 6D 64 8F E1 AC AE 95 A8 7A AA 22 B2 C1 79 69 FF B9 64 CF 50 BB 3A BD 9C F5 50 AA 1C 2C F5 F7 7A 9B 5F E4 34 99 A2 27 B2 BC A3 F7 61 ED B4 09 73 CD D1 0B 1D A7 9A CB 57 EC 30 79 56 B8 C1 01 FF 79 B5 27 9F 67 32 C9 9A C1 22 FE 16 99 78 D8 93 D0 90 +TEA encrypt: 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 01 00 00 03 09 00 0C 00 01 3D 97 B4 F2 01 6F A1 58 22 01 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 0 ,.3 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 +packet sent: 02 37 13 08 25 31 02 76 E4 B8 DD 03 00 00 00 01 2E 01 00 00 68 52 00 00 00 00 A8 F2 14 5F 58 12 60 AF 07 63 97 D6 76 B2 1A 3B DF 18 86 D0 60 19 3D 82 B7 82 89 81 B6 EA A6 E1 B1 31 C1 2F 24 1D A6 86 90 FE 54 E5 1D 6F F4 86 F4 01 CE 32 A0 C1 2C AD BA A3 28 53 A3 59 A9 07 72 96 7F D0 96 C2 5C 0E EC E6 A4 9D 7C C3 5F 7B 1C B5 9A ED F6 DE 5E 2F 9A B1 09 10 0B 80 6B C0 F8 C6 32 37 2F 41 9A B7 BA 8D C1 B6 01 F7 8D 50 E3 57 A6 33 C5 80 29 40 3C 30 84 08 5C 40 F7 C6 03 +TEA decrypted: F3 77 B0 EC 44 8E 39 B6 0B BF 8F 19 80 3C B3 AD 70 F8 80 D7 34 B9 EE 3A A1 5A 31 D0 19 70 1F 09 5D 41 76 6C 4E 47 E2 A5 81 CC 06 CF AD D4 07 74 59 EA 6C BC 55 00 F3 A9 B5 21 9B 1D FC 00 B4 05 13 26 01 F9 2F C7 16 E3 4F 17 CF 7A 86 63 88 2A 0C 89 6E E2 90 F4 72 DF 91 A5 13 17 7E 30 90 0F 7A BA 43 37 DD 46 17 46 +TEA encrypt: 13 94 07 50 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 5E 8C 5B 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 12 55 CB 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 8A 4B 77 4E E3 65 65 05 89 C3 82 8D 73 AA FC E8 +TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B +TEA encrypt: 01 12 00 38 3D E7 6E BB FC C4 A9 7E 1F AF 38 7D ED 3A 5F 9F 29 9C EA 88 BC E2 E9 99 79 76 C2 DC A7 C4 97 5F 94 EB 71 4D A6 E3 8E 6A B5 FD 2A D4 C6 9E C8 BA D2 ED CC D6 59 B3 5F C1 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 B6 AC C8 A4 11 59 5A 15 B4 65 5F DF ED 82 1D 4A F4 07 F9 3E B5 33 65 D8 04 C3 52 F9 58 02 6F 81 FF 96 5A 97 D8 2F 83 C7 6D 53 EA 30 67 CA C2 62 00 E5 83 67 31 C9 07 BE DC 94 17 A3 4E C7 44 D4 57 5C FA 37 ED B6 AF AD BA 01 93 2F 85 20 5D C1 B1 CA 78 33 38 F5 0B 37 EF 6B 7C 5D 66 D1 10 E5 46 67 74 86 A0 F4 3A CD 10 96 7D DC B8 79 5D 97 37 C3 FF E9 98 94 3C 4E 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 5A 0C 99 46 D3 7B 41 88 C5 46 2B B6 66 EA FD BD 90 8D C6 4D 6E 94 A6 30 B0 83 64 1B 70 56 67 84 53 62 79 BD 34 F7 A5 22 BC B5 96 65 46 0F 1A 54 8B 62 A3 B0 D5 C3 66 7B 27 71 1C B4 C5 11 EA 00 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 10 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 C1 57 54 04 89 B0 32 3C CE 59 15 3C DF 64 E8 79 BD 0C 0B 42 +packet sent: 02 37 13 08 36 31 03 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA 87 45 98 A8 AB FA F2 ED 86 95 5F 04 89 67 74 11 F6 61 AF D5 77 92 BE DA 1B 95 97 EA 46 29 E0 A7 57 DD 07 57 75 20 67 FB 09 BA A9 54 84 75 CE 1D FF 2B 7B 56 88 A8 43 DF 57 24 2A 08 4E 9A 81 1E 36 C6 F8 DB 95 44 E2 11 89 39 77 A6 DD D4 35 65 2A E7 02 73 B6 DC EA 76 27 91 04 E4 CF C4 47 F6 00 48 4F 63 C2 4B 37 CD 5A DF 34 6F 2F 14 6B 6B 39 AB 79 D5 47 C8 18 DC B9 3C 5A 36 15 89 D7 D5 FD EF 41 F0 68 42 A9 22 FA D5 90 B3 1B BE D6 4F 44 5D 70 4D BE 8E 7C 5F D5 1A 5D 11 C9 F9 F6 44 20 08 39 04 56 83 30 11 2F AE 81 85 55 A8 AA 99 68 E7 51 15 13 EF 7D E4 3F 0D E3 2B E3 52 A1 84 74 68 36 AF 17 01 49 5B 81 93 19 C8 77 9C 4C 3F C2 00 AD CB EF AC E1 20 85 57 11 36 96 94 42 2C 0D 2A 29 AA 0B 72 39 87 1E EA 36 D7 23 E2 40 07 99 DC CA 6A 9B DE 25 5A E5 05 C6 32 9C 98 8F D2 CD E0 D3 7D E1 E4 17 0D A1 DA 5B CC 53 F6 14 98 CF B2 23 EB 61 35 22 65 C2 A6 8D AC BA 4E D1 0D B1 58 BC ED 35 FC A7 DE A6 1A 2C AF 7B 06 DB 74 4E 81 E0 CE 05 EB 4A AB 9C 96 CC 96 F4 28 E7 B8 F5 95 9E 8D 6E 81 B0 6B 38 ED 29 BC 41 DE B0 3C 8E 4F 64 4B CD 5C F7 D8 24 95 81 BA F7 C0 44 F5 05 31 60 A3 B4 A9 FB D7 D5 E2 AC 8D F2 34 2D 6E 30 84 C3 0F DB 9D 4E 87 34 AE 23 11 47 50 B1 90 F1 9D 9E 9C BD 96 45 3C 60 68 7F 19 F0 F4 13 B2 8F 9A 4F C7 1B 82 C5 A3 DF 5D CF A6 E9 EA 17 46 57 69 81 52 D5 F2 82 B5 51 DF 39 35 39 70 BB 73 9A AA 0C B8 EF 1D DA 43 2A 6D 73 3E FD 6A CC 7C 60 E4 DF 0A A8 B0 B5 A2 E8 72 DC 7A 8F 87 F2 16 06 F6 0D 30 6A 12 F4 29 62 97 EB D8 41 5B 34 23 E0 CB 12 41 37 6D AD D7 34 24 38 C6 69 5E 94 11 D1 C1 48 68 64 B4 3B 5A 07 A9 BC 06 A0 15 6F EA A8 D4 48 14 5D 37 D7 1B 6E AE 51 1E ED 2C 07 86 D5 5D 3F 95 1E AE 25 F7 19 ED 68 E6 E5 C1 93 10 03 +TEA decrypted: 7B 77 D9 8C C0 93 52 8B 44 D5 FB B2 F7 2C 0B 86 C3 9B 8D 6D A2 53 5C C5 C5 B2 68 11 7D BF B7 02 55 0E 28 38 A9 B5 13 B4 9E 97 B4 6A 26 81 BE F6 A2 9E 5E F2 D5 E3 7E 7A 69 BB 3B 89 0C B5 7D 1C 11 E0 EF AA 4E 77 D5 ED A0 43 C3 E8 0E 73 5D FD 35 6D FE 2F B0 49 4F 02 9C 6F 13 5B 60 CE 52 A9 8C EC 42 57 2D 5A 47 7B 2E 8C EC 02 63 60 6E 20 1D D6 A7 15 89 27 92 0F 03 64 57 3A E8 20 6F 30 10 BF B4 A0 C1 95 BF 6C E4 25 74 30 81 9A C9 EB B2 AB 6F D4 98 FE 59 6C 0D 32 29 B3 91 68 F9 D2 96 B1 50 3F C3 CB 84 C3 E2 A2 D6 3B D5 3A E8 EA 10 52 4C 05 A9 B8 33 18 DA 52 EC B9 75 74 F5 BB 51 E8 FB D6 9B 17 CC A4 B4 FF C1 2B 41 CA 6A E0 E6 64 FF 06 C5 56 9C 8F E0 EF 45 52 53 69 A3 C4 26 42 4E 49 26 60 3D C5 03 90 61 CC 7B D0 CA 00 1A 2A B5 F6 37 90 A4 FF 15 6D 32 1A EC CA D7 5F +TEA decrypted: 21 0B EB 52 24 0A C0 42 7A 15 D7 4A C9 3B C7 F5 F4 F0 CC 68 A4 AF 37 39 5E FF 83 C4 A1 C7 A1 4B 20 2A F4 D5 62 D9 5F 1A 45 39 35 AF 7B 7E 7B 2F DE 29 05 55 CA 0F F7 12 40 50 64 CB 2F 93 AB F8 0C 7B 40 52 8C 4A 4E 8F 81 8C F2 33 57 E2 8E C3 71 78 17 03 B2 86 9C E6 F3 C9 DC C7 14 99 F4 9D D4 43 56 B3 79 29 80 14 77 7D 99 A1 35 B8 60 A2 A7 B0 70 31 81 25 87 73 06 41 00 91 D1 B1 A1 EB FC 28 2E 55 DA 63 2D 31 D1 48 E3 DB 6F 78 66 A5 4A 4C 7F 46 2B DE 7B 16 0E B1 C4 59 9D 02 15 45 8C C5 89 69 B5 BF D6 81 EA 66 52 02 0E 13 7F 7F EA 87 0C D4 B2 5E EF 76 2C 79 36 E1 1A AF B8 B9 CC 76 E7 91 E7 AE 2D F2 6E 3F 4B 05 0E 33 9F 56 04 18 CE 6B 23 6B 32 F6 25 48 DD 77 1B DB ED E8 E4 69 94 DD A3 74 08 0C 77 86 00 25 F2 9D 4A 34 +TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B +TEA encrypt: 01 12 00 38 3D E7 6E BB FC C4 A9 7E 1F AF 38 7D ED 3A 5F 9F 29 9C EA 88 BC E2 E9 99 79 76 C2 DC A7 C4 97 5F 94 EB 71 4D A6 E3 8E 6A B5 FD 2A D4 C6 9E C8 BA D2 ED CC D6 59 B3 5F C1 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 78 BC 24 30 D3 21 F7 8D 36 0D 1C 79 4E 75 5B 17 D1 54 A2 95 B8 E5 89 04 FC E1 CA 76 B0 01 8F 0C 9E 1C 98 04 2D D3 BA FE A0 7E 15 49 A3 04 46 E4 FE 37 E4 C2 09 D0 DA 89 3E E8 20 85 8F A9 D2 A2 A7 DF 7D 52 F1 9F 93 60 3C 58 63 D7 9E C3 6E 01 EF D5 32 98 FE 36 41 B3 E3 BB 22 AD C5 BF 2D 9F A1 91 D1 E6 11 94 5E 21 C9 98 C4 AE D8 A2 85 5F D7 2B D8 7D 93 1E BB EB 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 2E C9 53 D6 3F 21 E6 6C 50 F4 20 6E 9D 71 7E 3F 2B 22 02 8B 80 AD 08 54 3A 9C DB 74 C0 F3 AE A3 1C FB 53 82 5B 75 7B 4E 6A C1 FC E8 85 51 42 3C EE 5C 73 DD 9A 13 95 A2 14 5A B7 F4 AE ED C8 6B 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 10 00 3C 00 01 00 38 D3 00 ED E1 26 79 8E 7A 24 6A C8 1D C3 77 66 E9 38 5A 74 65 E0 9A B9 3D F2 79 55 C8 30 EA 56 1C 4E 80 BF 92 28 5D C4 D9 47 CE 1D 50 38 6B 01 54 B8 33 87 C0 4A 17 74 76 03 12 00 05 01 00 00 00 01 05 08 00 05 10 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 8B 30 9B F0 F0 01 5E 66 B2 40 08 B6 91 07 9B 6E 00 FA B6 8C +packet sent: 02 37 13 08 36 31 04 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA 66 89 53 B3 E3 C3 81 2F 78 64 6E E9 04 73 47 F1 8D BB F5 5A 4C BF 85 89 E3 7D 87 68 98 20 7B D5 C6 E4 82 85 19 BF F9 27 8A B8 42 22 18 36 92 9D 0C 73 83 87 C3 A1 22 17 8D 3C 3A 86 3D F3 FF 9C A8 FB BC C0 02 D4 DC FE 55 45 BC 76 42 A6 13 87 82 25 3A 80 1D 78 A9 81 1E 2C B9 5D 72 EA CD CE EC D6 7A 12 4B 75 29 D7 D8 A2 88 52 CA 71 B6 9D F7 9A 0D 07 63 BD 29 C0 D8 0C E7 C8 2A FB F5 29 B3 84 86 07 99 0A 36 DE D3 CE 69 2C EC D6 B9 C1 5E ED 96 D4 98 CB 7C F2 70 22 C4 15 D5 B2 63 9D 98 E1 78 3F 70 43 48 50 A8 D1 FB E7 EC C4 D0 A7 8E FA 19 41 4F FB 95 75 A2 AA 9D E2 FE 8C 5D 08 60 8A C7 4B E1 53 62 72 0B 6C 6B 2F D8 38 B8 41 CA DD 09 E7 E1 32 F1 EE A8 73 99 14 EC F4 B9 E2 9F 8A 6D A8 2F AB FE 2B 8E 0D C7 07 02 FF C9 66 2D 67 0C 15 64 BE F1 C3 7F B2 60 E4 5A EB C3 25 49 02 52 6B 77 49 3E 58 15 69 E0 13 B7 53 F0 09 9F 31 D8 3C 88 9B 43 1C 0E DE 09 A1 35 8C 23 BC 3C 6C 6C 76 0F 69 99 12 CE 37 5B B8 E4 3F 16 C0 70 1E D0 03 1C 5E FD D6 7D 9A 20 25 4D E0 E1 91 CE 84 19 D5 5F 70 1A DC 1E 4C 7E 29 03 B7 DE 71 21 34 C0 0C 27 27 82 74 8F 91 54 F9 1C 53 B7 3E E3 A3 29 E9 FE 5B A8 CE FA D0 41 24 59 DD 17 38 A0 0E 63 12 96 0A 10 8F 96 20 26 C5 95 58 CE 67 A5 F6 34 37 F3 AD CE 2B 2B B3 4B 25 5E 17 98 95 60 C0 5E 26 FE 36 4F 2E 21 65 0F C6 AB BB C6 6A 7A 24 BE 92 3E 9E 83 56 FE D5 AA F4 25 6A 83 19 86 C1 04 84 36 20 B7 29 CA 42 AC 29 E9 A2 14 95 4C 6F 0F E5 17 D4 C8 0D 27 87 8A 8F E8 7D 44 EE 1C CE 98 3A 5D 73 FE 79 C1 44 67 FD DE 22 A3 73 85 57 37 06 F7 14 C1 53 F8 DE 0B 91 36 81 CD DE E8 51 8B 28 5F 24 54 F4 47 D3 40 51 E3 59 BB D2 EC 58 1B 4B CE 98 AC 4F 99 1A 85 1C 09 D1 17 16 98 B7 3A 97 CA AD FD 04 7B 63 04 51 66 31 BE 85 A4 CF 61 58 7D EA AD C0 62 84 83 35 94 8D 08 47 85 7C 55 E0 DD 0E 33 59 17 71 9A 9E F1 1A 9C 63 05 A7 9D FC B2 36 44 0D 18 21 B4 6F 66 6E 45 B3 04 91 5A B1 34 30 EC 6F 98 2C 02 C6 16 46 55 1B 03 + + +