mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-04 07:30:15 +08:00
Rename lazyEncode to dataEncode
This commit is contained in:
parent
8ca3e6578d
commit
5f0220b905
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)*/
|
||||
}
|
||||
}
|
||||
}
|
@ -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())
|
||||
}
|
||||
|
@ -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())
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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())
|
||||
}
|
||||
}*/
|
||||
|
@ -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++
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user