Commit 97f47b54 authored by Him188's avatar Him188

Working on uploading image

parent e11cdf24
...@@ -17,6 +17,8 @@ kotlin { ...@@ -17,6 +17,8 @@ kotlin {
} }
} }
jvmMain { jvmMain {
apply plugin: 'java'
dependencies { dependencies {
implementation rootProject.ext.kotlinJvm implementation rootProject.ext.kotlinJvm
implementation rootProject.ext.reflect implementation rootProject.ext.reflect
...@@ -28,6 +30,7 @@ kotlin { ...@@ -28,6 +30,7 @@ kotlin {
implementation 'org.jsoup:jsoup:1.12.1' implementation 'org.jsoup:jsoup:1.12.1'
implementation 'org.ini4j:ini4j:0.5.2' implementation 'org.ini4j:ini4j:0.5.2'
implementation project(":mirai-protocol-timpc")
} }
} }
jvmTest { jvmTest {
......
...@@ -37,18 +37,19 @@ class ClientTryGetImageIDPacket( ...@@ -37,18 +37,19 @@ class ClientTryGetImageIDPacket(
writeZero(2) writeZero(2)
writeHex("5E") writeHex("5B")//原5E
writeHex("08") writeHex("08")
writeHex("01 12 03 98 01 01 10 01") writeHex("01 12 03 98 01 01 10 01")
writeHex("1A") writeHex("1A")
writeHex("5A") writeHex("57")//原5A
writeHex("08") writeHex("08")
writeUVarInt(groupNumberOrQQNumber) writeUVarInt(groupNumberOrQQNumber)//FB D2 D8 94
writeByte(0x02)
writeHex("10") writeHex("10")
writeUVarInt(botNumber) writeUVarInt(botNumber)//A2 FF 8C F0
writeHex("18 00") writeHex("18 00")
...@@ -57,10 +58,13 @@ class ClientTryGetImageIDPacket( ...@@ -57,10 +58,13 @@ class ClientTryGetImageIDPacket(
write(md5(byteArray)) write(md5(byteArray))
writeHex("28") writeHex("28")
writeUVarInt(byteArray.size.toUInt()) writeUVarInt(byteArray.size.toUInt())//E2 0D
writeHex("32") writeHex("32")
writeHex("1A") writeHex("1A")
//28 00 5A 00 53 00 41 00 58 00 40 00 57 00 4B 00 52 00 4A 00 5A 00 31 00 7E 00 38 01 48 01 50 38 58 34 60 04 6A 05 32 36 39 33 33 70 00 78 03 80 01 00
writeHex("37 00 4D 00 32 00 25 00 4C 00 31 00 56 00 32 00 7B 00 39 00 30 00 29 00 52 00") writeHex("37 00 4D 00 32 00 25 00 4C 00 31 00 56 00 32 00 7B 00 39 00 30 00 29 00 52 00")
writeHex("38 01") writeHex("38 01")
......
...@@ -3,11 +3,12 @@ apply plugin: "java" ...@@ -3,11 +3,12 @@ apply plugin: "java"
dependencies { dependencies {
implementation project(':mirai-core') implementation project(':mirai-core')
compile 'com.google.protobuf:protobuf-java:3.5.0'
compile files('./lib/jpcap.jar') compile files('./lib/jpcap.jar')
compile 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M2' compile rootProject.ext.coroutineCommon
compile 'org.jetbrains.kotlin:kotlin-stdlib:1.3.50' compile rootProject.ext.kotlinJvm
compile group: 'com.google.protobuf', name: 'protobuf-java', version: rootProject.ext.protobuf_version
} }
tasks.withType(JavaCompile) { tasks.withType(JavaCompile) {
......
...@@ -67,6 +67,12 @@ object HexComparator { ...@@ -67,6 +67,12 @@ object HexComparator {
.replace(" ", " ") .replace(" ", " ")
} }
@Suppress("SpellCheckingInspection")
object PacketIds {
val heartbeat = "00 58"
val friendmsg = "00 CD"
}
init { init {
CONST_FIELDS.forEach { field -> CONST_FIELDS.forEach { field ->
for (match in match(hex, field)) { for (match in match(hex, field)) {
...@@ -89,7 +95,8 @@ object HexComparator { ...@@ -89,7 +95,8 @@ object HexComparator {
companion object { companion object {
private val CONST_FIELDS: List<Field> = listOf( private val CONST_FIELDS: List<Field> = listOf(
TestConsts::class.java, TestConsts::class.java,
TIMProtocol::class.java TIMProtocol::class.java,
PacketIds::class.java
).map { it.declaredFields }.flatMap { fields -> ).map { it.declaredFields }.flatMap { fields ->
fields.map { field -> fields.map { field ->
field.trySetAccessible() field.trySetAccessible()
......
...@@ -3,11 +3,13 @@ ...@@ -3,11 +3,13 @@
import jpcap.JpcapCaptor import jpcap.JpcapCaptor
import jpcap.packet.IPPacket import jpcap.packet.IPPacket
import jpcap.packet.UDPPacket import jpcap.packet.UDPPacket
import net.mamoe.mirai.message.defaults.readMessageChain
import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.network.protocol.tim.packet.ServerEventPacket import net.mamoe.mirai.network.protocol.tim.packet.ServerEventPacket
import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket
import net.mamoe.mirai.network.protocol.tim.packet.UnknownServerEventPacket
import net.mamoe.mirai.network.protocol.tim.packet.UnknownServerPacket
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
import java.io.DataInputStream
/** /**
* 抓包分析器 * 抓包分析器
...@@ -59,8 +61,8 @@ object Main { ...@@ -59,8 +61,8 @@ object Main {
dataReceived(pk.data) dataReceived(pk.data)
} else { } else {
try { try {
println("size = " + pk.data.size)
dataSent(pk.data) dataSent(pk.data)
println()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
...@@ -88,15 +90,33 @@ object Main { ...@@ -88,15 +90,33 @@ object Main {
val sessionKey: ByteArray = "48 C0 11 42 2D FD 8F 36 6E BA BF FD D3 AA B7 AE".hexToBytes() val sessionKey: ByteArray = "48 C0 11 42 2D FD 8F 36 6E BA BF FD D3 AA B7 AE".hexToBytes()
fun dataReceived(data: ByteArray) { fun dataReceived(data: ByteArray) {
//println("--------------")
//println("接收数据包")
//println("raw packet = " + data.toUHexString())
packetReceived(ServerPacket.ofByteArray(data)) packetReceived(ServerPacket.ofByteArray(data))
} }
fun packetReceived(packet: ServerPacket) { fun packetReceived(packet: ServerPacket) {
when (packet) { when (packet) {
is ServerEventPacket.Raw.Encrypted -> { is ServerEventPacket.Raw.Encrypted -> {
println("! ServerEventPacket.Raw.Encrypted")
packetReceived(packet.decrypt(sessionKey)) packetReceived(packet.decrypt(sessionKey))
println("! decrypt succeed") }
is ServerEventPacket.Raw -> packetReceived(packet.distribute())
is UnknownServerEventPacket -> {
println("--------------")
println("未知事件ID=" + packet.packetId.toUHexString())
println("未知事件: " + packet.input.readAllBytes().toUHexString())
}
is ServerEventPacket -> {
println("事件")
println(packet)
}
is UnknownServerPacket -> {
//ignore
} }
else -> { else -> {
...@@ -104,38 +124,45 @@ object Main { ...@@ -104,38 +124,45 @@ object Main {
} }
} }
fun dataSent(rawPacket: ByteArray) = rawPacket.cutTail(1).decode { packet ->
println("---------------------------")
packet.skip(3)//head
val idHex = packet.readNBytes(4).toUHexString()
println("发出包ID = $idHex")
packet.skip(TIMProtocol.fixVer2.hexToBytes().size + 1 + 5 - 3 + 1)
val encryptedBody = packet.readAllBytes()
println("body = ${encryptedBody.toUHexString()}")
encryptedBody.decode { data ->
fun dataSent(data: ByteArray) {
data.cutTail(1).decode { base ->
base.skip(3)
val idHex = base.readNBytes(4).toUHexString()
println("发出包$idHex")
when (idHex.substring(0, 5)) { when (idHex.substring(0, 5)) {
"00 CD" -> { "00 CD" -> {
println("好友消息发出: ") println("好友消息")
dataDecode(data) {
//it.readShort() val raw = data.readAllBytes()
//println(it.readUInt()) println("解密前数据: " + raw.toUHexString())
println(it.readNBytes(TIMProtocol.fixVer2.hexToBytes().size + 1 + 5 - 3 + 1).toUHexString()) val messageData = raw.decryptBy(sessionKey)
val messageData = it.readAllBytes().decryptBy(sessionKey) println("解密结果: " + messageData.toUHexString())
println("尝试解消息")
messageData.decode {
it.skip(
4 + 4 + 12 + 2 + 4 + 4 + 16 + 2 + 2 + 4 + 2 + 16 + 4 + 4 + 7 + 15 + 2
+ 1
)
val chain = it.readMessageChain()
println(chain.toObjectString())
} }
} }
"03 88" -> {
println("上传图片-获取图片ID")
data.skip(8)
val body = data.readAllBytes().decryptBy(sessionKey)
println(body.toUHexString())
}
} }
} }
}
private fun DataInputStream.skipHex(uHex: String) {
this.skip(uHex.hexToBytes().size.toLong())
} }
} }
\ No newline at end of file
/*
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
00 00
tim的 key0836=70 BE 41 20 3A FA 05 B2 2D 66 2E 29 33 55 99 7E
552
76 AF AE 95 EB 89 BE B5 1C 83 D2 87 23 3B 5A 3B 6B 4C 78 AD F9 93 86 CA 13 D7 86 B5 0C D1 84 FB 2B ED 59 26 42 3B E0 6F 1A 91 A5 98 91 20 25 3F 6D C0 F6 FC 27 3D F8 34 EA 50 95 8C 2A BB 22 73 BD 76 60 2A 6B 68 51 07 4A 2F 37 6D 97 42 51 C5 14 47 96 3A A9 6B 8F 66 F8 D4 F4 52 22 13 D5 CC 9F B1 B4 06 BC 4B 35 B6 CF D8 CB 70 0F 0C E6 AA D9 12 E9 A2 C7 7F D8 24 7E 1B 2D 97 67 DA 34 0A FD 8E 44 D3 58 50 0D F0 0A 20 08 0A 46 28 68 0A 06 17 36 84 94 2C 97 2A 22 32 7B 01 67 3F E4 90 71 88 B2 F9 7B 7B AC 1A 00 CD 54 4A D7 AE 71 68 B3 FB E5 F3 94 9A C2 A1 C3 CA A5 4E AB 2C B0 78 AD EE 63 3F E6 24 6E AC 31 A5 00 F4 DB C7 4B 65 44 7B 92 87 30 7D 73 B3 21 81 C8 99 33 06 65 28 0C 98 56 EF 41 DC 64 79 55 69 AD B7 F4 A4 CF 4A 28 4B 3B E3 5A 2B C1 72 20 95 D9 8E 9F 1E A5 DE 9A DD 39 0B BE 76 A8 BE 95 9D 7C C2 C5 A8 3A D3 76 B6 D4 ED 15 34 5D 3C 8E 96 C6 93 64 78 A1 89 78 DA F8 17 E5 96 75 5F B6 97 FC 41 18 A4 54 67 BA 3B ED 97 27 B7 E3 90 81 1E DC 8D 17 25 46 2D 08 0D BB 95 D0 CB C8 9B 78 36 2D 70 E3 C6 4C 21 E9 C0 02 69 3B C5 F7 91 6B 62 D8 E4 10 F0 01 5B 7F 1A 3E 9F 1A D4 D3 A9 2B 4A C2 BD 6D 8B B0 0A AE A4 E9 72 71 F4 39 28 CE 18 42 ED FD BB 61 08 B1 95 93 8E F6 29 D7 B6 CB 15 2A AA AF A7 81 AD DF 3B D5 3F 47 29 AB 61 0C 86 48 82 93 AE 8C 2C 32 CC 83 83 68 08 C6 9D 10 81 82 BA 92 24 0E ED 71 B1 83 E1 08 D0 01 BB DF E2 26 D0 20 DF 8C 95 E1 A6 42 C2 A2 E7 85 00 E6 AA 54 A8 0C 5D BB 8D 46 37 AD 47 88 38 B9 D7 3B 48 13 13 81 3B A5 05 4D 32 24 A4 CE 08 73 6D 89 FD 6D CC F5 AB 8B 6A 39 4B 9D 30 33 73 F1 01 7F E4 43 03 72 44 67 3A 24 28 40 51 2B EB 48 EB F9 05 A9 3C 20 EB 4D B7 45 56 D3 4E BD A0 B5 40 65 D1 16 57 73 A4 81 B1 A6 8C 3F 68 28 AA EB 83
*/
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