Commit 5f0220b9 authored by Him188's avatar Him188

Rename lazyEncode to dataEncode

parent 8ca3e657
...@@ -6,8 +6,8 @@ import net.mamoe.mirai.message.MessageKey ...@@ -6,8 +6,8 @@ import net.mamoe.mirai.message.MessageKey
import net.mamoe.mirai.network.protocol.tim.packet.readLVNumber import net.mamoe.mirai.network.protocol.tim.packet.readLVNumber
import net.mamoe.mirai.network.protocol.tim.packet.writeHex import net.mamoe.mirai.network.protocol.tim.packet.writeHex
import net.mamoe.mirai.network.protocol.tim.packet.writeLVByteArray import net.mamoe.mirai.network.protocol.tim.packet.writeLVByteArray
import net.mamoe.mirai.utils.lazyDecode import net.mamoe.mirai.utils.dataDecode
import net.mamoe.mirai.utils.lazyEncode import net.mamoe.mirai.utils.dataEncode
/** /**
* QQ 自带表情 * QQ 自带表情
...@@ -23,10 +23,10 @@ class Face(val id: FaceID) : Message() { ...@@ -23,10 +23,10 @@ class Face(val id: FaceID) : Message() {
return String.format("[face%d]", id.id) return String.format("[face%d]", id.id)
} }
override fun toByteArray(): ByteArray = lazyEncode { section -> override fun toByteArray(): ByteArray = dataEncode { section ->
section.writeByte(this.type.intValue) section.writeByte(this.type.intValue)
section.writeLVByteArray(lazyEncode { child -> section.writeLVByteArray(dataEncode { child ->
child.writeShort(1) child.writeShort(1)
child.writeByte(this.id.id) child.writeByte(this.id.id)
...@@ -49,7 +49,7 @@ class Face(val id: FaceID) : Message() { ...@@ -49,7 +49,7 @@ class Face(val id: FaceID) : Message() {
override operator fun contains(sub: String): Boolean = false override operator fun contains(sub: String): Boolean = false
internal object PacketHelper { internal object PacketHelper {
fun ofByteArray(data: ByteArray): Face = lazyDecode(data) { fun ofByteArray(data: ByteArray): Face = dataDecode(data) {
//00 01 AF 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 F0 //00 01 AF 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 F0
//00 01 0C 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 4D //00 01 0C 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 4D
it.skip(1) it.skip(1)
...@@ -57,7 +57,7 @@ class Face(val id: FaceID) : Message() { ...@@ -57,7 +57,7 @@ class Face(val id: FaceID) : Message() {
val id1 = FaceID.ofId(it.readLVNumber().toInt())//可能这个是id, 也可能下面那个 val id1 = FaceID.ofId(it.readLVNumber().toInt())//可能这个是id, 也可能下面那个
it.skip(it.readByte().toLong()) it.skip(it.readByte().toLong())
it.readLVNumber()//某id? it.readLVNumber()//某id?
return@lazyDecode Face(id1) return@dataDecode Face(id1)
} }
} }
} }
......
...@@ -3,8 +3,8 @@ package net.mamoe.mirai.message.defaults ...@@ -3,8 +3,8 @@ package net.mamoe.mirai.message.defaults
import net.mamoe.mirai.message.Message import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.MessageKey import net.mamoe.mirai.message.MessageKey
import net.mamoe.mirai.network.protocol.tim.packet.* import net.mamoe.mirai.network.protocol.tim.packet.*
import net.mamoe.mirai.utils.lazyDecode import net.mamoe.mirai.utils.dataDecode
import net.mamoe.mirai.utils.lazyEncode import net.mamoe.mirai.utils.dataEncode
import net.mamoe.mirai.utils.skip import net.mamoe.mirai.utils.skip
import net.mamoe.mirai.utils.toUHexString import net.mamoe.mirai.utils.toUHexString
...@@ -25,10 +25,10 @@ open class Image(val imageId: String) : Message() { ...@@ -25,10 +25,10 @@ open class Image(val imageId: String) : Message() {
return imageId return imageId
} }
override fun toByteArray(): ByteArray = lazyEncode { section -> override fun toByteArray(): ByteArray = dataEncode { section ->
section.writeByte(intValue) section.writeByte(intValue)
section.writeLVByteArray(lazyEncode { child -> section.writeLVByteArray(dataEncode { child ->
child.writeByte(0x02) child.writeByte(0x02)
child.writeLVString(this.imageId) child.writeLVString(this.imageId)
child.writeHex("04 00 " + child.writeHex("04 00 " +
...@@ -57,7 +57,7 @@ open class Image(val imageId: String) : Message() { ...@@ -57,7 +57,7 @@ open class Image(val imageId: String) : Message() {
internal object PacketHelper { internal object PacketHelper {
@JvmStatic @JvmStatic
fun ofByteArray0x06(data: ByteArray): Image = lazyDecode(data) { fun ofByteArray0x06(data: ByteArray): Image = dataDecode(data) {
it.skip(1) it.skip(1)
println("好友的图片") println("好友的图片")
println(data.toUHexString()) println(data.toUHexString())
...@@ -67,17 +67,17 @@ open class Image(val imageId: String) : Message() { ...@@ -67,17 +67,17 @@ open class Image(val imageId: String) : Message() {
val imageId = String(it.readNBytes(36)) val imageId = String(it.readNBytes(36))
println(imageId) println(imageId)
it.skip(1)//0x41 it.skip(1)//0x41
return@lazyDecode Image("{$imageId}.$suffix") return@dataDecode Image("{$imageId}.$suffix")
} }
@JvmStatic @JvmStatic
fun ofByteArray0x03(data: ByteArray): Image = lazyDecode(data) { fun ofByteArray0x03(data: ByteArray): Image = dataDecode(data) {
it.skip(1) it.skip(1)
return@lazyDecode Image(String(it.readLVByteArray())) return@dataDecode Image(String(it.readLVByteArray()))
/* /*
println(String(it.readLVByteArray())) println(String(it.readLVByteArray()))
it.readTLVMap() it.readTLVMap()
return@lazyDecode Image(String(it.readLVByteArray().cutTail(5).getRight(42))) return@dataDecode Image(String(it.readLVByteArray().cutTail(5).getRight(42)))
/ /
it.skip(data.size - 47) it.skip(data.size - 47)
val imageId = String(it.readNBytes(42)) val imageId = String(it.readNBytes(42))
...@@ -86,7 +86,7 @@ open class Image(val imageId: String) : Message() { ...@@ -86,7 +86,7 @@ open class Image(val imageId: String) : Message() {
it.skip(1)//0x43 it.skip(1)//0x43
it.skip(1)//0x41 it.skip(1)//0x41
return@lazyDecode Image(imageId)*/ return@dataDecode Image(imageId)*/
} }
} }
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ package net.mamoe.mirai.message.defaults ...@@ -2,7 +2,7 @@ package net.mamoe.mirai.message.defaults
import net.mamoe.mirai.message.Message import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.MessageKey import net.mamoe.mirai.message.MessageKey
import net.mamoe.mirai.utils.lazyEncode import net.mamoe.mirai.utils.dataEncode
import java.util.* import java.util.*
import java.util.stream.Collectors import java.util.stream.Collectors
import java.util.stream.Stream import java.util.stream.Stream
...@@ -77,7 +77,7 @@ class MessageChain : Message { ...@@ -77,7 +77,7 @@ class MessageChain : Message {
return this return this
} }
override fun toByteArray(): ByteArray = lazyEncode { override fun toByteArray(): ByteArray = dataEncode {
stream().forEach { message -> stream().forEach { message ->
it.write(message.toByteArray()) it.write(message.toByteArray())
} }
......
...@@ -5,8 +5,8 @@ import net.mamoe.mirai.message.MessageKey ...@@ -5,8 +5,8 @@ import net.mamoe.mirai.message.MessageKey
import net.mamoe.mirai.network.protocol.tim.packet.readLVString import net.mamoe.mirai.network.protocol.tim.packet.readLVString
import net.mamoe.mirai.network.protocol.tim.packet.writeLVByteArray import net.mamoe.mirai.network.protocol.tim.packet.writeLVByteArray
import net.mamoe.mirai.network.protocol.tim.packet.writeLVString import net.mamoe.mirai.network.protocol.tim.packet.writeLVString
import net.mamoe.mirai.utils.lazyDecode import net.mamoe.mirai.utils.dataDecode
import net.mamoe.mirai.utils.lazyEncode import net.mamoe.mirai.utils.dataEncode
/** /**
* @author Him188moe * @author Him188moe
...@@ -20,10 +20,10 @@ class PlainText(private val text: String) : Message() { ...@@ -20,10 +20,10 @@ class PlainText(private val text: String) : Message() {
return text return text
} }
override fun toByteArray(): ByteArray = lazyEncode { section -> override fun toByteArray(): ByteArray = dataEncode { section ->
section.writeByte(this.type.intValue) section.writeByte(this.type.intValue)
section.writeLVByteArray(lazyEncode { child -> section.writeLVByteArray(dataEncode { child ->
child.writeByte(0x01) child.writeByte(0x01)
child.writeLVString(this.text) child.writeLVString(this.text)
}) })
...@@ -40,7 +40,7 @@ class PlainText(private val text: String) : Message() { ...@@ -40,7 +40,7 @@ class PlainText(private val text: String) : Message() {
internal object PacketHelper { internal object PacketHelper {
@JvmStatic @JvmStatic
fun ofByteArray(data: ByteArray): PlainText = lazyDecode(data) { fun ofByteArray(data: ByteArray): PlainText = dataDecode(data) {
it.skip(1) it.skip(1)
PlainText(it.readLVString()) PlainText(it.readLVString())
} }
......
...@@ -55,7 +55,8 @@ internal class TIMBotNetworkHandler(private val bot: Bot) : BotNetworkHandler { ...@@ -55,7 +55,8 @@ internal class TIMBotNetworkHandler(private val bot: Bot) : BotNetworkHandler {
return loginInternal(LinkedList(TIMProtocol.SERVER_IP)) return loginInternal(LinkedList(TIMProtocol.SERVER_IP))
} }
private suspend fun loginInternal(ipQueue: LinkedList<String>): LoginState { //嵌套进 login 会导致 kotlin internal CompilationException
suspend fun loginInternal(ipQueue: LinkedList<String>): LoginState {
this.socket.close() this.socket.close()
val ip = ipQueue.poll() ?: return LoginState.UNKNOWN//所有服务器均返回 UNKNOWN val ip = ipQueue.poll() ?: return LoginState.UNKNOWN//所有服务器均返回 UNKNOWN
......
...@@ -8,8 +8,8 @@ import net.mamoe.mirai.message.defaults.Image ...@@ -8,8 +8,8 @@ import net.mamoe.mirai.message.defaults.Image
import net.mamoe.mirai.message.defaults.MessageChain import net.mamoe.mirai.message.defaults.MessageChain
import net.mamoe.mirai.message.defaults.PlainText import net.mamoe.mirai.message.defaults.PlainText
import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.utils.dataDecode
import net.mamoe.mirai.utils.hexToBytes import net.mamoe.mirai.utils.hexToBytes
import net.mamoe.mirai.utils.lazyDecode
import net.mamoe.mirai.utils.toUHexString import net.mamoe.mirai.utils.toUHexString
import net.mamoe.mirai.utils.toUInt import net.mamoe.mirai.utils.toUInt
import java.io.DataInputStream import java.io.DataInputStream
...@@ -139,7 +139,7 @@ class ServerGroupMessageEventPacket(input: DataInputStream, packetId: ByteArray, ...@@ -139,7 +139,7 @@ class ServerGroupMessageEventPacket(input: DataInputStream, packetId: ByteArray,
val map = input.readTLVMap(true) val map = input.readTLVMap(true)
if (map.containsKey(18)) { if (map.containsKey(18)) {
this.senderName = lazyDecode(map.getValue(18)) { this.senderName = dataDecode(map.getValue(18)) {
val tlv = it.readTLVMap(true) val tlv = it.readTLVMap(true)
tlv.printTLVMap() tlv.printTLVMap()
...@@ -385,7 +385,7 @@ class ServerFriendMessageEventPacket(input: DataInputStream, packetId: ByteArray ...@@ -385,7 +385,7 @@ class ServerFriendMessageEventPacket(input: DataInputStream, packetId: ByteArray
override fun decode() { override fun dataDecode() {
//start at Sep1.0:27 //start at Sep1.0:27
qq = input.readIntAt(0) qq = input.readIntAt(0)
val msgLength = input.readShortAt(22) val msgLength = input.readShortAt(22)
......
...@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.action ...@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.action
import net.mamoe.mirai.message.defaults.MessageChain import net.mamoe.mirai.message.defaults.MessageChain
import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.network.protocol.tim.packet.* import net.mamoe.mirai.network.protocol.tim.packet.*
import net.mamoe.mirai.utils.lazyEncode import net.mamoe.mirai.utils.dataEncode
import java.io.DataInputStream import java.io.DataInputStream
/** /**
...@@ -29,7 +29,7 @@ class ClientSendFriendMessagePacket( ...@@ -29,7 +29,7 @@ class ClientSendFriendMessagePacket(
writeHex("37 0F")//TIM最新: 38 03 writeHex("37 0F")//TIM最新: 38 03
writeQQ(botQQ) writeQQ(botQQ)
writeQQ(targetQQ) writeQQ(targetQQ)
write(md5(lazyEncode { md5Key -> md5Key.writeQQ(targetQQ); md5Key.write(sessionKey) })) write(md5(dataEncode { md5Key -> md5Key.writeQQ(targetQQ); md5Key.write(sessionKey) }))
writeHex("00 0B") writeHex("00 0B")
writeRandom(2) writeRandom(2)
writeTime() writeTime()
......
...@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.action ...@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.action
import net.mamoe.mirai.message.defaults.MessageChain import net.mamoe.mirai.message.defaults.MessageChain
import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.network.protocol.tim.packet.* import net.mamoe.mirai.network.protocol.tim.packet.*
import net.mamoe.mirai.utils.lazyEncode import net.mamoe.mirai.utils.dataEncode
import net.mamoe.mirai.utils.toUHexString import net.mamoe.mirai.utils.toUHexString
import java.io.DataInputStream import java.io.DataInputStream
...@@ -27,7 +27,7 @@ class ClientSendGroupMessagePacket( ...@@ -27,7 +27,7 @@ class ClientSendGroupMessagePacket(
writeByte(0x2A) writeByte(0x2A)
writeGroup(groupId) writeGroup(groupId)
writeLVByteArray(lazyEncode { child -> writeLVByteArray(dataEncode { child ->
child.writeHex("00 01 01") child.writeHex("00 01 01")
child.writeHex("00 00 00 00 00 00 00 4D 53 47 00 00 00 00 00") child.writeHex("00 00 00 00 00 00 00 4D 53 47 00 00 00 00 00")
......
...@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.login ...@@ -3,7 +3,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.login
import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.network.protocol.tim.packet.* import net.mamoe.mirai.network.protocol.tim.packet.*
import net.mamoe.mirai.utils.TEA import net.mamoe.mirai.utils.TEA
import net.mamoe.mirai.utils.lazyEncode import net.mamoe.mirai.utils.dataEncode
import java.io.DataInputStream import java.io.DataInputStream
import java.net.InetAddress import java.net.InetAddress
...@@ -87,7 +87,7 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, private val d ...@@ -87,7 +87,7 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, private val d
527 -> { 527 -> {
input.goto(63) input.goto(63)
sessionKey = input.readNBytes(16) sessionKey = input.readNBytes(16)
tlv0105 = lazyEncode { tlv0105 = dataEncode {
it.writeHex("01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00") it.writeHex("01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00")
input.goto(dataLength - 122) input.goto(dataLength - 122)
it.write(input.readNBytes(56)) it.write(input.readNBytes(56))
......
...@@ -165,7 +165,7 @@ open class ServerCaptchaTransmissionPacket(input: DataInputStream, private val d ...@@ -165,7 +165,7 @@ open class ServerCaptchaTransmissionPacket(input: DataInputStream, private val d
fun main() { fun main() {
val data = "13 00 05 01 00 00 01 23 00 38 59 32 29 5A 3E 3D 2D FC F5 22 EB 9E 2D FB 9C 4F AA 06 C8 32 3D F0 3C 2C 2B BA 8D 05 C4 9B C1 74 3B 70 F1 99 90 BB 6E 3E 6F 74 48 97 D3 61 B7 04 C0 A3 F1 DF 40 A4 DC 2B 00 A2 01 2D BB BB E8 FE B8 AF B3 6F 39 7C EA E2 5B 91 BE DB 59 38 CF 58 BC F2 88 F1 09 CF 92 E9 F7 FB 13 76 C5 68 29 23 3F 8E 43 16 2E 50 D7 FA 4D C1 F7 67 EF 27 FB C6 F1 A7 25 A4 BC 45 39 3A EA B2 A5 38 02 FF 4B C9 FF EB BD 89 E5 5D B9 4A 2A BE 5F 52 F1 EB 09 29 CB 3E 66 CF EF 97 89 47 BB 6B E0 7B 4A 3E A1 BC 3F FB F2 0A 83 CB E3 EA B9 43 E1 26 88 03 0B A7 E0 B2 AD 7F 83 CC DA 74 85 83 72 08 EC D2 F9 95 05 15 05 96 F7 1C FF 00 82 C3 90 22 A4 BA 90 D5 00 00 00 00 49 45 4E 44 AE 42 60 82 03 00 00 28 EA 32 5A 85 C8 D2 73 B3 40 39 77 85 65 98 00 FE 03 A2 A5 95 B4 2F E6 79 7A DE 5A 03 10 C8 3D BF 6D 3D 8B 51 84 C2 6D 49 00 10 92 AA 69 FB C6 3D 60 5A 7A A4 AC 7A B0 71 00 36".hexToBytes() val data = "13 00 05 01 00 00 01 23 00 38 59 32 29 5A 3E 3D 2D FC F5 22 EB 9E 2D FB 9C 4F AA 06 C8 32 3D F0 3C 2C 2B BA 8D 05 C4 9B C1 74 3B 70 F1 99 90 BB 6E 3E 6F 74 48 97 D3 61 B7 04 C0 A3 F1 DF 40 A4 DC 2B 00 A2 01 2D BB BB E8 FE B8 AF B3 6F 39 7C EA E2 5B 91 BE DB 59 38 CF 58 BC F2 88 F1 09 CF 92 E9 F7 FB 13 76 C5 68 29 23 3F 8E 43 16 2E 50 D7 FA 4D C1 F7 67 EF 27 FB C6 F1 A7 25 A4 BC 45 39 3A EA B2 A5 38 02 FF 4B C9 FF EB BD 89 E5 5D B9 4A 2A BE 5F 52 F1 EB 09 29 CB 3E 66 CF EF 97 89 47 BB 6B E0 7B 4A 3E A1 BC 3F FB F2 0A 83 CB E3 EA B9 43 E1 26 88 03 0B A7 E0 B2 AD 7F 83 CC DA 74 85 83 72 08 EC D2 F9 95 05 15 05 96 F7 1C FF 00 82 C3 90 22 A4 BA 90 D5 00 00 00 00 49 45 4E 44 AE 42 60 82 03 00 00 28 EA 32 5A 85 C8 D2 73 B3 40 39 77 85 65 98 00 FE 03 A2 A5 95 B4 2F E6 79 7A DE 5A 03 10 C8 3D BF 6D 3D 8B 51 84 C2 6D 49 00 10 92 AA 69 FB C6 3D 60 5A 7A A4 AC 7A B0 71 00 36".hexToBytes()
ServerVerificationCodeTransmissionPacket(data.dataInputStream(), data.size, "00 BA 31 01".hexToBytes()).let { ServerVerificationCodeTransmissionPacket(data.dataInputStream(), data.size, "00 BA 31 01".hexToBytes()).let {
it.decode() it.dataDecode()
println(it.toString()) println(it.toString())
} }
}*/ }*/
......
...@@ -183,7 +183,7 @@ object TEA { ...@@ -183,7 +183,7 @@ object TEA {
if (mIndexPos == 8) { if (mIndexPos == 8) {
isFirstBlock = false isFirstBlock = false
if (!decodeOneBlock(cipherText, offset, len)) { if (!decodeOneBlock(cipherText, offset, len)) {
throw RuntimeException("Unable to decode") throw RuntimeException("Unable to dataDecode")
} }
} }
} }
...@@ -201,7 +201,7 @@ object TEA { ...@@ -201,7 +201,7 @@ object TEA {
mPreOutPos = mOutPos - 8 mPreOutPos = mOutPos - 8
isFirstBlock = false isFirstBlock = false
if (!decodeOneBlock(cipherText, offset, len)) { if (!decodeOneBlock(cipherText, offset, len)) {
throw RuntimeException("Unable to decode") throw RuntimeException("Unable to dataDecode")
} }
} }
plen-- plen--
...@@ -219,7 +219,7 @@ object TEA { ...@@ -219,7 +219,7 @@ object TEA {
if (mIndexPos == 8) { if (mIndexPos == 8) {
mPreOutPos = mOutPos mPreOutPos = mOutPos
if (!decodeOneBlock(cipherText, offset, len)) { if (!decodeOneBlock(cipherText, offset, len)) {
throw RuntimeException("Unable to decode") throw RuntimeException("Unable to dataDecode")
} }
} }
g++ g++
......
...@@ -78,9 +78,11 @@ open class ByteArrayDataOutputStream : DataOutputStream(ByteArrayOutputStream()) ...@@ -78,9 +78,11 @@ open class ByteArrayDataOutputStream : DataOutputStream(ByteArrayOutputStream())
open fun toUByteArray(): UByteArray = (out as ByteArrayOutputStream).toByteArray().toUByteArray() open fun toUByteArray(): UByteArray = (out as ByteArrayOutputStream).toByteArray().toUByteArray()
} }
fun lazyEncode(t: (ByteArrayDataOutputStream) -> Unit): ByteArray = ByteArrayDataOutputStream().also(t).toByteArray() fun dataEncode(t: (ByteArrayDataOutputStream) -> Unit): ByteArray = ByteArrayDataOutputStream().also(t).toByteArray()
fun <T> lazyDecode(byteArray: ByteArray, t: (DataInputStream) -> T): T = byteArray.dataInputStream().let(t) fun <R> dataDecode(byteArray: ByteArray, t: (DataInputStream) -> R): R = byteArray.dataInputStream().let(t)
fun <R> ByteArray.decode(t: (DataInputStream) -> R): R = this.dataInputStream().let(t)
fun DataInputStream.skip(n: Number) { fun DataInputStream.skip(n: Number) {
this.skip(n.toLong()) this.skip(n.toLong())
...@@ -149,13 +151,13 @@ fun ByteArray.removeZeroTail(): ByteArray { ...@@ -149,13 +151,13 @@ fun ByteArray.removeZeroTail(): ByteArray {
} }
fun BufferedImage.toByteArray(formatName: String = "PNG"): ByteArray { fun BufferedImage.toByteArray(formatName: String = "PNG"): ByteArray {
return lazyEncode { return dataEncode {
ImageIO.write(this, formatName, it) ImageIO.write(this, formatName, it)
} }
} }
object GZip { object GZip {
fun uncompress(bytes: ByteArray): ByteArray = lazyEncode { fun uncompress(bytes: ByteArray): ByteArray = dataEncode {
GZIPInputStream(bytes.inputStream()).transferTo(it) GZIPInputStream(bytes.inputStream()).transferTo(it)
} }
......
...@@ -4,8 +4,8 @@ import jpcap.JpcapCaptor ...@@ -4,8 +4,8 @@ import jpcap.JpcapCaptor
import jpcap.packet.IPPacket import jpcap.packet.IPPacket
import jpcap.packet.UDPPacket import jpcap.packet.UDPPacket
import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.network.protocol.tim.packet.* import net.mamoe.mirai.network.protocol.tim.packet.ServerEventPacket
import net.mamoe.mirai.network.protocol.tim.packet.login.* import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
import java.io.DataInputStream import java.io.DataInputStream
...@@ -72,52 +72,21 @@ object Main { ...@@ -72,52 +72,21 @@ object Main {
} }
} }
fun dataReceived(data: ByteArray) {
if (!debugStarted) {
return
}
/**
* 从 TIM 内存中读取.
*
* 方法:
* 在 Common.dll 中搜索
*/
const val sessionKey: String = "70 BD 1E 12 20 C1 25 12 A0 F8 4F 0D C0 A0 97 0E"
fun dataReceived(data: ByteArray) {
packetReceived(ServerPacket.ofByteArray(data)) packetReceived(ServerPacket.ofByteArray(data))
} }
fun packetReceived(packet: ServerPacket) { fun packetReceived(packet: ServerPacket) {
when (packet) { when (packet) {
is ServerTouchResponsePacket.Encrypted -> packetReceived(packet.decrypt())
is ServerTouchResponsePacket -> {
if (packet.serverIP == null) {
loginTime = packet.loginTime
loginIp = packet.loginIP
token0825 = packet.token0825
}
//then send 08 36 31 03
}
is ServerLoginResponseFailedPacket -> {
println("login failed")
}
is ServerLoginResponseKeyExchangePacket.Encrypted -> packetReceived(packet.decrypt(privateKey))
is ServerLoginResponseVerificationCodeInitPacket.Encrypted -> packetReceived(packet.decrypt())
is ServerLoginResponseSuccessPacket.Encrypted -> packetReceived(packet.decrypt(privateKey))
is ServerLoginResponseKeyExchangePacket -> {
privateKey = packet.privateKey
//then 31 04 or 31 06
}
is ServerLoginResponseSuccessPacket -> {
sessionResponseDecryptionKey = packet.sessionResponseDecryptionKey
}
is ServerSessionKeyResponsePacket.Encrypted -> packetReceived(packet.decrypt(sessionResponseDecryptionKey))
is ServerSessionKeyResponsePacket -> {
sessionKey = packet.sessionKey
println("Got sessionKey=" + sessionKey.toUHexString())
}
is ServerEventPacket.Raw.Encrypted -> { is ServerEventPacket.Raw.Encrypted -> {
val sessionKey = "8B 45 10 0F 10 00 66 0F 38 00 05 20 39 18 64 0F".hexToBytes() val sessionKey = "8B 45 10 0F 10 00 66 0F 38 00 05 20 39 18 64 0F".hexToBytes()
println("! ServerEventPacket.Raw.Encrypted") println("! ServerEventPacket.Raw.Encrypted")
...@@ -130,37 +99,16 @@ object Main { ...@@ -130,37 +99,16 @@ object Main {
} }
} }
@Volatile
private var debugStarted = true
private const val qq: Int = 1994701021
private const val password: String = "xiaoqqq"
lateinit var token0825: ByteArray//56
var loginTime: Int = 0
lateinit var loginIp: String
lateinit var privateKey: ByteArray//16
lateinit var sessionKey: ByteArray
lateinit var sessionResponseDecryptionKey: ByteArray
fun dataSent(data: ByteArray) { fun dataSent(data: ByteArray) {
//println("Sent: " + data.toUByteArray().toUHexString()) data.cutTail(1).decode { base ->
base.skip(3)
lazyDecode(data.cutTail(1)) { val idHex = base.readNBytes(4).toUHexString()
it.skip(3)
val idHex = it.readNBytes(4).toUHexString()
println("发出包$idHex") println("发出包$idHex")
when (idHex.substring(0, 5)) { when (idHex.substring(0, 5)) {
"08 25" -> {
debugStarted = true
println("Detected touch, debug start!!")
}
"00 CD" -> { "00 CD" -> {
println("好友消息发出: ") println("好友消息发出: ")
val sessionKey = "70 BD 1E 12 20 C1 25 12 A0 F8 4F 0D C0 A0 97 0E".hexToBytes() dataDecode(data) {
lazyDecode(data) {
//it.readShort() //it.readShort()
//println(it.readUInt()) //println(it.readUInt())
println(it.readNBytes(TIMProtocol.fixVer2.hexToBytes().size + 1 + 5 - 3 + 1).toUHexString()) println(it.readNBytes(TIMProtocol.fixVer2.hexToBytes().size + 1 + 5 - 3 + 1).toUHexString())
...@@ -172,41 +120,6 @@ object Main { ...@@ -172,41 +120,6 @@ object Main {
} }
} }
} }
"08 36" -> {
println(data.toUHexString())
println("tim的 passwordSubmissionKey1 = " + it.readNBytes(TIMProtocol.passwordSubmissionTLV1.hexToBytes().size).toUHexString())
//it.skipHex(Protocol.passwordSubmissionKey1)
println(it.readNBytes(2).toUHexString())
println("tim的 publicKey = " + it.readNBytes(TIMProtocol.publicKey.hexToBytes().size).toUHexString())
println(it.readNBytes(2).toUHexString())
println("tim的 key0836=" + it.readLVByteArray().toUHexString())
//it.skipHex(Protocol.key0836)
val encrypted = it.readAllBytes()
println(encrypted.size)
println(encrypted.toUHexString())
val tlv0006data = lazyDecode(encrypted.decryptBy(TIMProtocol.shareKey)) { section ->
section.skip(2 + 2 + 56 + 2)
section.skip(section.readShort())//device name
section.skip(6 + 4 + 2 + 2)
//tlv0006, encrypted by pwd md5
section.readNBytes(160).decryptBy(lazyEncode { md5(md5(password) + "00 00 00 00".hexToBytes() + qq.toUInt().toByteArray()) })
}
lazyDecode(tlv0006data) { tlv0006 ->
tlv0006.skip(4 + 2 + 4)
tlv0006.skipHex(TIMProtocol.constantData2)
tlv0006.skip(3)
tlv0006.skip(16 + 4 + 1 + 4 * 3 + 4 + 8 + 2)
tlv0006.skipHex("15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B")
privateKey = tlv0006.readNBytes(16)
}
println("Got privateKey=" + privateKey.toUHexString())
//then receive
}
else -> {
}
} }
} }
} }
...@@ -221,15 +134,6 @@ object Main { ...@@ -221,15 +134,6 @@ object Main {
} }
} }
val shareKeyFromCS = "60 42 3B 51 C3 B1 F6 0F 67 E8 9C 00 F0 A7 BD A3"
fun main() {
val data = "2C 3C 4A 0D 14 D3 C4 8D FA 99 58 02 87 04 47 66 F9 F9 4F DF B8 01 1E C6 2A 52 3E 83 B0 96 4C 1C 3C D0 1C A0 D6 58 3C D0 2B 6B 33 1E 37 0A 6E C3 49 CE 57 B0 70 41 88 C1 3B A3 61 72 5E 3C 65 EC B1 2E EC 25 0E 1B 66 7A C4 28 F7 1D 53 15 56 99 BB 18 90 ED E6 13 97 19 FE 42 DB D1 16 E3 21 77 6E 90 B8 E2 5A 6D C3 AE FF 5C 63 98 AE 42 B0 AB 96 0B 08 D8 DA E0 D3 BD 17 E4 7B 76 1C 16 17 DC".hexToBytes()
println(TEA.decrypt(data, "9A 45 7B D4 54 EF 7C E7 86 F5 20 EF 27 BE CF C1".hexToBytes()).toUHexString())
//succeed
}
/* /*
00 19 00 19
tim的 publicKey = 02 F4 07 37 2D F1 82 1D 45 E8 30 14 41 74 AF E3 03 AB 29 D7 82 D9 E2 E5 89 tim的 publicKey = 02 F4 07 37 2D F1 82 1D 45 E8 30 14 41 74 AF E3 03 AB 29 D7 82 D9 E2 E5 89
......
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