mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-07 21:12:25 +08:00
Working on verify code
This commit is contained in:
parent
4508c66225
commit
c23a48ebb0
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
@ -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() {
|
||||
|
||||
}
|
||||
}
|
@ -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() {
|
||||
|
||||
}
|
||||
}
|
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
@ -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() {
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user