Working on verify code

This commit is contained in:
Him188moe 2019-08-31 19:41:37 +08:00
parent 4508c66225
commit c23a48ebb0
10 changed files with 133 additions and 68 deletions

View File

@ -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)
}
}

View File

@ -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) {

View File

@ -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)

View File

@ -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());
}
}

View File

@ -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() {
}
}

View File

@ -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() {
}
}

View File

@ -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")
}
}
}

View File

@ -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)
}

View File

@ -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() {

View File

@ -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,