Commit 1a1dbdab authored by Him188moe's avatar Him188moe

update

parent 31bb236e
...@@ -49,8 +49,21 @@ interface Protocol { ...@@ -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 _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" const val _0836key1 = "EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA"
private val hexToByteArrayCacheMap: MutableMap<Int, ByteArray> = mutableMapOf()
@ExperimentalUnsignedTypes @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 @ExperimentalUnsignedTypes
fun hexToUBytes(hex: String): UByteArray = Arrays fun hexToUBytes(hex: String): UByteArray = Arrays
......
...@@ -10,12 +10,12 @@ import net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePa ...@@ -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.security.ServerSessionKeyResponsePacketEncrypted
import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
import net.mamoe.mirai.util.getRandomKey import net.mamoe.mirai.util.*
import net.mamoe.mirai.util.toHexString
import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.MiraiLogger
import java.net.DatagramPacket import java.net.DatagramPacket
import java.net.DatagramSocket import java.net.DatagramSocket
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.util.*
/** /**
* A robot account. * A robot account.
...@@ -97,15 +97,39 @@ class Robot(val number: Int, private val password: String) { ...@@ -97,15 +97,39 @@ class Robot(val number: Int, private val password: String) {
//是ClientPasswordSubmissionPacket之后服务器回复的 //是ClientPasswordSubmissionPacket之后服务器回复的
is ServerLoginResponseResendPacket -> { is ServerLoginResponseResendPacket -> {
if (packet.token00BA != null) { if (packet.tokenUnknown != null) {
this.token00BA = packet.token00BA!! //this.token00BA = packet.token00BA!!
println(token00BA) //println("token00BA changed!!! to " + token00BA.toUByteArray())
} }
if (packet.flag == ServerLoginResponseResendPacket.Flag.`08 36 31 03`) { if (packet.flag == ServerLoginResponseResendPacket.Flag.`08 36 31 03`) {
this.tgtgtKey = packet.tgtgtKey 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 { } 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) { ...@@ -126,8 +150,10 @@ class Robot(val number: Int, private val password: String) {
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun sendPacket(packet: ClientPacket) { fun sendPacket(packet: ClientPacket) {
sendPacketDebug(packet);
if (true) return;
try { try {
MiraiLogger log "Encoding" //MiraiLogger log "Encoding"
packet.encode() packet.encode()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
...@@ -137,12 +163,45 @@ class Robot(val number: Int, private val password: String) { ...@@ -137,12 +163,45 @@ class Robot(val number: Int, private val password: String) {
p.socketAddress = this.serverAddress*/ p.socketAddress = this.serverAddress*/
//ctx.writeAndFlush(packet.toByteArray()).sync() //ctx.writeAndFlush(packet.toByteArray()).sync()
MiraiLogger info "Sending: $packet" MiraiLogger info "Sending: $packet"
packet.logging()
packet.toByteArray().packetSentDebugLogging()
//GlobalScope.launch { //GlobalScope.launch {
send(packet.toByteArray()) send(packet.toByteArray())
//} //}
//println(channel!!.writeAndFlush(packet.toByteArray()).channel().connect(serverAddress).sync().get()) //println(channel!!.writeAndFlush(packet.toByteArray()).channel().connect(serverAddress).sync().get())
} }
val packetQueue: MutableList<String> = 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) // private val socket = DatagramSocket(15314)
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
...@@ -153,7 +212,7 @@ class Robot(val number: Int, private val password: String) { ...@@ -153,7 +212,7 @@ class Robot(val number: Int, private val password: String) {
val dp1 = DatagramPacket(ByteArray(22312), 22312) val dp1 = DatagramPacket(ByteArray(22312), 22312)
socket.send(DatagramPacket(data, data.size)) socket.send(DatagramPacket(data, data.size))
MiraiLogger info "Packet sent: ${data.toUByteArray().toHexString()}" MiraiLogger info "Packet sent: ${data.toUByteArray().toUHexString()}"
socket.receive(dp1) socket.receive(dp1)
val zeroByte: Byte = 0 val zeroByte: Byte = 0
var i = dp1.data.size - 1; var i = dp1.data.size - 1;
...@@ -164,6 +223,9 @@ class Robot(val number: Int, private val password: String) { ...@@ -164,6 +223,9 @@ class Robot(val number: Int, private val password: String) {
onPacketReceived(ServerPacket.ofByteArray(dp1.data.copyOfRange(0, i + 1))) onPacketReceived(ServerPacket.ofByteArray(dp1.data.copyOfRange(0, i + 1)))
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
repeat(100) { println() }
println(DebugLogger.buff.toString())
System.exit(1)
} }
} }
......
...@@ -53,7 +53,15 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet { ...@@ -53,7 +53,15 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
} }
override fun toString(): String { 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 ...@@ -128,8 +136,8 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, log
val md5_1 = md5(password); val md5_1 = md5(password);
val md5_2 = md5(md5_1 + "00 00 00 00".hexToBytes() + qq.toByteArray()) val md5_2 = md5(md5_1 + "00 00 00 00".hexToBytes() + qq.toByteArray())
println(md5_1.toUByteArray().toHexString()) println(md5_1.toUByteArray().toUHexString())
println(md5_2.toUByteArray().toHexString()) println(md5_2.toUByteArray().toUHexString())
it.write(md5_1) it.write(md5_1)
it.writeInt(loginTime) it.writeInt(loginTime)
it.writeByte(0); it.writeByte(0);
...@@ -147,7 +155,7 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, log ...@@ -147,7 +155,7 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, log
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun main() { 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 @ExperimentalUnsignedTypes
...@@ -190,7 +198,7 @@ fun Int.toLByteArray(): ByteArray = byteArrayOf( ...@@ -190,7 +198,7 @@ fun Int.toLByteArray(): ByteArray = byteArrayOf(
) )
@ExperimentalUnsignedTypes @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()) private fun md5(str: String): ByteArray = MessageDigest.getInstance("MD5").digest(str.toByteArray())
......
...@@ -14,6 +14,7 @@ import java.net.InetAddress ...@@ -14,6 +14,7 @@ import java.net.InetAddress
*/ */
@PacketId("08 36 31 03") @PacketId("08 36 31 03")
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@TestedSuccessfully
class ClientPasswordSubmissionPacket( class ClientPasswordSubmissionPacket(
private val qq: Int, private val qq: Int,
private val password: String, private val password: String,
...@@ -38,8 +39,34 @@ class ClientPasswordSubmissionPacket( ...@@ -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") @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) 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") @PacketId("08 36 31 06")
...@@ -47,7 +74,16 @@ class ClientLoginResendPacket3104(qq: Int, password: String, loginTime: Int, log ...@@ -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) 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 @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() { override fun encode() {
this.writeQQ(qq) this.writeQQ(qq)
this.writeHex(Protocol._0836_622_fix1) this.writeHex(Protocol._0836_622_fix1)
...@@ -72,9 +108,6 @@ open class ClientLoginResendPacket internal constructor(val qq: Int, val passwor ...@@ -72,9 +108,6 @@ open class ClientLoginResendPacket internal constructor(val qq: Int, val passwor
} }
} }
fun main() {
println(InetAddress.getLocalHost().hostAddress)
}
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@PacketId("08 28 04 34") @PacketId("08 28 04 34")
...@@ -180,7 +213,7 @@ private fun DataOutputStream.writePart2() { ...@@ -180,7 +213,7 @@ private fun DataOutputStream.writePart2() {
this.writeHex("05 08")//tag this.writeHex("05 08")//tag
this.writeHex("00 05")//length 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("03 13")//tag
this.writeHex("00 19")//length this.writeHex("00 19")//length
......
...@@ -8,7 +8,7 @@ import net.mamoe.mirai.network.packet.client.writeIP ...@@ -8,7 +8,7 @@ import net.mamoe.mirai.network.packet.client.writeIP
import net.mamoe.mirai.network.packet.client.writeQQ import net.mamoe.mirai.network.packet.client.writeQQ
import net.mamoe.mirai.util.ByteArrayDataOutputStream import net.mamoe.mirai.util.ByteArrayDataOutputStream
import net.mamoe.mirai.util.TEACryptor import net.mamoe.mirai.util.TEACryptor
import net.mamoe.mirai.util.toHexString import net.mamoe.mirai.util.toUHexString
import java.io.IOException import java.io.IOException
/** /**
...@@ -23,7 +23,7 @@ class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() { ...@@ -23,7 +23,7 @@ class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() {
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@Throws(IOException::class) @Throws(IOException::class)
override fun encode() { override fun encode() {
//println(this.toUByteArray().toHexString(" ")) //println(this.toUByteArray().toUHexString(" "))
//exitProcess(1) //exitProcess(1)
this.writeQQ(qq) this.writeQQ(qq)
...@@ -43,7 +43,7 @@ class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() { ...@@ -43,7 +43,7 @@ class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() {
//this.writeIP("123456789") //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("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) this.writeHex(Protocol.publicKey)
println(super.toUByteArray().toHexString()) println(super.toUByteArray().toUHexString())
return super.toByteArray() return super.toByteArray()
} }
}.toByteArray())) }.toByteArray()))
...@@ -58,7 +58,7 @@ fun main() { ...@@ -58,7 +58,7 @@ fun main() {
pk.encode() pk.encode()
pk.writeHex(Protocol.tail) pk.writeHex(Protocol.tail)
//println("pk.toByteArray() = " + pk.toUByteArray().contentToString()) //println("pk.toByteArray() = " + pk.toUByteArray().contentToString())
println(pk.toUByteArray().toHexString(" ")) println(pk.toUByteArray().toUHexString(" "))
/* /*
println(object : ByteArrayDataOutputStream() { println(object : ByteArrayDataOutputStream() {
...@@ -67,7 +67,7 @@ fun main() { ...@@ -67,7 +67,7 @@ fun main() {
this.writeInt(1994701021) this.writeInt(1994701021)
return super.toUByteArray() return super.toUByteArray()
} }
}.toUByteArray().toHexString())*/ }.toUByteArray().toUHexString())*/
/* /*
...@@ -85,7 +85,7 @@ fun main() { ...@@ -85,7 +85,7 @@ fun main() {
this.writeHex(Protocol.publicKey) this.writeHex(Protocol.publicKey)
return super.toUByteArray() return super.toUByteArray()
} }
}.toUByteArray().toHexString(" ")) }.toUByteArray().toUHexString(" "))
*/ */
} }
......
...@@ -6,7 +6,7 @@ import net.mamoe.mirai.network.packet.server.login.* ...@@ -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.ServerTouchResponsePacket
import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
import net.mamoe.mirai.util.getAllDeclaredFields import net.mamoe.mirai.util.getAllDeclaredFields
import net.mamoe.mirai.util.toHexString import net.mamoe.mirai.util.toUHexString
import java.io.DataInputStream import java.io.DataInputStream
/** /**
...@@ -20,7 +20,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { ...@@ -20,7 +20,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun ofByteArray(bytes: ByteArray): ServerPacket { fun ofByteArray(bytes: ByteArray): ServerPacket {
println("Raw received: ${bytes.toUByteArray().toHexString()}") println("Raw received: ${bytes.toUByteArray().toUHexString()}")
val stream = bytes.dataInputStream() val stream = bytes.dataInputStream()
...@@ -41,7 +41,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { ...@@ -41,7 +41,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
} }
if (bytes.size > 700) { if (bytes.size > 700) {
return ServerLoginResponseSuccessPacketEncrypted(stream, bytes.size) return ServerLoginResponseSuccessPacketEncrypted(stream)
} }
return ServerLoginResponseFailedPacket(when (bytes.size) { return ServerLoginResponseFailedPacket(when (bytes.size) {
...@@ -53,7 +53,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { ...@@ -53,7 +53,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
359 -> ServerLoginResponseFailedPacket.State.TAKEN_BACK 359 -> ServerLoginResponseFailedPacket.State.TAKEN_BACK
//unknown //unknown
63 -> throw IllegalArgumentException(bytes.size.toString()) 63 -> throw IllegalArgumentException(bytes.size.toString())//可能是已经完成登录, 服务器拒绝第二次登录
351 -> throw IllegalArgumentException(bytes.size.toString()) 351 -> throw IllegalArgumentException(bytes.size.toString())
else -> throw IllegalArgumentException(bytes.size.toString()) else -> throw IllegalArgumentException(bytes.size.toString())
...@@ -169,7 +169,15 @@ DataArrived >> AnalyMessage ...@@ -169,7 +169,15 @@ DataArrived >> AnalyMessage
} }
override fun toString(): String { 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()
}
}
}
} }
} }
......
...@@ -5,6 +5,9 @@ import net.mamoe.mirai.network.packet.server.ServerPacket ...@@ -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.dataInputStream
import net.mamoe.mirai.network.packet.server.goto import net.mamoe.mirai.network.packet.server.goto
import net.mamoe.mirai.util.TEACryptor 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 import java.io.DataInputStream
/** /**
...@@ -18,18 +21,21 @@ class ServerLoginResponseResendPacket(input: DataInputStream, val flag: Flag) : ...@@ -18,18 +21,21 @@ class ServerLoginResponseResendPacket(input: DataInputStream, val flag: Flag) :
} }
lateinit var _0836_tlv0006_encr: ByteArray; lateinit var _0836_tlv0006_encr: ByteArray;
var token00BA: ByteArray? = null var tokenUnknown: ByteArray? = null
lateinit var tgtgtKey: ByteArray lateinit var tgtgtKey: ByteArray
@TestedSuccessfully
override fun decode() { override fun decode() {
this.input.skip(5) this.input.skip(5)
tgtgtKey = this.input.readNBytes(16)//22 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) _0836_tlv0006_encr = this.input.readNBytes(120)
when (flag) { when (flag) {
Flag.`08 36 31 03` -> { Flag.`08 36 31 03` -> {
token00BA = this.input.goto(153).readNBytes(56) tokenUnknown = this.input.goto(153).readNBytes(56)
println(tokenUnknown!!.toUHexString())
} }
Flag.OTHER -> { Flag.OTHER -> {
...@@ -46,11 +52,26 @@ class ServerLoginResponseResendPacketEncrypted(input: DataInputStream, private v ...@@ -46,11 +52,26 @@ class ServerLoginResponseResendPacketEncrypted(input: DataInputStream, private v
} }
@TestedSuccessfully
fun decrypt(tgtgtKey: ByteArray): ServerLoginResponseResendPacket { fun decrypt(tgtgtKey: ByteArray): ServerLoginResponseResendPacket {
//this.input.skip(7)
this.input goto 14 this.input goto 14
var data: ByteArray = this.input.readAllBytes() var data: ByteArray = this.input.readAllBytes()
data = TEACryptor.CRYPTOR_SHARE_KEY.decrypt(data.let { it.copyOfRange(0, it.size - 1) }); 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) 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
...@@ -7,7 +7,7 @@ import net.mamoe.mirai.network.packet.server.readNBytes ...@@ -7,7 +7,7 @@ import net.mamoe.mirai.network.packet.server.readNBytes
import net.mamoe.mirai.network.packet.server.readVarString import net.mamoe.mirai.network.packet.server.readVarString
import net.mamoe.mirai.util.TEACryptor import net.mamoe.mirai.util.TEACryptor
import net.mamoe.mirai.util.hexToBytes import net.mamoe.mirai.util.hexToBytes
import net.mamoe.mirai.util.toHexString import net.mamoe.mirai.util.toUHexString
import java.io.DataInputStream import java.io.DataInputStream
/** /**
...@@ -41,7 +41,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen ...@@ -41,7 +41,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen
//?? //??
var b = this.input.readNBytes(2) var b = this.input.readNBytes(2)
val msgLength = when (b.toUByteArray().toHexString()) { val msgLength = when (b.toUByteArray().toUHexString()) {
"01 07" -> 0 "01 07" -> 0
"00 33" -> 28 "00 33" -> 28
"01 10" -> 65 "01 10" -> 65
...@@ -99,7 +99,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen ...@@ -99,7 +99,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen
this.token38 = this.input.readNBytes(56)//82 this.token38 = this.input.readNBytes(56)//82
this.input.skip(60L)//142 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 "01 07" -> 0
"00 33" -> 28 "00 33" -> 28
"01 10" -> 64 "01 10" -> 64
...@@ -119,19 +119,19 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen ...@@ -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() { override fun decode() {
} }
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun decrypt(tgtgtKey: ByteArray): ServerLoginResponseSuccessPacket {//todo test fun decrypt(tgtgtKey: ByteArray): ServerLoginResponseSuccessPacket {
input.skip(7) input goto 14
var bytes = input.readAllBytes(); var bytes = input.readAllBytes()
bytes = bytes.copyOfRange(0, bytes.size - 1); bytes = bytes.copyOfRange(0, bytes.size - 1)
println(bytes.toUByteArray().toHexString()) 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) //TeaDecrypt(取文本中间(data, 43, 取文本长度(data) - 45), m_0828_rec_decr_key)
} }
} }
...@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.packet.server.ServerPacket ...@@ -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.dataInputStream
import net.mamoe.mirai.network.packet.server.goto import net.mamoe.mirai.network.packet.server.goto
import net.mamoe.mirai.util.TEACryptor import net.mamoe.mirai.util.TEACryptor
import net.mamoe.mirai.util.toHexString import net.mamoe.mirai.util.toUHexString
import java.io.DataInputStream import java.io.DataInputStream
/** /**
...@@ -31,7 +31,7 @@ class ServerLoginResponseVerificationCodePacket(input: DataInputStream, val pack ...@@ -31,7 +31,7 @@ class ServerLoginResponseVerificationCodePacket(input: DataInputStream, val pack
this.input.skip(1) this.input.skip(1)
val b = this.input.readByte() val b = this.input.readByte()
println(b.toHexString()) println(b.toUHexString())
this.token00BA = this.input.goto(packetLength - 60).readNBytes(40) this.token00BA = this.input.goto(packetLength - 60).readNBytes(40)
} }
......
...@@ -6,7 +6,7 @@ import net.mamoe.mirai.network.packet.server.readIP ...@@ -6,7 +6,7 @@ import net.mamoe.mirai.network.packet.server.readIP
import net.mamoe.mirai.util.TEACryptor import net.mamoe.mirai.util.TEACryptor
import net.mamoe.mirai.util.getRandomKey import net.mamoe.mirai.util.getRandomKey
import net.mamoe.mirai.util.hexToBytes import net.mamoe.mirai.util.hexToBytes
import net.mamoe.mirai.util.toHexString import net.mamoe.mirai.util.toUHexString
import java.io.DataInputStream import java.io.DataInputStream
/** /**
...@@ -48,7 +48,7 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp ...@@ -48,7 +48,7 @@ class ServerTouchResponsePacket(inputStream: DataInputStream) : ServerPacket(inp
} }
else -> { 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 ...@@ -64,7 +64,7 @@ class ServerTouchResponsePacketEncrypted(private val type: ServerTouchResponsePa
input.skip(7) input.skip(7)
var bytes = input.readAllBytes(); var bytes = input.readAllBytes();
bytes = bytes.copyOfRange(0, bytes.size - 1); bytes = bytes.copyOfRange(0, bytes.size - 1);
println(bytes.toUByteArray().toHexString()) println(bytes.toUByteArray().toUHexString())
return ServerTouchResponsePacket(DataInputStream(TEACryptor.decrypt(bytes, when (type) { return ServerTouchResponsePacket(DataInputStream(TEACryptor.decrypt(bytes, when (type) {
ServerTouchResponsePacket.Type.TYPE_08_25_31_02 -> Protocol.redirectionKey.hexToBytes() ServerTouchResponsePacket.Type.TYPE_08_25_31_02 -> Protocol.redirectionKey.hexToBytes()
......
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
...@@ -239,11 +239,13 @@ public class TEACryptor { ...@@ -239,11 +239,13 @@ public class TEACryptor {
} }
public byte[] encrypt(byte[] plaintext) { public byte[] encrypt(byte[] plaintext) {
DebugLoggerKt.encryptionDebugLogging(plaintext);
System.out.println("TEA加密, 原文=" + UtilsKt.toUHexString(plaintext)); System.out.println("TEA加密, 原文=" + UtilsKt.toUHexString(plaintext));
return encrypt(plaintext, 0, plaintext.length); return encrypt(plaintext, 0, plaintext.length);
} }
public byte[] decrypt(byte[] ciphertext) { public byte[] decrypt(byte[] ciphertext) {
DebugLoggerKt.decryptionDebugLogging(ciphertext);
return decrypt(ciphertext, 0, ciphertext.length); return decrypt(ciphertext, 0, ciphertext.length);
} }
} }
\ No newline at end of file
package net.mamoe.mirai.util
/**
* @author Him188moe
*/
annotation class TestedSuccessfully
\ No newline at end of file
...@@ -32,20 +32,23 @@ object Utils { ...@@ -32,20 +32,23 @@ object Utils {
fun ByteArray.toHexString(): String = toHexString(" ") fun ByteArray.toHexString(): String = toHexString(" ")
fun ByteArray.toHexString(separator: String = " "): String = Utils.toHexString(this, separator) fun ByteArray.toHexString(separator: String = " "): String = Utils.toHexString(this, separator)
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun ByteArray.toUHexString(separator: String = " "): String = this.toUByteArray().toHexString(separator) fun ByteArray.toUHexString(separator: String = " "): String = this.toUByteArray().toUHexString(separator)
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun ByteArray.toUHexString(): String = this.toUByteArray().toHexString() fun ByteArray.toUHexString(): String = this.toUByteArray().toUHexString()
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun UByteArray.toHexString(separator: String = " "): String = Utils.toHexString(this, separator) fun UByteArray.toUHexString(separator: String = " "): String = Utils.toHexString(this, separator)
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun UByteArray.toHexString(): String = toHexString(" ") fun UByteArray.toUHexString(): String = this.toUHexString(" ")
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun Byte.toHexString(): String = this.toUByte().toString(16) fun Byte.toUHexString(): String = this.toUByte().toString(16)
/**
* firstly [Protocol.hexToUBytes], secondly [UByteArray.toByteArray]
*/
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun String.hexToBytes(): ByteArray = Protocol.hexToBytes(this) fun String.hexToBytes(): ByteArray = Protocol.hexToBytes(this)
...@@ -55,6 +58,9 @@ fun String.hexToUBytes(): UByteArray = Protocol.hexToUBytes(this) ...@@ -55,6 +58,9 @@ fun String.hexToUBytes(): UByteArray = Protocol.hexToUBytes(this)
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun String.hexToShort(): Short = hexToBytes().let { ((it[1].toInt() shl 8) + it[0]).toShort() } 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 @ExperimentalUnsignedTypes
fun String.hexToByte(): Byte = hexToBytes()[0] fun String.hexToByte(): Byte = hexToBytes()[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 &circ; preCrypt) &circ;
* prePlain 所以,从crypt得到plain的过程自然是 plain = d(crypt &circ; prePlain) &circ;
* preCrypt 此外,算法有它的填充机制,其会在明文前和明文后分别填充一定的字节数,以保证明文长度是8字节的倍数
* 填充的字节数与原始明文长度有关,填充的方法是:
*
* <pre>
* <code>
*
* ------- 消息填充算法 -----------
* a = (明文长度 + 10) mod 8
* if(a 不等于 0) a = 8 - a;
* b = 随机数 &amp; 0xF8 | a; 这个的作用是把a的值保存了下来
* plain[0] = b; 然后把b做为明文的第0个字节,这样第0个字节就保存了a的信息,这个信息在解密时就要用来找到真正明文的起始位置
* plain[1 至 a+2] = 随机数 &amp; 0xFF; 这里用随机数填充明文的第1到第a+2个字节
* plain[a+3 至 a+3+明文长度-1] = 明文; 从a+3字节开始才是真正的明文
* plain[a+3+明文长度, 最后] = 0; 在最后,填充0,填充到总长度为8的整数为止。到此为止,结束了,这就是最后得到的要加密的明文内容
* ------- 消息填充算法 ------------
*
* </code>
* </pre>
*
* @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 <br>
* (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();
}
}
...@@ -173,17 +173,19 @@ public class HexComparator { ...@@ -173,17 +173,19 @@ public class HexComparator {
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(HexComparator.compare( System.out.println(HexComparator.compare(
//mirai //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 //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( System.out.println(HexComparator.compare(
//e //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", "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 //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" "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"
)); ));*/
} }
} }
import net.mamoe.mirai.network.packet.client.login.ClientPasswordSubmissionPacket import net.mamoe.mirai.network.packet.client.login.ClientPasswordSubmissionPacket
import net.mamoe.mirai.network.packet.server.login.ServerLoginResponseVerificationCodePacket import net.mamoe.mirai.util.toUHexString
import net.mamoe.mirai.util.hexToBytes
import net.mamoe.mirai.util.toHexString
import java.io.DataInputStream
import java.io.File
import java.io.FileOutputStream
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
fun main(){ fun main(){
...@@ -13,8 +8,8 @@ fun main(){ ...@@ -13,8 +8,8 @@ fun main(){
val s = DataInputStream(data.hexToBytes().inputStream()) val s = DataInputStream(data.hexToBytes().inputStream())
val packet = ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, s) val packet = ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, s)
packet.decode() packet.decode()
System.out.println(packet.token.toUByteArray().toHexString(" ")) System.out.println(packet.token.toUByteArray().toUHexString(" "))
System.out.println(packet.loginTime.toHexString(" ")) System.out.println(packet.loginTime.toUHexString(" "))
System.out.println(packet.loginIP) System.out.println(packet.loginIP)
*/ */
...@@ -25,10 +20,10 @@ fun main(){ ...@@ -25,10 +20,10 @@ fun main(){
val s = DataInputStream(data.hexToBytes().inputStream()) val s = DataInputStream(data.hexToBytes().inputStream())
val packet = ServerLoginResponseSuccessPacket(s,(data.length+1)/3) val packet = ServerLoginResponseSuccessPacket(s,(data.length+1)/3)
packet.decode() packet.decode()
System.out.println("0828key: \n" + packet._0828_rec_decr_key.toUByteArray().toHexString(" ")) System.out.println("0828key: \n" + packet._0828_rec_decr_key.toUByteArray().toUHexString(" "))
System.out.println("token88: \n" + packet.token88.toUByteArray().toHexString(" ")) System.out.println("token88: \n" + packet.token88.toUByteArray().toUHexString(" "))
System.out.println("token38: \n" + packet.token38.toUByteArray().toHexString(" ")) System.out.println("token38: \n" + packet.token38.toUByteArray().toUHexString(" "))
System.out.println("enckey: \n" + packet.encryptionKey.toUByteArray().toHexString(" ")) System.out.println("enckey: \n" + packet.encryptionKey.toUByteArray().toUHexString(" "))
System.out.println("nick: " + packet.nick) System.out.println("nick: " + packet.nick)
System.out.println("age: " + packet.age) System.out.println("age: " + packet.age)
System.out.println("gender: " + packet.gender) System.out.println("gender: " + packet.gender)
...@@ -39,8 +34,8 @@ fun main(){ ...@@ -39,8 +34,8 @@ fun main(){
val s = DataInputStream(data.hexToBytes().inputStream()) val s = DataInputStream(data.hexToBytes().inputStream())
val packet = ServerLoginResponseVerificationCodePacket(s,(data.length+1)/3) val packet = ServerLoginResponseVerificationCodePacket(s,(data.length+1)/3)
packet.decode() packet.decode()
println(packet.token00BA.toUByteArray().toHexString(" ")) println(packet.token00BA.toUByteArray().toUHexString(" "))
println(packet.verifyCode.toUByteArray().toHexString(" ")) println(packet.verifyCode.toUByteArray().toUHexString(" "))
println(packet.verifyCodeLength) println(packet.verifyCodeLength)
File(System.getProperty("user.dir") + "/5.png").createNewFile() File(System.getProperty("user.dir") + "/5.png").createNewFile()
...@@ -48,5 +43,5 @@ fun main(){ ...@@ -48,5 +43,5 @@ fun main(){
*/ */
val packet = ClientPasswordSubmissionPacket(1994701021,"xiaoqqq",131513,"123.123.123.123","tgtgtKey".toByteArray(),"".toByteArray()) 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
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
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment