Commit 114e6528 authored by liujiahua123123's avatar liujiahua123123

Merge remote-tracking branch 'origin/master'

parents 2c17c9f3 913ecd60
...@@ -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 robotNetworkHandler account. * A robotNetworkHandler account.
...@@ -97,15 +97,39 @@ class RobotNetworkHandler(val number: Int, private val password: String) { ...@@ -97,15 +97,39 @@ class RobotNetworkHandler(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 RobotNetworkHandler(val number: Int, private val password: String) { ...@@ -126,8 +150,10 @@ class RobotNetworkHandler(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 RobotNetworkHandler(val number: Int, private val password: String) { ...@@ -137,12 +163,45 @@ class RobotNetworkHandler(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 RobotNetworkHandler(val number: Int, private val password: String) { ...@@ -153,7 +212,7 @@ class RobotNetworkHandler(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 RobotNetworkHandler(val number: Int, private val password: String) { ...@@ -164,6 +223,9 @@ class RobotNetworkHandler(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]
......
...@@ -216,19 +216,21 @@ public class HexComparator { ...@@ -216,19 +216,21 @@ public class HexComparator {
/* /*
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
This diff is collapsed.
This diff is collapsed.
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