This commit is contained in:
Him188moe 2019-08-19 02:02:27 +08:00
parent 239b9c5ba3
commit e530720f72
9 changed files with 71 additions and 67 deletions

View File

@ -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)

View File

@ -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);

View File

@ -22,6 +22,7 @@ interface Protocol {
"sz8.tencent.com",
"sz9.tencent.com"
).forEach { this.add(InetAddress.getByName(it).hostAddress) }
}
}

View File

@ -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()

View File

@ -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()
}
}

View File

@ -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())

View File

@ -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) {

View File

@ -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()));
}
}

View File

@ -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?){