diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt index 64fbe77d9..80e4fadbe 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt @@ -339,7 +339,7 @@ internal class TIMPCBotNetworkHandler internal constructor(coroutineContext: Cor socket.sendPacket( SubmitPasswordPacket( bot = bot.qqAccount, - password = bot.account.password, + passwordMd5 = bot.account.passwordMd5, loginTime = loginTime, loginIP = loginIP, privateKey = privateKey, @@ -369,7 +369,7 @@ internal class TIMPCBotNetworkHandler internal constructor(coroutineContext: Cor socket.sendPacket( SubmitPasswordPacket( bot = bot.qqAccount, - password = bot.account.password, + passwordMd5 = bot.account.passwordMd5, loginTime = loginTime, loginIP = loginIP, privateKey = privateKey, @@ -434,7 +434,7 @@ internal class TIMPCBotNetworkHandler internal constructor(coroutineContext: Cor socket.sendPacket( SubmitPasswordPacket( bot = bot.qqAccount, - password = bot.account.password, + passwordMd5 = bot.account.passwordMd5, loginTime = loginTime, loginIP = loginIP, privateKey = privateKey, diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/login/PasswordSubmission.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/login/PasswordSubmission.kt index ab88aec5f..77cf9acf9 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/login/PasswordSubmission.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/login/PasswordSubmission.kt @@ -51,7 +51,7 @@ internal inline class SubmitPasswordResponseDecrypter(private val privateKey: Pr internal object SubmitPasswordPacket : PacketFactory<SubmitPasswordPacket.LoginResponse, SubmitPasswordResponseDecrypter>(SubmitPasswordResponseDecrypter) { operator fun invoke( bot: Long, - password: String, + passwordMd5: ByteArray, loginTime: Int, loginIP: String, privateKey: PrivateKey, @@ -68,7 +68,7 @@ internal object SubmitPasswordPacket : PacketFactory<SubmitPasswordPacket.LoginR // shareKey 极大可能为 publicKey, key0836 计算得到 encryptAndWrite(TIMProtocol.shareKey) { - writePart1(bot, password, loginTime, loginIP, privateKey, token0825, randomDeviceName, tlv0006) + writePart1(bot, passwordMd5, loginTime, loginIP, privateKey, token0825, randomDeviceName, tlv0006) if (token00BA != null) { writeHex("01 10") writeHex("00 3C") @@ -272,7 +272,7 @@ internal inline class SessionResponseDecryptionKey(private val delegate: IoBuffe private fun BytePacketBuilder.writePart1( qq: Long, - password: String, + password: ByteArray, loginTime: Int, loginIP: String, privateKey: PrivateKey, @@ -314,9 +314,8 @@ private fun BytePacketBuilder.writePart1( this.writeHex("60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6")//key } -private fun BytePacketBuilder.writeTLV0006(qq: Long, password: String, loginTime: Int, loginIP: String, privateKey: PrivateKey) { - val firstMD5 = md5(password) - val secondMD5 = md5(firstMD5 + byteArrayOf(0, 0, 0, 0) + qq.toUInt().toByteArray()) +private fun BytePacketBuilder.writeTLV0006(qq: Long, passwordMd5: ByteArray, loginTime: Int, loginIP: String, privateKey: PrivateKey) { + val secondMD5 = md5(passwordMd5 + byteArrayOf(0, 0, 0, 0) + qq.toUInt().toByteArray()) this.encryptAndWrite(secondMD5) { writeRandom(4) @@ -325,7 +324,7 @@ private fun BytePacketBuilder.writeTLV0006(qq: Long, password: String, loginTime writeFully(TIMProtocol.constantData2) writeHex("00 00 01") - writeFully(firstMD5) + writeFully(passwordMd5) writeInt(loginTime) writeByte(0) writeZero(4 * 3) diff --git a/mirai-core-timpc/src/jvmTest/kotlin/BadQQFilter.kt b/mirai-core-timpc/src/jvmTest/kotlin/BadQQFilter.kt index 17cd21648..8ef3e3f75 100644 --- a/mirai-core-timpc/src/jvmTest/kotlin/BadQQFilter.kt +++ b/mirai-core-timpc/src/jvmTest/kotlin/BadQQFilter.kt @@ -58,5 +58,5 @@ suspend fun main() { } println("Filtering finished") - println(goodBotList.joinToString("\n") { it.account.id.toString() + " " + it.account.password }) + println(goodBotList.joinToString("\n") { it.account.id.toString() + " " + it.account.passwordMd5 }) } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotAccount.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotAccount.kt index 66fe0b055..64c05652c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotAccount.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotAccount.kt @@ -2,7 +2,12 @@ package net.mamoe.mirai +import kotlinx.io.core.toByteArray +import net.mamoe.mirai.utils.md5 + data class BotAccount( val id: Long, - val password: String -) \ No newline at end of file + val passwordMd5: ByteArray // md5 +){ + constructor(id: Long, passwordPlainText: String) : this(id, md5(passwordPlainText.toByteArray())) +} \ No newline at end of file diff --git a/mirai-demos/mirai-demo-1/src/main/java/demo/subscribe/SubscribeSamples.kt b/mirai-demos/mirai-demo-1/src/main/java/demo/subscribe/SubscribeSamples.kt index 8465d568e..018561efc 100644 --- a/mirai-demos/mirai-demo-1/src/main/java/demo/subscribe/SubscribeSamples.kt +++ b/mirai-demos/mirai-demo-1/src/main/java/demo/subscribe/SubscribeSamples.kt @@ -41,7 +41,7 @@ suspend fun main() { val bot = TIMPC.Bot( readTestAccount() ?: BotAccount(//填写你的账号 id = 1994701121, - password = "123456" + passwordPlainText = "123456" ) ) { // 覆盖默认的配置 diff --git a/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt b/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt index 986313e98..e6a3800da 100644 --- a/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt +++ b/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/Main.kt @@ -47,7 +47,7 @@ suspend fun main() { val bot = Bot( readTestAccount() ?: BotAccount( id = 913366033, - password = "a18260132383" + passwordPlainText = "a18260132383" ) ) { // override config here.