Commit e530720f authored by Him188moe's avatar Him188moe

update

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