mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-10 04:00:08 +08:00
update
This commit is contained in:
parent
239b9c5ba3
commit
e530720f72
@ -12,30 +12,8 @@ int| g_server| server ip
|
||||
### Packet data
|
||||
|
||||
skip 14
|
||||
decrypt (read 14..length-1, #redirectionKey)
|
||||
|
||||
type | value
|
||||
---- | ---
|
||||
hex | #head
|
||||
hex | #ver
|
||||
int | 08 25 31 01
|
||||
int | g_qq
|
||||
hex |#fixVer
|
||||
hex |#_0825key
|
||||
?bytes |TEA加密1
|
||||
hex |#tail
|
||||
|
||||
|
||||
TEA加密1, key = #_0825key:
|
||||
|
||||
type | value
|
||||
---- | ---
|
||||
hex | #_0825data0
|
||||
hex | #_0825data2
|
||||
int | g_qq
|
||||
hex | 00 00 00 00 03 09 00 08 00 01
|
||||
int | g_server
|
||||
hex | 00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 00 19
|
||||
hex | #publicKey
|
||||
|
||||
TEA加密以上, key=MD52
|
||||
if (flag == "08 25 31 02")
|
||||
data = decrypt (read 14..length-1, #redirectionKey)
|
||||
else
|
||||
data = decrypt (read 14..length-1, #_0825key)
|
||||
|
||||
|
@ -4,7 +4,6 @@ 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.Protocol;
|
||||
import net.mamoe.mirai.network.Robot;
|
||||
import net.mamoe.mirai.task.MiraiTaskManager;
|
||||
import net.mamoe.mirai.utils.LoggerTextFormat;
|
||||
@ -80,6 +79,7 @@ public class MiraiServer {
|
||||
}else {
|
||||
this.setting = new MiraiConfig(setting);
|
||||
}
|
||||
getLogger().info("Success");
|
||||
|
||||
/*
|
||||
MiraiMapSection qqs = this.setting.getMapSection("qq");
|
||||
@ -97,7 +97,8 @@ public class MiraiServer {
|
||||
|
||||
Robot robot = new Robot(1994701021, "xiaoqqq");
|
||||
try {
|
||||
robot.connect(Protocol.Companion.getSERVER_IP().get(3), 8000);
|
||||
//System.out.println(Protocol.Companion.getSERVER_IP().toString());
|
||||
robot.connect("125.39.132.242", 8000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
|
@ -22,6 +22,7 @@ interface Protocol {
|
||||
"sz8.tencent.com",
|
||||
"sz9.tencent.com"
|
||||
).forEach { this.add(InetAddress.getByName(it).hostAddress) }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,10 +1,7 @@
|
||||
package net.mamoe.mirai.network
|
||||
|
||||
import io.netty.bootstrap.Bootstrap
|
||||
import io.netty.channel.Channel
|
||||
import io.netty.channel.ChannelHandlerContext
|
||||
import io.netty.channel.ChannelInitializer
|
||||
import io.netty.channel.SimpleChannelInboundHandler
|
||||
import io.netty.channel.*
|
||||
import io.netty.channel.nio.NioEventLoopGroup
|
||||
import io.netty.channel.socket.SocketChannel
|
||||
import io.netty.channel.socket.nio.NioSocketChannel
|
||||
@ -34,7 +31,12 @@ class Robot(val number: Int, private val password: String) {
|
||||
|
||||
private var channel: Channel? = null
|
||||
|
||||
private lateinit var serverIP: String;
|
||||
private var serverIP: String = ""
|
||||
set(value) {
|
||||
serverAddress = InetSocketAddress(value, 8000)
|
||||
}
|
||||
|
||||
private lateinit var serverAddress: InetSocketAddress;
|
||||
|
||||
private lateinit var token00BA: ByteArray
|
||||
private lateinit var token0825: ByteArray
|
||||
@ -59,6 +61,7 @@ class Robot(val number: Int, private val password: String) {
|
||||
@ExperimentalUnsignedTypes
|
||||
private fun onPacketReceived(packet: ServerPacket) {
|
||||
packet.decode()
|
||||
println(packet.toString())
|
||||
when (packet) {
|
||||
is ServerTouchResponsePacket -> {
|
||||
if (packet.serverIP != null) {//redirection
|
||||
@ -120,9 +123,16 @@ class Robot(val number: Int, private val password: String) {
|
||||
|
||||
@ExperimentalUnsignedTypes
|
||||
private fun sendPacket(packet: ClientPacket) {
|
||||
packet.encode()
|
||||
try {
|
||||
packet.encode()
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
packet.writeHex(Protocol.tail)
|
||||
channel!!.writeAndFlush(DatagramPacket(packet.toByteArray()))
|
||||
println("Packet sent: $packet")
|
||||
val p = DatagramPacket(packet.toByteArray());
|
||||
p.socketAddress = this.serverAddress
|
||||
channel!!.writeAndFlush(p)
|
||||
}
|
||||
|
||||
companion object {
|
||||
@ -139,11 +149,11 @@ class Robot(val number: Int, private val password: String) {
|
||||
|
||||
b.group(group)
|
||||
.channel(NioSocketChannel::class.java)
|
||||
.remoteAddress(InetSocketAddress(ip, port))
|
||||
.remoteAddress(InetSocketAddress("0.0.0.0", 62154))
|
||||
.option(ChannelOption.SO_BROADCAST, true)
|
||||
.handler(object : ChannelInitializer<SocketChannel>() {
|
||||
@Throws(Exception::class)
|
||||
override fun initChannel(ch: SocketChannel) {
|
||||
println("connected server...")
|
||||
ch.pipeline().addLast(ByteArrayEncoder())
|
||||
ch.pipeline().addLast(ByteArrayDecoder())
|
||||
ch.pipeline().addLast(object : SimpleChannelInboundHandler<ByteArray>() {
|
||||
@ -169,11 +179,12 @@ class Robot(val number: Int, private val password: String) {
|
||||
MiraiLogger.catching(cause)
|
||||
}
|
||||
})
|
||||
sendPacket(ClientTouchPacket())
|
||||
}
|
||||
})
|
||||
|
||||
channel = b.connect().sync().channel()
|
||||
|
||||
sendPacket(ClientTouchPacket(this@Robot.number, serverIP))
|
||||
channel!!.closeFuture().sync()
|
||||
} finally {
|
||||
group.shutdownGracefully().sync()
|
||||
|
@ -1,6 +1,7 @@
|
||||
package net.mamoe.mirai.network.packet.client
|
||||
|
||||
import lombok.Getter
|
||||
import lombok.ToString
|
||||
import net.mamoe.mirai.network.Protocol
|
||||
import net.mamoe.mirai.network.packet.Packet
|
||||
import net.mamoe.mirai.network.packet.PacketId
|
||||
@ -13,6 +14,7 @@ import java.security.MessageDigest
|
||||
/**
|
||||
* @author Him188moe
|
||||
*/
|
||||
@ToString
|
||||
@ExperimentalUnsignedTypes
|
||||
abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
|
||||
@Getter
|
||||
@ -51,7 +53,6 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
|
||||
encode()
|
||||
return toByteArray()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -18,10 +18,8 @@ import java.io.IOException
|
||||
*/
|
||||
@ExperimentalUnsignedTypes
|
||||
@PacketId("08 25 31 01")
|
||||
class ClientTouchPacket : ClientPacket() {
|
||||
class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() {
|
||||
//已经完成测试
|
||||
var qq: Int = 0
|
||||
|
||||
@ExperimentalUnsignedTypes
|
||||
@Throws(IOException::class)
|
||||
override fun encode() {
|
||||
@ -32,8 +30,6 @@ class ClientTouchPacket : ClientPacket() {
|
||||
this.writeHex(Protocol.fixVer)
|
||||
this.writeHex(Protocol._0825key)
|
||||
|
||||
|
||||
|
||||
this.write(TEACryptor.CRYPTOR_0825KEY.encrypt(object : ByteArrayDataOutputStream() {
|
||||
@Throws(IOException::class)
|
||||
override fun toByteArray(): ByteArray {
|
||||
@ -42,22 +38,24 @@ class ClientTouchPacket : ClientPacket() {
|
||||
this.writeQQ(qq)
|
||||
this.writeHex("00 00 00 00 03 09 00 08 00 01")
|
||||
//this.writeIP("192.168.1.1");
|
||||
this.writeIP(Protocol.SERVER_IP[2]);
|
||||
this.writeIP(serverIp);
|
||||
//this.writeIP("123456789")
|
||||
this.writeHex("00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 00 19")
|
||||
this.writeHex(Protocol.publicKey)
|
||||
println(this.toUByteArray().toHexString(" "))
|
||||
return super.toByteArray()
|
||||
}
|
||||
}.toByteArray()))
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return this.javaClass.simpleName + this.javaClass.declaredFields.joinToString(", ", "{", "}") { it.name + "=" + it.get(this) }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ExperimentalUnsignedTypes
|
||||
fun main() {
|
||||
val pk = ClientTouchPacket()
|
||||
pk.qq = 1994701021
|
||||
val pk = ClientTouchPacket(1994701021, "123.123.123.123")
|
||||
pk.encode()
|
||||
pk.writeHex(Protocol.tail)
|
||||
//println("pk.toByteArray() = " + pk.toUByteArray().contentToString())
|
||||
|
@ -3,6 +3,7 @@ package net.mamoe.mirai.network.packet.server
|
||||
import net.mamoe.mirai.network.packet.Packet
|
||||
import net.mamoe.mirai.network.packet.server.login.*
|
||||
import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
|
||||
import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
|
||||
import net.mamoe.mirai.util.toHexString
|
||||
import java.io.DataInputStream
|
||||
|
||||
@ -23,8 +24,8 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
|
||||
val idBytes = stream.readUntil(11)
|
||||
|
||||
return when (val flag = idBytes.joinToString("") { it.toString(16) }) {
|
||||
"08 25 31 01" -> ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, stream)
|
||||
"08 25 31 02" -> ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_02, stream)
|
||||
"08 25 31 01" -> ServerTouchResponsePacketEncrypted(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, stream)
|
||||
"08 25 31 02" -> ServerTouchResponsePacketEncrypted(ServerTouchResponsePacket.Type.TYPE_08_25_31_02, stream)
|
||||
"08 36 31 03", "08 36 31 04", "08 36 31 05", "08 36 31 06" -> {
|
||||
when (bytes.size) {
|
||||
271, 207 -> return ServerLoginResponseResendPacketEncrypted(stream, when (flag) {
|
||||
|
@ -1,7 +1,10 @@
|
||||
package net.mamoe.mirai.network.packet.server.touch
|
||||
|
||||
import lombok.ToString
|
||||
import net.mamoe.mirai.network.Protocol
|
||||
import net.mamoe.mirai.network.packet.server.ServerPacket
|
||||
import net.mamoe.mirai.network.packet.server.readIP
|
||||
import net.mamoe.mirai.util.TEACryptor
|
||||
import net.mamoe.mirai.util.getRandomKey
|
||||
import java.io.DataInputStream
|
||||
|
||||
@ -13,6 +16,7 @@ import java.io.DataInputStream
|
||||
*
|
||||
* @author Him188moe
|
||||
*/
|
||||
@ToString
|
||||
class ServerTouchResponsePacket(private val type: Type, inputStream: DataInputStream) : ServerPacket(inputStream) {
|
||||
var serverIP: String? = null;
|
||||
|
||||
@ -28,25 +32,18 @@ class ServerTouchResponsePacket(private val type: Type, inputStream: DataInputSt
|
||||
|
||||
@ExperimentalUnsignedTypes
|
||||
override fun decode() {
|
||||
/*input.skip(43 - 11)//todo: check
|
||||
val data = DataInputStream(TEACryptor.decrypt(input.readAllBytes().let { it.copyOfRange(0, it.size - 2) }, when (type) {//todo: check array range
|
||||
Type.TYPE_08_25_31_01 -> Protocol.redirectionKey.toByteArray()
|
||||
Type.TYPE_08_25_31_02 -> Protocol._0825key.toByteArray()
|
||||
}).inputStream());*/
|
||||
val data = input;
|
||||
|
||||
when (data.readByte().toInt()) {
|
||||
when (input.readByte().toInt()) {
|
||||
0xFE -> {
|
||||
data.skip(94)
|
||||
serverIP = data.readIP()
|
||||
input.skip(94)
|
||||
serverIP = input.readIP()
|
||||
}
|
||||
0X00 -> {
|
||||
data.skip(4)
|
||||
token = data.readNBytes(56)
|
||||
data.skip(6)
|
||||
input.skip(4)
|
||||
token = input.readNBytes(56)
|
||||
input.skip(6)
|
||||
|
||||
loginTime = data.readInt()
|
||||
loginIP = data.readIP()
|
||||
loginTime = input.readInt()
|
||||
loginIP = input.readIP()
|
||||
tgtgtKey = getRandomKey(16)
|
||||
}
|
||||
|
||||
@ -55,4 +52,18 @@ class ServerTouchResponsePacket(private val type: Type, inputStream: DataInputSt
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ServerTouchResponsePacketEncrypted(private val type: ServerTouchResponsePacket.Type, inputStream: DataInputStream) : ServerPacket(inputStream) {
|
||||
override fun decode() {
|
||||
|
||||
}
|
||||
|
||||
fun decrypt(): ServerTouchResponsePacket {
|
||||
input.skip(14)
|
||||
return ServerTouchResponsePacket(type, DataInputStream(TEACryptor.decrypt(input.readAllBytes().let { it.copyOfRange(0, it.size - 1) }, when (type) {
|
||||
ServerTouchResponsePacket.Type.TYPE_08_25_31_01 -> Protocol.redirectionKey.toByteArray()
|
||||
ServerTouchResponsePacket.Type.TYPE_08_25_31_02 -> Protocol._0825key.toByteArray()
|
||||
}).inputStream()));
|
||||
}
|
||||
}
|
@ -12,9 +12,11 @@ object MiraiLogger{
|
||||
}
|
||||
|
||||
fun catching(e:Throwable){
|
||||
e.printStackTrace()
|
||||
/*
|
||||
this.print(e.message)
|
||||
this.print(e.localizedMessage)
|
||||
this.print(e.cause.toString())
|
||||
this.print(e.cause.toString())*/
|
||||
}
|
||||
|
||||
private fun print(value:String?){
|
||||
|
Loading…
Reference in New Issue
Block a user