From c23a48ebb09dfa6ea86f156f3c5e42cf572f65eb Mon Sep 17 00:00:00 2001 From: Him188moe Date: Sat, 31 Aug 2019 19:41:37 +0800 Subject: [PATCH] Working on verify code --- .../mirai/network/RobotNetworkHandler.kt | 42 +++++++++----- .../network/packet/client/ClientPacket.kt | 12 ++-- .../ClientLoginVerificationCodePacket.kt | 7 ++- .../packet/client/session/AccountInfo.kt | 55 +++++++++++++++++++ .../packet/client/session/Handshake.kt | 34 ------------ ...ClientHeartbeatPacket.kt => ClientHeat.kt} | 8 +++ .../packet/client/touch/RefreshSKey.kt | 22 ++++++++ .../network/packet/server/ServerPacket.kt | 8 ++- .../security/ServerSKeyResponsePacket.kt | 5 -- .../net/mamoe/mirai/task/MiraiThreadPool.java | 8 +-- 10 files changed, 133 insertions(+), 68 deletions(-) create mode 100644 mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/AccountInfo.kt delete mode 100644 mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/Handshake.kt rename mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/{ClientHeartbeatPacket.kt => ClientHeat.kt} (75%) create mode 100644 mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/RefreshSKey.kt diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt index 17f4129b2..82208184e 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt @@ -4,9 +4,10 @@ import io.netty.channel.Channel import net.mamoe.mirai.MiraiServer import net.mamoe.mirai.network.packet.client.ClientPacket import net.mamoe.mirai.network.packet.client.login.* -import net.mamoe.mirai.network.packet.client.session.ClientHandshake1Packet -import net.mamoe.mirai.network.packet.client.session.ClientLoginStatusPacket -import net.mamoe.mirai.network.packet.client.session.ClientSKeyRequestPacket +import net.mamoe.mirai.network.packet.client.session.* +import net.mamoe.mirai.network.packet.client.touch.ClientHeartbeatPacket +import net.mamoe.mirai.network.packet.client.touch.ClientRefreshSKeyRequestPacket +import net.mamoe.mirai.network.packet.client.touch.ServerHeartbeatResponsePacket import net.mamoe.mirai.network.packet.client.writeHex import net.mamoe.mirai.network.packet.client.writeRandom import net.mamoe.mirai.network.packet.server.ServerPacket @@ -23,6 +24,7 @@ import java.net.DatagramPacket import java.net.DatagramSocket import java.net.InetSocketAddress import java.util.* +import kotlin.system.exitProcess /** * A RobotNetworkHandler is used to connect with Tencent servers. @@ -104,16 +106,16 @@ class RobotNetworkHandler(val number: Int, private val password: String) { is ServerLoginResponseVerificationCodePacket -> { //[token00BA]来源之一: 验证码 this.token00BA = packet.token00BA - if (packet.unknownBoolean != null && packet.unknownBoolean!!) { - this.sequence = 1 - sendPacket(ClientLoginVerificationCodePacket(this.number, this.token0825, this.sequence, this.token00BA)) - } with(MiraiServer.getInstance().parentFolder + "verifyCode.png") { ByteArrayInputStream(packet.verifyCode).transferTo(FileOutputStream(this)) println("验证码已写入到 " + this.path) } + if (packet.unknownBoolean != null && packet.unknownBoolean!!) { + this.sequence = 1 + sendPacket(ClientLoginVerificationCodePacket(this.number, this.token0825, this.sequence, this.token00BA)) + } } @@ -162,8 +164,11 @@ class RobotNetworkHandler(val number: Int, private val password: String) { is ServerSessionKeyResponsePacket -> { this.sessionKey = packet.sessionKey + MiraiTaskManager.getInstance().repeatingTask({ + sendPacket(ClientHeartbeatPacket(this.number, this.sessionKey)) + }, 90000) this.tlv0105 = packet.tlv0105 - sendPacket(ClientLoginStatusPacket(this.number, sessionKey, ClientLoginStatus.ONLINE)) + sendPacket(ClientLoginStatusPacket(this.number, this.sessionKey, ClientLoginStatus.ONLINE)) } is ServerLoginSuccessPacket -> { @@ -175,10 +180,18 @@ class RobotNetworkHandler(val number: Int, private val password: String) { this.cookies = "uin=o" + this.number + ";skey=" + this.sKey + ";" MiraiTaskManager.getInstance().repeatingTask({ - TODO("时钟_refreshSkey") + sendPacket(ClientRefreshSKeyRequestPacket(this.number, this.sessionKey)) }, 1800000) this.gtk = getGTK(sKey) - sendPacket(ClientHandshake1Packet(this.number, this.sessionKey)) + sendPacket(ClientAccountInfoRequestPacket(this.number, this.sessionKey)) + } + + is ServerHeartbeatResponsePacket -> { + + } + + is ServerAccountInfoResponsePacket -> { + } is ServerLoginResponseVerificationCodePacketEncrypted -> onPacketReceived(packet.decrypt()) @@ -187,6 +200,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) { is ServerSessionKeyResponsePacketEncrypted -> onPacketReceived(packet.decrypt(this._0828_rec_decr_key)) is ServerTouchResponsePacketEncrypted -> onPacketReceived(packet.decrypt()) is ServerSKeyResponsePacketEncrypted -> onPacketReceived(packet.decrypt(this.sessionKey)) + is ServerAccountInfoResponsePacketEncrypted -> onPacketReceived(packet.decrypt(this.sessionKey)) else -> throw IllegalArgumentException(packet.toString()) } @@ -252,7 +266,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) { @ExperimentalUnsignedTypes fun send(data: ByteArray) { try { - val socket = DatagramSocket((15314 + Math.random() * 10).toInt()) + val socket = DatagramSocket((15314 + Math.random() * 100).toInt()) socket.connect(this.serverAddress) val dp1 = DatagramPacket(ByteArray(22312), 22312) @@ -268,9 +282,9 @@ class RobotNetworkHandler(val number: Int, private val password: String) { onPacketReceived(ServerPacket.ofByteArray(dp1.data.copyOfRange(0, i + 1))) } catch (e: Exception) { e.printStackTrace() - repeat(100) { println() } - println(DebugLogger.buff.toString()) - System.exit(1) + //repeat(100) { println() } + //println(DebugLogger.buff.toString()) + exitProcess(1) } } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt index 1cfaf6401..6b469cdbe 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt @@ -97,15 +97,11 @@ fun DataOutputStream.writeVarInt(dec: UInt) { 返回 (“”) .判断结束*/ - if (dec < 256u) { - this.writeByte(dec.toByte().toInt())//drop other bits + when { + dec < 256u -> this.writeByte(dec.toByte().toInt())//drop other bits + dec > 256u -> this.writeShort(dec.toShort().toInt()) + else -> throw IllegalArgumentException(dec.toString()) } - - if (dec > 256u) { - this.writeShort(dec.toShort().toInt()) - } - - throw UnsupportedOperationException() } fun DataOutputStream.encryptAndWrite(byteArray: ByteArray, key: ByteArray) { diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientLoginVerificationCodePacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientLoginVerificationCodePacket.kt index 06d5d936f..4538d84a5 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientLoginVerificationCodePacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientLoginVerificationCodePacket.kt @@ -14,7 +14,12 @@ import net.mamoe.mirai.util.TEACryptor */ @PacketId("00 BA 31 01") @ExperimentalUnsignedTypes -class ClientLoginVerificationCodePacket(private val qq: Int, private val token0825: ByteArray, private val sequence: Int, private val token00BA: ByteArray) : ClientPacket() { +class ClientLoginVerificationCodePacket( + private val qq: Int, + private val token0825: ByteArray, + private val sequence: Int, + private val token00BA: ByteArray +) : ClientPacket() { override fun encode() { this.writeQQ(qq) this.writeHex(Protocol.fixVer) diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/AccountInfo.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/AccountInfo.kt new file mode 100644 index 000000000..2e9a27ff7 --- /dev/null +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/AccountInfo.kt @@ -0,0 +1,55 @@ +package net.mamoe.mirai.network.packet.client.session + +import net.mamoe.mirai.network.Protocol +import net.mamoe.mirai.network.packet.PacketId +import net.mamoe.mirai.network.packet.client.* +import net.mamoe.mirai.network.packet.server.ServerPacket +import net.mamoe.mirai.network.packet.server.dataInputStream +import net.mamoe.mirai.network.packet.server.goto +import net.mamoe.mirai.network.packet.server.security.ServerSKeyResponsePacket +import net.mamoe.mirai.util.TEACryptor +import java.io.DataInputStream + +/** + * 获取升级天数等. + * + * @author Him188moe + */ +@ExperimentalUnsignedTypes +@PacketId("00 5C") +class ClientAccountInfoRequestPacket( + private val qq: Int, + private val sessionKey: ByteArray +) : ClientPacket() { + override fun encode() { + this.writeRandom(2)//part of packet id + this.writeQQ(qq) + this.writeHex(Protocol._fixVer) + this.encryptAndWrite(sessionKey) { + it.writeByte(0x88) + it.writeQQ(qq) + it.writeByte(0x00) + } + } +} + +class ServerAccountInfoResponsePacket(input: DataInputStream) : ServerPacket(input) { + //等级 + //升级剩余活跃天数 + //ignored + override fun decode() { + + } +} + +class ServerAccountInfoResponsePacketEncrypted(inputStream: DataInputStream) : ServerPacket(inputStream) { + override fun decode() { + + } + + fun decrypt(sessionKey: ByteArray): ServerSKeyResponsePacket { + this.input goto 14 + val data = this.input.readAllBytes().let { it.copyOfRange(0, it.size - 1) } + return ServerSKeyResponsePacket(TEACryptor.decrypt(data, sessionKey).dataInputStream()); + } +} \ No newline at end of file diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/Handshake.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/Handshake.kt deleted file mode 100644 index e8576102f..000000000 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/Handshake.kt +++ /dev/null @@ -1,34 +0,0 @@ -package net.mamoe.mirai.network.packet.client.session - -import net.mamoe.mirai.network.Protocol -import net.mamoe.mirai.network.packet.PacketId -import net.mamoe.mirai.network.packet.client.* -import net.mamoe.mirai.network.packet.server.ServerPacket -import java.io.DataInputStream - -/** - * @author Him188moe - */ -@ExperimentalUnsignedTypes -@PacketId("00 5C") -class ClientHandshake1Packet( - val qq: Int, - val sessionKey: ByteArray -) : ClientPacket() { - override fun encode() { - this.writeRandom(2)//part of packet id - this.writeQQ(qq) - this.writeHex(Protocol._fixVer) - this.encryptAndWrite(sessionKey) { - it.writeByte(0x88) - it.writeQQ(qq) - it.writeByte(0x00) - } - } -} - -class ServerHandshake1ResponsePacket(input: DataInputStream) : ServerPacket(input) { - override fun decode() { - - } -} \ No newline at end of file diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientHeartbeatPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientHeat.kt similarity index 75% rename from mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientHeartbeatPacket.kt rename to mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientHeat.kt index d459c17db..0b6007ac1 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientHeartbeatPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientHeat.kt @@ -3,6 +3,8 @@ package net.mamoe.mirai.network.packet.client.touch import net.mamoe.mirai.network.Protocol import net.mamoe.mirai.network.packet.PacketId import net.mamoe.mirai.network.packet.client.* +import net.mamoe.mirai.network.packet.server.ServerPacket +import java.io.DataInputStream import java.io.IOException /** @@ -23,4 +25,10 @@ class ClientHeartbeatPacket( it.writeHex("00 01 00 01") } } +} + +class ServerHeartbeatResponsePacket(input: DataInputStream) : ServerPacket(input) { + override fun decode() { + + } } \ No newline at end of file diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/RefreshSKey.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/RefreshSKey.kt new file mode 100644 index 000000000..3f7beab7a --- /dev/null +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/RefreshSKey.kt @@ -0,0 +1,22 @@ +package net.mamoe.mirai.network.packet.client.touch + +import net.mamoe.mirai.network.packet.PacketId +import net.mamoe.mirai.network.packet.client.* + +/** + * @author Him188moe + */ +@PacketId("00 1D") +@ExperimentalUnsignedTypes +class ClientRefreshSKeyRequestPacket( + private val qq: Int, + private val sessionKey: ByteArray +) : ClientPacket() { + override fun encode() { + this.writeRandom(2)//part of packet id + this.writeQQ(qq) + this.encryptAndWrite(sessionKey) { + it.writeHex("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") + } + } +} \ No newline at end of file diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt index ca78889bc..1993894cf 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt @@ -1,7 +1,9 @@ package net.mamoe.mirai.network.packet.server import net.mamoe.mirai.network.packet.Packet +import net.mamoe.mirai.network.packet.client.session.ServerAccountInfoResponsePacketEncrypted import net.mamoe.mirai.network.packet.client.toHexString +import net.mamoe.mirai.network.packet.client.touch.ServerHeartbeatResponsePacket import net.mamoe.mirai.network.packet.server.login.* import net.mamoe.mirai.network.packet.server.security.ServerLoginSuccessPacket import net.mamoe.mirai.network.packet.server.security.ServerSKeyResponsePacketEncrypted @@ -68,10 +70,12 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { "08 28 04 34" -> ServerSessionKeyResponsePacketEncrypted(stream) - else -> when (idHex.substring(0, 2)) { + else -> when (idHex.substring(0, 5)) { "00 EC" -> ServerLoginSuccessPacket(stream) "00 1D" -> ServerSKeyResponsePacketEncrypted(stream) - // "00 5C" -> + "00 5C" -> ServerAccountInfoResponsePacketEncrypted(stream) + + "00 58" -> ServerHeartbeatResponsePacket(stream) else -> throw IllegalArgumentException(idHex) } diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSKeyResponsePacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSKeyResponsePacket.kt index b6326d818..db0649adf 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSKeyResponsePacket.kt +++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSKeyResponsePacket.kt @@ -17,11 +17,6 @@ class ServerSKeyResponsePacket(input: DataInputStream) : ServerPacket(input) { } } -/** - * Encrypted using [0828_rec_decr_key], decrypting in RobotNetworkHandler - * - * @author Him188moe - */ class ServerSKeyResponsePacketEncrypted(inputStream: DataInputStream) : ServerPacket(inputStream) { override fun decode() { diff --git a/mirai-core/src/main/java/net/mamoe/mirai/task/MiraiThreadPool.java b/mirai-core/src/main/java/net/mamoe/mirai/task/MiraiThreadPool.java index 1e086d1d5..b2aff2fc1 100644 --- a/mirai-core/src/main/java/net/mamoe/mirai/task/MiraiThreadPool.java +++ b/mirai-core/src/main/java/net/mamoe/mirai/task/MiraiThreadPool.java @@ -1,11 +1,11 @@ package net.mamoe.mirai.task; import java.io.Closeable; -import java.io.IOException; -import java.util.concurrent.*; -import java.util.function.Consumer; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; -public class MiraiThreadPool extends ThreadPoolExecutor implements Closeable { +public final class MiraiThreadPool extends ThreadPoolExecutor implements Closeable { protected MiraiThreadPool(){ super(0,