Rename lazyEncode to dataEncode

This commit is contained in:
Him188 2019-10-07 17:49:15 +08:00
parent 8ca3e6578d
commit 5f0220b905
13 changed files with 59 additions and 152 deletions

View File

@ -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.writeHex
import net.mamoe.mirai.network.protocol.tim.packet.writeLVByteArray
import net.mamoe.mirai.utils.lazyDecode
import net.mamoe.mirai.utils.lazyEncode
import net.mamoe.mirai.utils.dataDecode
import net.mamoe.mirai.utils.dataEncode
/**
* QQ 自带表情
@ -23,10 +23,10 @@ class Face(val id: FaceID) : Message() {
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.writeLVByteArray(lazyEncode { child ->
section.writeLVByteArray(dataEncode { child ->
child.writeShort(1)
child.writeByte(this.id.id)
@ -49,7 +49,7 @@ class Face(val id: FaceID) : Message() {
override operator fun contains(sub: String): Boolean = false
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 0C 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 4D
it.skip(1)
@ -57,7 +57,7 @@ class Face(val id: FaceID) : Message() {
val id1 = FaceID.ofId(it.readLVNumber().toInt())//可能这个是id, 也可能下面那个
it.skip(it.readByte().toLong())
it.readLVNumber()//某id?
return@lazyDecode Face(id1)
return@dataDecode Face(id1)
}
}
}

View File

@ -3,8 +3,8 @@ package net.mamoe.mirai.message.defaults
import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.MessageKey
import net.mamoe.mirai.network.protocol.tim.packet.*
import net.mamoe.mirai.utils.lazyDecode
import net.mamoe.mirai.utils.lazyEncode
import net.mamoe.mirai.utils.dataDecode
import net.mamoe.mirai.utils.dataEncode
import net.mamoe.mirai.utils.skip
import net.mamoe.mirai.utils.toUHexString
@ -25,10 +25,10 @@ open class Image(val imageId: String) : Message() {
return imageId
}
override fun toByteArray(): ByteArray = lazyEncode { section ->
override fun toByteArray(): ByteArray = dataEncode { section ->
section.writeByte(intValue)
section.writeLVByteArray(lazyEncode { child ->
section.writeLVByteArray(dataEncode { child ->
child.writeByte(0x02)
child.writeLVString(this.imageId)
child.writeHex("04 00 " +
@ -57,7 +57,7 @@ open class Image(val imageId: String) : Message() {
internal object PacketHelper {
@JvmStatic
fun ofByteArray0x06(data: ByteArray): Image = lazyDecode(data) {
fun ofByteArray0x06(data: ByteArray): Image = dataDecode(data) {
it.skip(1)
println("好友的图片")
println(data.toUHexString())
@ -67,17 +67,17 @@ open class Image(val imageId: String) : Message() {
val imageId = String(it.readNBytes(36))
println(imageId)
it.skip(1)//0x41
return@lazyDecode Image("{$imageId}.$suffix")
return@dataDecode Image("{$imageId}.$suffix")
}
@JvmStatic
fun ofByteArray0x03(data: ByteArray): Image = lazyDecode(data) {
fun ofByteArray0x03(data: ByteArray): Image = dataDecode(data) {
it.skip(1)
return@lazyDecode Image(String(it.readLVByteArray()))
return@dataDecode Image(String(it.readLVByteArray()))
/*
println(String(it.readLVByteArray()))
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)
val imageId = String(it.readNBytes(42))
@ -86,7 +86,7 @@ open class Image(val imageId: String) : Message() {
it.skip(1)//0x43
it.skip(1)//0x41
return@lazyDecode Image(imageId)*/
return@dataDecode Image(imageId)*/
}
}
}

View File

