Commit 16d70c9f authored by Him188moe's avatar Him188moe

Login finished. Now working on Session

parent 4b889141
......@@ -58,7 +58,7 @@ S: 发送 `08 36 31 03` 告知登录结果.
- 设备锁
- 被回收
C: 回复 `08 28 04 34`
C: 回复 `08 28 04 34`, 请求建立 Session
Sample
```text
......@@ -66,7 +66,7 @@ Sample
```
**Session**
S: 发送 `08 28 04 34`, 告知:
S: 发送 `08 28 04 34`, 完成 session 建立, 告知:
- g_sessionKey
- g_tlv0105
- g_loginStatus
......
......@@ -4,6 +4,8 @@ import lombok.Getter;
import net.mamoe.mirai.event.MiraiEventManager;
import net.mamoe.mirai.event.events.server.ServerDisableEvent;
import net.mamoe.mirai.event.events.server.ServerEnableEvent;
import net.mamoe.mirai.network.RobotNetworkHandler;
import net.mamoe.mirai.network.packet.client.touch.ClientTouchPacket;
import net.mamoe.mirai.task.MiraiTaskManager;
import net.mamoe.mirai.utils.LoggerTextFormat;
import net.mamoe.mirai.utils.MiraiLogger;
......@@ -15,6 +17,7 @@ import net.mamoe.mirai.utils.setting.MiraiSettingMapSection;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Scanner;
public class MiraiServer {
......@@ -135,8 +138,8 @@ public class MiraiServer {
*/
/*
RobotNetworkHandler robotNetworkHandler = new RobotNetworkHandler(1994701021, "xiaoqqq");
Robot robot = new Robot(1994701021, "xiaoqqq", new LinkedList<>());
RobotNetworkHandler robotNetworkHandler = robot.getHandler();
try {
//System.out.println(Protocol.Companion.getSERVER_IP().get(3));
//System.out.println(Protocol.Companion.getSERVER_IP().toString());
......
......@@ -12,6 +12,7 @@ public class Robot {
private final int qq;
private final String password;
@Getter
private final RobotNetworkHandler handler;
/**
......@@ -40,19 +41,8 @@ public class Robot {
this.password = password;
this.owners = Collections.unmodifiableList(owners);
this.handler = new RobotNetworkHandler(this.qq, this.password);
}
public void connect() {
}
public void onPacketReceive() {
}
}
......@@ -4,6 +4,7 @@ import io.netty.channel.Channel
import net.mamoe.mirai.network.packet.client.ClientPacket
import net.mamoe.mirai.network.packet.client.login.*
import net.mamoe.mirai.network.packet.client.writeHex
import net.mamoe.mirai.network.packet.client.writeRandom
import net.mamoe.mirai.network.packet.server.ServerPacket
import net.mamoe.mirai.network.packet.server.login.*
import net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePacket
......@@ -44,7 +45,18 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
/**
* Kind of key, similar to sessionKey
*/
private lateinit var tlv0105: ByteArray
private var tlv0105: ByteArray
init {
tlv0105 = lazyEncode {
it.writeHex("01 05 00 30")
it.writeHex("00 01 01 02 00 14 01 01 00 10")
it.writeRandom(16)
it.writeHex("00 14 01 02 00 10")
it.writeRandom(16)
}
}
private lateinit var sessionKey: ByteArray
/**
* Kind of key, similar to sessionKey
......@@ -92,7 +104,7 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
is ServerLoginResponseSuccessPacket -> {
this._0828_rec_decr_key = packet._0828_rec_decr_key
sendPacket(ClientLoginSucceedConfirmationPacket(this.number, this.serverIP, this.loginIP, this.md5_32, packet.token38, packet.token88, packet.encryptionKey, this.tlv0105))
sendPacket(ClientSessionRequestPacket(this.number, this.serverIP, this.loginIP, this.md5_32, packet.token38, packet.token88, packet.encryptionKey, this.tlv0105))
}
//是ClientPasswordSubmissionPacket之后服务器回复的
......@@ -150,8 +162,8 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
@ExperimentalUnsignedTypes
fun sendPacket(packet: ClientPacket) {
sendPacketDebug(packet);
if (true) return;
/*sendPacketDebug(packet);
if (true) return;*/
try {
//MiraiLogger log "Encoding"
packet.encode()
......
......@@ -69,7 +69,7 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
@ExperimentalUnsignedTypes
@Throws(IOException::class)
fun DataOutputStream.writeIP(ip: String) {
for (s in ip.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
for (s in ip.trim().split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
this.writeByte(s.toInt())
}
}
......@@ -78,7 +78,7 @@ fun DataOutputStream.writeIP(ip: String) {
@ExperimentalUnsignedTypes
@Throws(IOException::class)
fun DataOutputStream.writeHex(hex: String) {
for (s in hex.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
for (s in hex.trim().split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
if (s.isEmpty()) {
continue
}
......@@ -128,7 +128,7 @@ fun DataOutputStream.encryptAndWrite(cryptor: TEACryptor, encoder: (ByteArrayDat
@Throws(IOException::class)
fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray) {
ByteArrayDataOutputStream().let {
it.writeRandom(4)
it.writeHex("12 12 12 12")//it.writeRandom(4) todo
it.writeHex("00 02")
it.writeQQ(qq)
it.writeHex(Protocol._0825data2)
......@@ -153,12 +153,18 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, log
}
}
fun main() {
}
/*
@ExperimentalUnsignedTypes
fun main() {
println(lazyEncode { it.writeTLV0006(1994701021, "D1 A5 C8 BB E1 Q3 CC DD", 131513, "123.123.123.123", "AA BB CC DD EE FF AA BB CC".hexToBytes()) }.toUByteArray().toUHexString())
}
}*/
@ExperimentalUnsignedTypes
@TestedSuccessfully
fun DataOutputStream.writeCRC32() = writeCRC32(getRandomKey(16))
......@@ -170,6 +176,7 @@ fun DataOutputStream.writeCRC32(key: ByteArray) {
}
}
@TestedSuccessfully
fun DataOutputStream.writeDeviceName() {
val deviceName = InetAddress.getLocalHost().hostName
this.writeShort(deviceName.length + 2)
......
......@@ -6,6 +6,7 @@ import net.mamoe.mirai.network.packet.client.*
import net.mamoe.mirai.util.*
import java.io.DataOutputStream
import java.net.InetAddress
import kotlin.system.exitProcess
/**
* Password submission (0836_622)
......@@ -39,7 +40,11 @@ class ClientPasswordSubmissionPacket(
}
}
@UseExperimental(ExperimentalUnsignedTypes::class)
fun main() {
println(InetAddress.getLocalHost().hostName)
exitProcess(0)
val loginTime = "5D 60 F6 33".hexToInt()
println(loginTime)
......@@ -67,11 +72,13 @@ fun main() {
@PacketId("08 36 31 04")
@ExperimentalUnsignedTypes//todo 测试出来这个包长度有问题
class ClientLoginResendPacket3104(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null) : ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr)
class ClientLoginResendPacket3104(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null)
: ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr)
@PacketId("08 36 31 06")
@ExperimentalUnsignedTypes
class ClientLoginResendPacket3106(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null) : ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr)
class ClientLoginResendPacket3106(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray, token0825: ByteArray, token00BA: ByteArray, tlv_0006_encr: ByteArray? = null)
: ClientLoginResendPacket(qq, password, loginTime, loginIP, tgtgtKey, token0825, token00BA, tlv_0006_encr)
@ExperimentalUnsignedTypes
open class ClientLoginResendPacket internal constructor(
......@@ -111,7 +118,7 @@ open class ClientLoginResendPacket internal constructor(
@ExperimentalUnsignedTypes
@PacketId("08 28 04 34")
class ClientLoginSucceedConfirmationPacket(
class ClientSessionRequestPacket(
private val qq: Int,
private val serverIp: String,
private val loginIP: String,
......@@ -153,7 +160,7 @@ class ClientLoginSucceedConfirmationPacket(
this.writeHex("68")
this.writeHex("00 00 00 00 00 2D 00 06 00 01")
this.writeIP(InetAddress.getLocalHost().hostName)//? todo 这随便扔的
this.writeIP(InetAddress.getLocalHost().hostAddress)
return super.toByteArray()
}
......@@ -173,9 +180,6 @@ private fun DataOutputStream.writePart1(qq: Int, password: String, loginTime: In
this.write(token0825)//length
this.writeHex("03 0F")//tag
this.writeDeviceName()
/*易语言源码: PCName就是HostName
PCName = BytesToStr (Ansi转Utf8 (取主机名 ()))
PCName = 取文本左边 (PCName, 取文本长度 (PCName) - 3)*/
this.writeHex("00 05 00 06 00 02")
this.writeQQ(qq)
......
......@@ -12,7 +12,7 @@ import net.mamoe.mirai.util.toUHexString
import java.io.IOException
/**
* The packet to touch server.
* The packet to touch server, that is, to start the connection to the server.
*
* @author Him188moe
*/
......
......@@ -20,22 +20,22 @@ class ServerLoginResponseResendPacket(input: DataInputStream, val flag: Flag) :
OTHER,
}
lateinit var _0836_tlv0006_encr: ByteArray;
lateinit var _0836_tlv0006_encr: ByteArray;//120bytes
var tokenUnknown: ByteArray? = null
lateinit var tgtgtKey: ByteArray
lateinit var tgtgtKey: ByteArray//16bytes
@TestedSuccessfully
override fun decode() {
this.input.skip(5)
tgtgtKey = this.input.readNBytes(16)//22
println(tgtgtKey.toUHexString())
this.input.skip(2)//25
//this.input.skip(2)//25
this.input.goto(25)
_0836_tlv0006_encr = this.input.readNBytes(120)
when (flag) {
Flag.`08 36 31 03` -> {
tokenUnknown = this.input.goto(153).readNBytes(56)
println(tokenUnknown!!.toUHexString())
//println(tokenUnknown!!.toUHexString())
}
Flag.OTHER -> {
......
......@@ -6,6 +6,7 @@ import net.mamoe.mirai.network.packet.server.goto
import net.mamoe.mirai.network.packet.server.readNBytes
import net.mamoe.mirai.network.packet.server.readVarString
import net.mamoe.mirai.util.TEACryptor
import net.mamoe.mirai.util.TestedSuccessfully
import net.mamoe.mirai.util.hexToBytes
import net.mamoe.mirai.util.toUHexString
import java.io.DataInputStream
......@@ -13,10 +14,8 @@ import java.io.DataInputStream
/**
* @author NaturalHG
*/
class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLength: Int) : ServerPacket(input) {
class ServerLoginResponseSuccessPacket(input: DataInputStream) : ServerPacket(input) {
lateinit var _0828_rec_decr_key: ByteArray//16 bytes|
var age: Short = 0
var gender: Int = 0//from 1byte
lateinit var nick: String
lateinit var token38: ByteArray
......@@ -24,6 +23,7 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen
lateinit var encryptionKey: ByteArray
@TestedSuccessfully
@ExperimentalUnsignedTypes
override fun decode() {
//测试完成 @NaturalHG
......@@ -113,9 +113,9 @@ class ServerLoginResponseSuccessPacket(input: DataInputStream, val packetDataLen
val nickLength = this.input.goto(624 + msgLength).readByte().toInt()
this.nick = this.input.readVarString(nickLength)
this.age = this.input.goto(packetDataLength - 28).readShort()
//this.age = this.input.goto(packetDataLength - 28).readShort()
this.gender = this.input.goto(packetDataLength - 32).readByte().toInt()
//this.gender = this.input.goto(packetDataLength - 32).readByte().toInt()
}
}
......@@ -131,7 +131,7 @@ class ServerLoginResponseSuccessPacketEncrypted(input: DataInputStream) : Server
bytes = bytes.copyOfRange(0, bytes.size - 1)
println(bytes.toUByteArray().toUHexString())
return ServerLoginResponseSuccessPacket(DataInputStream(TEACryptor.decrypt(TEACryptor.decrypt(bytes, Protocol.shareKey.hexToBytes()), tgtgtKey).inputStream()), bytes.size);
return ServerLoginResponseSuccessPacket(DataInputStream(TEACryptor.decrypt(TEACryptor.decrypt(bytes, Protocol.shareKey.hexToBytes()), tgtgtKey).inputStream()));
//TeaDecrypt(取文本中间(data, 43, 取文本长度(data) - 45), m_0828_rec_decr_key)
}
}
......@@ -12,7 +12,7 @@ import java.util.zip.CRC32
*/
object Utils {
fun toHexString(byteArray: ByteArray, separator: String = " "): String = byteArray.joinToString(separator) {
var ret = it.toString(16).toUpperCase();
var ret = it.toString(16).toUpperCase()
if (ret.length == 1) {
ret = "0$ret"
}
......@@ -21,7 +21,7 @@ object Utils {
@ExperimentalUnsignedTypes
fun toHexString(byteArray: UByteArray, separator: String = " "): String = byteArray.joinToString(separator) {
var ret = it.toString(16).toUpperCase();
var ret = it.toString(16).toUpperCase()
if (ret.length == 1) {
ret = "0$ret"
}
......@@ -67,7 +67,7 @@ fun String.hexToByte(): Byte = hexToBytes()[0]
open class ByteArrayDataOutputStream : DataOutputStream(ByteArrayOutputStream()) {
open fun toByteArray(): ByteArray = (out as ByteArrayOutputStream).toByteArray()
@ExperimentalUnsignedTypes
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().let { t(it); return it.toByteArray() }
......@@ -76,7 +76,7 @@ fun lazyEncode(t: (ByteArrayDataOutputStream) -> Unit): ByteArray = ByteArrayDat
fun getRandomKey(length: Int): ByteArray {
val bytes = LinkedList<Byte>()
repeat(length) { bytes.add((Math.random() * 255).toByte()) }
return bytes.toByteArray();
return bytes.toByteArray()
}
fun getCrc32(key: ByteArray): Int = CRC32().let { it.update(key); it.value.toInt() }
......@@ -93,7 +93,7 @@ fun getCrc32(key: ByteArray): Int = CRC32().let { it.update(key); it.value.toInt
*/
@Throws(SecurityException::class)
fun Any.getAllDeclaredFields(): List<Field> {
var clazz: Class<*> = this.javaClass;
var clazz: Class<*> = this.javaClass
val list = LinkedList<Field>()
loop@ do {
......
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