Testing tools

This commit is contained in:
Him188 2020-01-29 13:37:07 +08:00
parent 5425ea77cc
commit e131774956
2 changed files with 43 additions and 29 deletions

View File

@ -60,12 +60,15 @@ internal val t108 = "BD 12 96 6C 83 53 EF DD 06 16 52 16 B8 1B 25 69".hexToBytes
internal val t10c = "23 7D 2C 7A 3F 4A 41 35 7D 3B 45 51 6D 3D 2A 56".hexToBytes() internal val t10c = "23 7D 2C 7A 3F 4A 41 35 7D 3B 45 51 6D 3D 2A 56".hexToBytes()
internal val t163 = "2C 7A 7B 23 4E 24 3F 24 24 47 62 6B 69 2E 47 50".hexToBytes() internal val t163 = "2C 7A 7B 23 4E 24 3F 24 24 47 62 6B 69 2E 47 50".hexToBytes()
internal val shareKeyCalculatedByConstPubKey = ECDH.calculateShareKey(
loadPrivateKey("97a52992cb7a2110413629af94a3c249c68a3b731510caa8"), var ecdhPrivateKeyS = "97a52992cb7a2110413629af94a3c249c68a3b731510caa8"
internal val shareKeyCalculatedByConstPubKey
get() = ECDH.calculateShareKey(
loadPrivateKey(ecdhPrivateKeyS),
initialPublicKey initialPublicKey
) )
var ecdhPrivateKeyS = "97a52992cb7a2110413629af94a3c249c68a3b731510caa8"
var passwordMd5: ByteArray = byteArrayOf() var passwordMd5: ByteArray = byteArrayOf()
var uin: Long = 0L var uin: Long = 0L
@ -105,8 +108,6 @@ fun ByteReadPacket.decodeMultiClientToServerPackets() {
println() println()
} }
val firstShareKey = ECDH.calculateShareKey(loadPrivateKey(ecdhPrivateKeyS), initialPublicKey)
fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed", { buildPacket { writeInt(it.size + 4); writeFully(it) } }) { fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed", { buildPacket { writeInt(it.size + 4); writeFully(it) } }) {
val flag1 = readInt() val flag1 = readInt()
println("flag1=" + flag1.contentToString()) println("flag1=" + flag1.contentToString())
@ -119,13 +120,13 @@ fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed
println("extra data=" + readBytes(readInt() - 4).toUHexString()) println("extra data=" + readBytes(readInt() - 4).toUHexString())
} }
} else { } else {
if (flag2 == 1) { //if (flag2 == 1) {
val loginExtraData = readBytes(readInt() - 4) val loginExtraData = readBytes(readInt() - 4)
loginExtraData.debugPrint("loginExtraData") loginExtraData.debugPrint("loginExtraData")
} else { // } else {
this.debugPrint() // this.debugPrint()
error("未知 flag2") // error("未知 flag2")
} // }
} }
println("flag3=" + readByte().toUHexString()) println("flag3=" + readByte().toUHexString())
@ -159,9 +160,12 @@ fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed
*/ */
discardExact(3) discardExact(3)
readShort().toInt().takeIf { it != 8001 }?.let { readShort().toInt().takeIf { it != 8001 }?.let {
println("这个包不是 oicqRequest")
return@debugIfFail this
println(" got new protocolVersion=$it") println(" got new protocolVersion=$it")
} }
println(" commandId=${readUShort()}") val commandId = readUShort().toInt()
println(" commandId=${commandId}")
readUShort().toInt().takeIf { it != 1 }?.let { readUShort().toInt().takeIf { it != 1 }?.let {
println(" got new const0=$it") println(" got new const0=$it")
} }
@ -221,16 +225,26 @@ fun ByteReadPacket.analysisOneFullPacket(): ByteReadPacket = debugIfFail("Failed
firstDecrypted.decryptBy(encrypt).also { println("second by calculatedShareKey") } firstDecrypted.decryptBy(encrypt).also { println("second by calculatedShareKey") }
}.getOrElse { }.getOrElse {
kotlin.runCatching { kotlin.runCatching {
firstDecrypted.decryptBy(firstShareKey) firstDecrypted.decryptBy(shareKeyCalculatedByConstPubKey)
}.getOrDefault(firstDecrypted) }.getOrDefault(firstDecrypted)
} }
} }
decrypted.debugPrint("Real body").apply { decrypted.debugPrint("Real body").toReadPacket().apply {
if (commandId == 0x0810) {
DebugLogger.info("发送 login!! 正在获取 tgtgtKey")
try {
discardExact(4) discardExact(4)
readTLVMap()[0x106]?.decryptBy(passwordMd5 + ByteArray(4) + uin.toInt().toByteArray())?.read { readTLVMap()[0x106]
?.also { DebugLogger.info("找到了 0x106") }?.decryptBy(passwordMd5 + ByteArray(4) + uin.toInt().toByteArray())?.read {
discardExact(2 + 4 * 4 + 8 + 4 + 4 + 1 + 16) discardExact(2 + 4 * 4 + 8 + 4 + 4 + 1 + 16)
tgtgtKey = readBytes(16) tgtgtKey = readBytes(16)
DebugLogger.info("获取 tgtgtKey=${tgtgtKey.toUHexString()}")
}
DebugLogger.info("tlv map里面没有 0x106")
} catch (e: Exception) {
e.printStackTrace()
}
} }
} }
@ -302,22 +316,22 @@ fun ByteReadPacket.decodeSso() {
println("// 尝试解 SSO") println("// 尝试解 SSO")
println("// head") println("// head")
discardExact(4) discardExact(4)
println(" sequenceId=" + readUInt()) (" sequenceId=" + readUInt())
println(" subAppId=" + readUInt()) println(" subAppId=" + readUInt())
println(" subAppId2=" + readUInt()) println(" subAppId2=" + readUInt())
println(" unknownHex=" + readBytes(12).toUHexString()) println(" unknownHex=" + readBytes(12).toUHexString())
println(" extraData=" + readBytes(readInt() - 4).toUHexString()) println(" extraData=" + readBytes(readInt() - 4).toUHexString())
println(" commandName=" + readBytes(readInt() - 4).encodeToString()) val commandName = readBytes(readInt() - 4).encodeToString()
println(" unknown4Bytes=" + readBytes(readInt() - 4).toUHexString()) println(" commandName=" + commandName)
println(" imei=" + readBytes(readInt() - 4).toUHexString()) (" unknown4Bytes=" + readBytes(readInt() - 4).toUHexString())
println(" 0 bytes=" + readBytes(readInt() - 4).toUHexString()) (" imei=" + readBytes(readInt() - 4).toUHexString())
println(" ksid=" + readBytes(readShort() - 2).toUHexString()) (" 0 bytes=" + readBytes(readInt() - 4).toUHexString())
println(" 0 bytes=" + readBytes(readInt() - 4).toUHexString()) (" ksid=" + readBytes(readShort() - 2).toUHexString())
(" 0 bytes=" + readBytes(readInt() - 4).toUHexString())
println() println()
discardExact(4) discardExact(4)
println("// body(maybe OicqRequest)") println("// body(maybe OicqRequest)")
} }
val keys: Map<String, ByteArray> val keys: Map<String, ByteArray>

View File

@ -1,6 +1,6 @@
package net.mamoe.mirai.qqandroid.io.serialization package net.mamoe.mirai.qqandroid.io.serialization
import net.mamoe.mirai.qqandroid.network.protocol.jce.RequestPacket import net.mamoe.mirai.qqandroid.network.protocol.packet.login.data.RequestPacket
import net.mamoe.mirai.utils.io.hexToBytes import net.mamoe.mirai.utils.io.hexToBytes
class TestRequesetPacket { class TestRequesetPacket {