@ -2,7 +2,7 @@ package net.mamoe.mirai.message.defaults
import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.MessageKey
import net.mamoe.mirai.utils.lazyEncode
import net.mamoe.mirai.utils.dataEncode
import java.util.*
import java.util.stream.Collectors
import java.util.stream.Stream
@ -77,7 +77,7 @@ class MessageChain : Message {
return this
}
override fun toByteArray(): ByteArray = lazyEncode {
override fun toByteArray(): ByteArray = dataEncode {
stream().forEach { message ->
it.write(message.toByteArray())
}

View File

@ -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.writeLVByteArray
import net.mamoe.mirai.network.protocol.tim.packet.writeLVString
import net.mamoe.mirai.utils.lazyDecode
import net.mamoe.mirai.utils.lazyEncode
import net.mamoe.mirai.utils.dataDecode
import net.mamoe.mirai.utils.dataEncode
/**
* @author Him188moe
@ -20,10 +20,10 @@ class PlainText(private val text: String) : Message() {
return text
}
override fun toByteArray(): ByteArray = lazyEncode { section ->
override fun toByteArray(): ByteArray = dataEncode { section ->
section.writeByte(this.type.intValue)
section.writeLVByteArray(lazyEncode { child ->
section.writeLVByteArray(dataEncode { child ->
child.writeByte(0x01)
child.writeLVString(this.text)
})
@ -40,7 +40,7 @@ class PlainText(private val text: String) : Message() {
internal object PacketHelper {
@JvmStatic
fun ofByteArray(data: ByteArray): PlainText = lazyDecode(data) {
fun ofByteArray(data: ByteArray): PlainText = dataDecode(data) {
it.skip(1)
PlainText(it.readLVString())
}

View File

@ -55,7 +55,8 @@ internal class TIMBotNetworkHandler(private val bot: Bot) : BotNetworkHandler {
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()
val ip = ipQueue.poll() ?: return LoginState.UNKNOWN//所有服务器均返回 UNKNOWN

View File

@ -8,8 +8,8 @@ import net.mamoe.mirai.message.defaults.Image
import net.mamoe.mirai.message.defaults.MessageChain
import net.mamoe.mirai.message.defaults.PlainText
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.lazyDecode
import net.mamoe.mirai.utils.toUHexString
import net.mamoe.mirai.utils.toUInt
import java.io.DataInputStream
@ -139,7 +139,7 @@ class ServerGroupMessageEventPacket(input: DataInputStream, packetId: ByteArray,
val map = input.readTLVMap(true)
if (map.containsKey(18)) {
this.senderName = lazyDecode(map.getValue(18)) {
this.senderName = dataDecode(map.getValue(18)) {
val tlv = it.readTLVMap(true)
tlv.printTLVMap()
@ -385,7 +385,7 @@ class ServerFriendMessageEventPacket(input: DataInputStream, packetId: ByteArray
override fun decode() {
override fun dataDecode() {
//start at Sep1.0:27
qq = input.readIntAt(0)
val msgLength = input.readShortAt(22)

View File

@ -3,7 +3,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.action
import net.mamoe.mirai.message.defaults.MessageChain
import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.network.protocol.tim.packet.*
import net.mamoe.mirai.utils.lazyEncode
import net.mamoe.mirai.utils.dataEncode
import java.io.DataInputStream
/**
@ -29,7 +29,7 @@ class ClientSendFriendMessagePacket(
writeHex("37 0F")//TIM最新: 38 03
writeQQ(botQQ)
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")
writeRandom(2)
writeTime()

View File

@ -3,7 +3,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.action
import net.mamoe.mirai.message.defaults.MessageChain
import net.mamoe.mirai.network.protocol.tim.TIMProtocol
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 java.io.DataInputStream
@ -27,7 +27,7 @@ class ClientSendGroupMessagePacket(
writeByte(0x2A)
writeGroup(groupId)
writeLVByteArray(lazyEncode { child ->
writeLVByteArray(dataEncode { child ->
child.writeHex("00 01 01")
child.writeHex("00 00 00 00 00 00 00 4D 53 47 00 00 00 00 00")

View File

@ -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.packet.*
import net.mamoe.mirai.utils.TEA
import net.mamoe.mirai.utils.lazyEncode
import net.mamoe.mirai.utils.dataEncode
import java.io.DataInputStream
import java.net.InetAddress
@ -87,7 +87,7 @@ class ServerSessionKeyResponsePacket(inputStream: DataInputStream, private val d
527 -> {
input.goto(63)
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")
input.goto(dataLength - 122)
it.write(input.readNBytes(56))

View File

@ -165,7 +165,7 @@ open class ServerCaptchaTransmissionPacket(input: DataInputStream, private val d
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()
ServerVerificationCodeTransmissionPacket(data.dataInputStream(), data.size, "00 BA 31 01".hexToBytes()).let {
it.decode()
it.dataDecode()
println(it.toString())
}
}*/

View File

@ -183,7 +183,7 @@ object TEA {
if (mIndexPos == 8) {
isFirstBlock = false
if (!decodeOneBlock(cipherText, offset, len)) {
throw RuntimeException("Unable to decode")
throw RuntimeException("Unable to dataDecode")
}
}
}
@ -201,7 +201,7 @@ object TEA {
mPreOutPos = mOutPos - 8
isFirstBlock = false
if (!decodeOneBlock(cipherText, offset, len)) {
throw RuntimeException("Unable to decode")
throw RuntimeException("Unable to dataDecode")
}
}
plen--
@ -219,7 +219,7 @@ object TEA {
if (mIndexPos == 8) {
mPreOutPos = mOutPos
if (!decodeOneBlock(cipherText, offset, len)) {
throw RuntimeException("Unable to decode")
throw RuntimeException("Unable to dataDecode")
}
}
g++

View File

@ -78,9 +78,11 @@ open class ByteArrayDataOutputStream : DataOutputStream(ByteArrayOutputStream())
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) {
this.skip(n.toLong())
@ -149,13 +151,13 @@ fun ByteArray.removeZeroTail(): ByteArray {
}
fun BufferedImage.toByteArray(formatName: String = "PNG"): ByteArray {
return lazyEncode {
return dataEncode {
ImageIO.write(this, formatName, it)
}
}
object GZip {
fun uncompress(bytes: ByteArray): ByteArray = lazyEncode {
fun uncompress(bytes: ByteArray): ByteArray = dataEncode {
GZIPInputStream(bytes.inputStream()).transferTo(it)
}

View File

@ -4,8 +4,8 @@ import jpcap.JpcapCaptor
import jpcap.packet.IPPacket
import jpcap.packet.UDPPacket
import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.network.protocol.tim.packet.*
import net.mamoe.mirai.network.protocol.tim.packet.login.*
import net.mamoe.mirai.network.protocol.tim.packet.ServerEventPacket
import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket
import net.mamoe.mirai.utils.*
import java.io.DataInputStream
@ -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))
}
fun packetReceived(packet: ServerPacket) {
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 -> {
val sessionKey = "8B 45 10 0F 10 00 66 0F 38 00 05 20 39 18 64 0F".hexToBytes()
println("! ServerEventPacket.Raw.Encrypted")
@ -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) {
//println("Sent: " + data.toUByteArray().toUHexString())
lazyDecode(data.cutTail(1)) {
it.skip(3)
val idHex = it.readNBytes(4).toUHexString()
data.cutTail(1).decode { base ->
base.skip(3)
val idHex = base.readNBytes(4).toUHexString()
println("发出包$idHex")
when (idHex.substring(0, 5)) {
"08 25" -> {
debugStarted = true
println("Detected touch, debug start!!")
}
"00 CD" -> {
println("好友消息发出: ")
val sessionKey = "70 BD 1E 12 20 C1 25 12 A0 F8 4F 0D C0 A0 97 0E".hexToBytes()
lazyDecode(data) {
dataDecode(data) {
//it.readShort()
//println(it.readUInt())
println(it.readNBytes(TIMProtocol.fixVer2.hexToBytes().size + 1 + 5 - 3 + 1).toUHexString())
@ -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 {
}
}
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
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