Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
Mirai
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
Mirai
Commits
4508c662
Commit
4508c662
authored
Aug 31, 2019
by
Him188moe
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Session finished
parent
8606c4c7
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
332 additions
and
49 deletions
+332
-49
mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
+5
-2
mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
.../main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
+44
-10
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/ClientLoginStatusPacket.kt
.../network/packet/client/session/ClientLoginStatusPacket.kt
+29
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/ClientSKeyRequestPacket.kt
.../network/packet/client/session/ClientSKeyRequestPacket.kt
+25
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/Handshake.kt
...et/mamoe/mirai/network/packet/client/session/Handshake.kt
+34
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientHeartbeatPacket.kt
...irai/network/packet/client/touch/ClientHeartbeatPacket.kt
+9
-11
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
...ava/net/mamoe/mirai/network/packet/server/ServerPacket.kt
+18
-8
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponsePasswordVerifiedPacket.kt
...server/login/ServerLoginResponsePasswordVerifiedPacket.kt
+0
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseVerificationCodePacket.kt
...server/login/ServerLoginResponseVerificationCodePacket.kt
+1
-3
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerLoginSuccessPacket.kt
...etwork/packet/server/security/ServerLoginSuccessPacket.kt
+13
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSKeyResponsePacket.kt
...etwork/packet/server/security/ServerSKeyResponsePacket.kt
+35
-0
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacket.kt
.../packet/server/security/ServerSessionKeyResponsePacket.kt
+71
-0
mirai-core/src/main/java/net/mamoe/mirai/task/MiraiTaskManager.java
.../src/main/java/net/mamoe/mirai/task/MiraiTaskManager.java
+12
-13
mirai-core/src/main/java/net/mamoe/mirai/util/ClientLoginStatus.java
...src/main/java/net/mamoe/mirai/util/ClientLoginStatus.java
+15
-0
mirai-core/src/main/java/net/mamoe/mirai/util/DebugLogger.kt
mirai-core/src/main/java/net/mamoe/mirai/util/DebugLogger.kt
+2
-2
mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt
mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt
+19
-0
No files found.
mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
View file @
4508c662
...
...
@@ -21,9 +21,12 @@ import java.util.LinkedList;
import
java.util.Scanner
;
public
class
MiraiServer
{
@Getter
private
static
MiraiServer
instance
;
public
static
MiraiServer
getInstance
()
{
return
instance
;
}
//mirai version
private
final
static
String
MIRAI_VERSION
=
"1.0.0"
;
...
...
@@ -35,7 +38,7 @@ public class MiraiServer {
private
boolean
unix
;
@Getter
//file path
p
rivate
File
parentFolder
;
p
ublic
File
parentFolder
;
@Getter
MiraiEventManager
eventManager
;
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/RobotNetworkHandler.kt
View file @
4508c662
package
net.mamoe.mirai.network
import
io.netty.channel.Channel
import
net.mamoe.mirai.MiraiServer
import
net.mamoe.mirai.network.packet.client.ClientPacket
import
net.mamoe.mirai.network.packet.client.login.*
import
net.mamoe.mirai.network.packet.client.session.ClientHandshake1Packet
import
net.mamoe.mirai.network.packet.client.session.ClientLoginStatusPacket
import
net.mamoe.mirai.network.packet.client.session.ClientSKeyRequestPacket
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
import
net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePacketEncrypted
import
net.mamoe.mirai.network.packet.server.security.*
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
import
net.mamoe.mirai.task.MiraiTaskManager
import
net.mamoe.mirai.util.*
import
net.mamoe.mirai.utils.MiraiLogger
import
java.io.ByteArrayInputStream
import
java.io.FileOutputStream
import
java.net.DatagramPacket
import
java.net.DatagramSocket
import
java.net.InetSocketAddress
...
...
@@ -24,6 +30,7 @@ import java.util.*
* @author Him188moe
*/
class
RobotNetworkHandler
(
val
number
:
Int
,
private
val
password
:
String
)
{
private
var
sequence
:
Int
=
0
private
var
channel
:
Channel
?
=
null
...
...
@@ -36,16 +43,23 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
private
lateinit
var
serverAddress
:
InetSocketAddress
private
lateinit
var
token00BA
:
ByteArray
private
lateinit
var
token00BA
:
ByteArray
//这些数据全部是login用的
private
lateinit
var
token0825
:
ByteArray
private
var
loginTime
:
Int
=
0
private
lateinit
var
loginIP
:
String
private
var
tgtgtKey
:
ByteArray
?
=
null
private
var
tlv0105
:
ByteArray
private
lateinit
var
_0828_rec_decr_key
:
ByteArray
private
lateinit
var
sessionKey
:
ByteArray
//这两个是登录成功后得到的
private
lateinit
var
sKey
:
String
/**
*
Kind of key, similar to sessionKey
*
Used to access web API(for friends list etc.)
*/
private
var
tlv0105
:
ByteArray
private
lateinit
var
cookies
:
String
private
var
gtk
:
Int
=
0
init
{
tlv0105
=
lazyEncode
{
...
...
@@ -57,11 +71,6 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
}
}
private
lateinit
var
sessionKey
:
ByteArray
/**
* Kind of key, similar to sessionKey
*/
private
lateinit
var
_0828_rec_decr_key
:
ByteArray
@ExperimentalUnsignedTypes
private
var
md5_32
:
ByteArray
=
getRandomKey
(
32
)
...
...
@@ -100,6 +109,12 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
sendPacket
(
ClientLoginVerificationCodePacket
(
this
.
number
,
this
.
token0825
,
this
.
sequence
,
this
.
token00BA
))
}
with
(
MiraiServer
.
getInstance
().
parentFolder
+
"verifyCode.png"
)
{
ByteArrayInputStream
(
packet
.
verifyCode
).
transferTo
(
FileOutputStream
(
this
))
println
(
"验证码已写入到 "
+
this
.
path
)
}
}
is
ServerLoginResponseSuccessPacket
->
{
...
...
@@ -148,12 +163,30 @@ class RobotNetworkHandler(val number: Int, private val password: String) {
is
ServerSessionKeyResponsePacket
->
{
this
.
sessionKey
=
packet
.
sessionKey
this
.
tlv0105
=
packet
.
tlv0105
sendPacket
(
ClientLoginStatusPacket
(
this
.
number
,
sessionKey
,
ClientLoginStatus
.
ONLINE
))
}
is
ServerLoginSuccessPacket
->
{
sendPacket
(
ClientSKeyRequestPacket
(
this
.
number
,
this
.
sessionKey
))
}
is
ServerSKeyResponsePacket
->
{
this
.
sKey
=
packet
.
sKey
this
.
cookies
=
"uin=o"
+
this
.
number
+
";skey="
+
this
.
sKey
+
";"
MiraiTaskManager
.
getInstance
().
repeatingTask
({
TODO
(
"时钟_refreshSkey"
)
},
1800000
)
this
.
gtk
=
getGTK
(
sKey
)
sendPacket
(
ClientHandshake1Packet
(
this
.
number
,
this
.
sessionKey
))
}
is
ServerLoginResponseVerificationCodePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
())
is
ServerLoginResponseResendPacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
tgtgtKey
!!
))
is
ServerLoginResponseSuccessPacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
tgtgtKey
!!
))
is
ServerSessionKeyResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
_0828_rec_decr_key
))
is
ServerTouchResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
())
is
ServerSKeyResponsePacketEncrypted
->
onPacketReceived
(
packet
.
decrypt
(
this
.
sessionKey
))
else
->
throw
IllegalArgumentException
(
packet
.
toString
())
}
...
...
@@ -328,3 +361,4 @@ private lateinit var ctx: ChannelHandlerContext
}
}*/
}
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/ClientLoginStatusPacket.kt
0 → 100644
View file @
4508c662
package
net.mamoe.mirai.network.packet.client.session
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.PacketId
import
net.mamoe.mirai.network.packet.client.*
import
net.mamoe.mirai.util.ClientLoginStatus
/**
* @author Him188moe
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 EC"
)
class
ClientLoginStatusPacket
(
private
val
qq
:
Int
,
private
val
sessionKey
:
ByteArray
,
private
val
loginStatus
:
ClientLoginStatus
)
:
ClientPacket
()
{
override
fun
encode
()
{
this
.
writeRandom
(
2
)
//part of packet id
this
.
writeQQ
(
qq
)
this
.
writeHex
(
Protocol
.
_fixVer
)
this
.
encryptAndWrite
(
sessionKey
)
{
it
.
writeHex
(
"01 00"
)
it
.
writeByte
(
loginStatus
.
id
)
it
.
writeHex
(
"00 01 00 01 00 04 00 00 00 00"
)
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/ClientSKeyRequestPacket.kt
0 → 100644
View file @
4508c662
package
net.mamoe.mirai.network.packet.client.session
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.PacketId
import
net.mamoe.mirai.network.packet.client.*
/**
* @author Him188moe
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 1D"
)
class
ClientSKeyRequestPacket
(
private
val
qq
:
Int
,
private
val
sessionKey
:
ByteArray
)
:
ClientPacket
()
{
override
fun
encode
()
{
this
.
writeRandom
(
2
)
//part of packet id
this
.
writeQQ
(
qq
)
this
.
writeHex
(
Protocol
.
_fixVer
)
this
.
encryptAndWrite
(
sessionKey
)
{
it
.
writeHex
(
"33 00 05 00 08 74 2E 71 71 2E 63 6F 6D 00 0A 71 75 6E 2E 71 71 2E 63 6F 6D 00 0C 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 00 0C 6A 75 62 61 6F 2E 71 71 2E 63 6F 6D 00 09 6B 65 2E 71 71 2E 63 6F 6D"
)
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/session/Handshake.kt
0 → 100644
View file @
4508c662
package
net.mamoe.mirai.network.packet.client.session
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.PacketId
import
net.mamoe.mirai.network.packet.client.*
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
java.io.DataInputStream
/**
* @author Him188moe
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 5C"
)
class
ClientHandshake1Packet
(
val
qq
:
Int
,
val
sessionKey
:
ByteArray
)
:
ClientPacket
()
{
override
fun
encode
()
{
this
.
writeRandom
(
2
)
//part of packet id
this
.
writeQQ
(
qq
)
this
.
writeHex
(
Protocol
.
_fixVer
)
this
.
encryptAndWrite
(
sessionKey
)
{
it
.
writeByte
(
0
x88
)
it
.
writeQQ
(
qq
)
it
.
writeByte
(
0
x00
)
}
}
}
class
ServerHandshake1ResponsePacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
override
fun
decode
()
{
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/touch/ClientHeartbeatPacket.kt
View file @
4508c662
...
...
@@ -2,27 +2,25 @@ package net.mamoe.mirai.network.packet.client.touch
import
net.mamoe.mirai.network.Protocol
import
net.mamoe.mirai.network.packet.PacketId
import
net.mamoe.mirai.network.packet.client.ClientPacket
import
net.mamoe.mirai.network.packet.client.writeHex
import
net.mamoe.mirai.network.packet.client.writeQQ
import
net.mamoe.mirai.network.packet.client.writeRandom
import
net.mamoe.mirai.util.TEACryptor
import
net.mamoe.mirai.network.packet.client.*
import
java.io.IOException
/**
* @author Him188moe
*/
@ExperimentalUnsignedTypes
@PacketId
(
"00 58"
)
//todo check
class
ClientHeartbeatPacket
:
ClientPacket
()
{
var
qq
:
Int
=
0
var
sessionKey
:
ByteArray
?
=
null
//登录后获得
@PacketId
(
"00 58"
)
class
ClientHeartbeatPacket
(
private
val
qq
:
Int
,
private
val
sessionKey
:
ByteArray
)
:
ClientPacket
()
{
@Throws
(
IOException
::
class
)
override
fun
encode
()
{
this
.
writeRandom
(
2
)
this
.
writeQQ
(
qq
)
this
.
writeHex
(
Protocol
.
fixVer
)
this
.
write
(
TEACryptor
.
encrypt
(
byteArrayOf
(
0
x00
,
0
x01
,
0
x00
,
0
x01
),
sessionKey
))
this
.
encryptAndWrite
(
sessionKey
)
{
it
.
writeHex
(
"00 01 00 01"
)
}
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
View file @
4508c662
...
...
@@ -3,6 +3,9 @@ package net.mamoe.mirai.network.packet.server
import
net.mamoe.mirai.network.packet.Packet
import
net.mamoe.mirai.network.packet.client.toHexString
import
net.mamoe.mirai.network.packet.server.login.*
import
net.mamoe.mirai.network.packet.server.security.ServerLoginSuccessPacket
import
net.mamoe.mirai.network.packet.server.security.ServerSKeyResponsePacketEncrypted
import
net.mamoe.mirai.network.packet.server.security.ServerSessionKeyResponsePacketEncrypted
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
import
net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
import
net.mamoe.mirai.util.getAllDeclaredFields
...
...
@@ -28,7 +31,9 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
return
when
(
val
idHex
=
stream
.
readInt
().
toHexString
(
" "
))
{
"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
(
idHex
)
{
...
...
@@ -37,7 +42,7 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
println
(
"flag=$idHex"
);
ServerLoginResponseResendPacket
.
Flag
.
OTHER
}
})
871
->
return
ServerLoginResponseVerificationCodePacket
(
stream
,
bytes
.
size
)
871
->
return
ServerLoginResponseVerificationCodePacket
Encrypted
(
stream
)
}
if
(
bytes
.
size
>
700
)
{
...
...
@@ -53,14 +58,23 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
359
->
ServerLoginResponseFailedPacket
.
State
.
TAKEN_BACK
//unknown
63
->
throw
IllegalArgumentException
(
bytes
.
size
.
toString
())
//可能是已经完成登录, 服务器拒绝第二次登录
351
->
throw
IllegalArgumentException
(
bytes
.
size
.
toString
()
)
63
->
throw
IllegalArgumentException
(
bytes
.
size
.
toString
()
+
" (Already logged in)"
)
//可能是已经完成登录, 服务器拒绝第二次登录
351
->
throw
IllegalArgumentException
(
bytes
.
size
.
toString
()
+
" (Illegal package data)"
)
//包数据有误
else
->
throw
IllegalArgumentException
(
bytes
.
size
.
toString
())
},
stream
)
}
else
->
throw
IllegalArgumentException
(
idHex
)
"08 28 04 34"
->
ServerSessionKeyResponsePacketEncrypted
(
stream
)
else
->
when
(
idHex
.
substring
(
0
,
2
))
{
"00 EC"
->
ServerLoginSuccessPacket
(
stream
)
"00 1D"
->
ServerSKeyResponsePacketEncrypted
(
stream
)
// "00 5C" ->
else
->
throw
IllegalArgumentException
(
idHex
)
}
}
}
}
...
...
@@ -79,10 +93,6 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
}
fun
DataInputStream
.
skipUntil
(
byte
:
Byte
)
{
while
(
readByte
()
!=
byte
);
}
fun
DataInputStream
.
readUntil
(
byte
:
Byte
):
ByteArray
{
var
buff
=
byteArrayOf
()
var
b
:
Byte
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponse
Success
Packet.kt
→
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponse
PasswordVerified
Packet.kt
View file @
4508c662
File moved
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/login/ServerLoginResponseVerificationCodePacket.kt
View file @
4508c662
...
...
@@ -4,7 +4,6 @@ import net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.dataInputStream
import
net.mamoe.mirai.network.packet.server.goto
import
net.mamoe.mirai.util.TEACryptor
import
net.mamoe.mirai.util.toUHexString
import
java.io.DataInputStream
/**
...
...
@@ -30,8 +29,7 @@ class ServerLoginResponseVerificationCodePacket(input: DataInputStream, val pack
this
.
input
.
skip
(
1
)
val
b
=
this
.
input
.
readByte
()
println
(
b
.
toUHexString
())
this
.
unknownBoolean
=
this
.
input
.
readByte
().
toInt
()
==
1
this
.
token00BA
=
this
.
input
.
goto
(
packetLength
-
60
).
readNBytes
(
40
)
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerLoginSuccessPacket.kt
0 → 100644
View file @
4508c662
package
net.mamoe.mirai.network.packet.server.security
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
java.io.DataInputStream
/**
* @author Him188moe
*/
class
ServerLoginSuccessPacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
override
fun
decode
()
{
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSKeyResponsePacket.kt
0 → 100644
View file @
4508c662
package
net.mamoe.mirai.network.packet.server.security
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.dataInputStream
import
net.mamoe.mirai.network.packet.server.goto
import
net.mamoe.mirai.util.TEACryptor
import
java.io.DataInputStream
/**
* @author Him188moe
*/
class
ServerSKeyResponsePacket
(
input
:
DataInputStream
)
:
ServerPacket
(
input
)
{
lateinit
var
sKey
:
String
override
fun
decode
()
{
this
.
sKey
=
String
(
this
.
input
.
goto
(
4
).
readNBytes
(
10
))
}
}
/**
* Encrypted using [0828_rec_decr_key], decrypting in RobotNetworkHandler
*
* @author Him188moe
*/
class
ServerSKeyResponsePacketEncrypted
(
inputStream
:
DataInputStream
)
:
ServerPacket
(
inputStream
)
{
override
fun
decode
()
{
}
fun
decrypt
(
sessionKey
:
ByteArray
):
ServerSKeyResponsePacket
{
this
.
input
goto
14
val
data
=
this
.
input
.
readAllBytes
().
let
{
it
.
copyOfRange
(
0
,
it
.
size
-
1
)
}
return
ServerSKeyResponsePacket
(
TEACryptor
.
decrypt
(
data
,
sessionKey
).
dataInputStream
());
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacket
Encrypted
.kt
→
mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/security/ServerSessionKeyResponsePacket.kt
View file @
4508c662
package
net.mamoe.mirai.network.packet.server.security
import
net.mamoe.mirai.network.packet.client.writeHex
import
net.mamoe.mirai.network.packet.server.ServerPacket
import
net.mamoe.mirai.network.packet.server.dataInputStream
import
net.mamoe.mirai.network.packet.server.goto
import
net.mamoe.mirai.util.TEACryptor
import
net.mamoe.mirai.util.lazyEncode
import
java.io.DataInputStream
/**
...
...
@@ -10,34 +13,48 @@ import java.io.DataInputStream
*
* @author Him188moe
*/
class
ServerSessionKeyResponsePacket
(
inputStream
:
DataInputStream
)
:
ServerPacket
(
inputStream
)
{
class
ServerSessionKeyResponsePacket
(
inputStream
:
DataInputStream
,
val
dataLength
:
Int
)
:
ServerPacket
(
inputStream
)
{
lateinit
var
sessionKey
:
ByteArray
lateinit
var
tlv0105
:
ByteArray
override
fun
decode
()
{
var
data
=
this
.
input
.
readAllBytes
();
val
input
=
data
.
dataInputStream
()
sessionKey
=
when
(
data
.
size
)
{
@ExperimentalUnsignedTypes
override
fun
decode
()
{
when
(
dataLength
)
{
407
->
{
input
.
skip
(
25
)
input
.
readNBytes
(
16
)
input
goto
25
sessionKey
=
input
.
readNBytes
(
16
)
}
439
,
527
->
{
input
.
skip
(
63
)
input
.
readNBytes
(
16
)
439
->
{
input
.
goto
(
63
)
sessionKey
=
input
.
readNBytes
(
16
)
}
else
->
throw
IllegalStateException
()
512
,
527
->
{
input
.
goto
(
63
)
sessionKey
=
input
.
readNBytes
(
16
)
tlv0105
=
lazyEncode
{
it
.
writeHex
(
"01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00"
)
input
.
goto
(
dataLength
-
122
)
it
.
write
(
input
.
readNBytes
(
56
))
it
.
writeHex
(
"00 40 02 02 03 3C 01 03 00 00"
)
input
.
goto
(
dataLength
-
55
)
it
.
write
(
input
.
readNBytes
(
56
))
}
//todo 这个 tlv0105似乎可以保存起来然后下次登录时使用.
}
else
->
throw
IllegalArgumentException
(
dataLength
.
toString
())
}
//tlv0105 = "01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00" + 取文本中间(data, 取文本长度(data) - 367, 167) + “00 40 02 02 03 3C 01 03 00 00 ” + 取文本中间 (data, 取文本长度 (data) - 166, 167)
}
}
/**
* Encrypted using [
]
0828_rec_decr_key], decrypting in RobotNetworkHandler
* Encrypted using [0828_rec_decr_key], decrypting in RobotNetworkHandler
*
* @author Him188moe
*/
...
...
@@ -46,9 +63,9 @@ class ServerSessionKeyResponsePacketEncrypted(inputStream: DataInputStream) : Se
}
fun
decrypt
(
_0828_rec_decr_key
:
ByteArray
):
ServerSessionKeyResponsePacket
{
//todo test
this
.
input
.
skip
(
7
)
return
ServerSessionKeyResponsePacket
(
TEACryptor
.
decrypt
(
this
.
input
.
readAllBytes
().
let
{
it
.
copyOfRange
(
0
,
it
.
size
-
1
)
},
_0828_rec_decr_key
).
dataInputStream
());
//TeaDecrypt(取文本中间(data, 43, 取文本长度(data) - 45), m_0828_rec_decr_key)
fun
decrypt
(
_0828_rec_decr_key
:
ByteArray
):
ServerSessionKeyResponsePacket
{
this
.
input
goto
14
val
data
=
this
.
input
.
readAllBytes
().
let
{
it
.
copyOfRange
(
0
,
it
.
size
-
1
)
}
return
ServerSessionKeyResponsePacket
(
TEACryptor
.
decrypt
(
data
,
_0828_rec_decr_key
).
dataInputStream
(),
data
.
size
);
}
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/task/MiraiTaskManager.java
View file @
4508c662
package
net.mamoe.mirai.task
;
import
net.mamoe.mirai.MiraiServer
;
import
net.mamoe.mirai.event.MiraiEventHook
;
import
net.mamoe.mirai.event.events.server.ServerDisableEvent
;
...
...
@@ -90,26 +89,26 @@ public class MiraiTaskManager {
定时任务
*/
public
void
repeatingTask
(
Runnable
runnable
,
long
interval
)
{
this
.
repeatingTask
(
runnable
,
interval
,
MiraiTaskExceptionHandler
.
byDefault
());
public
void
repeatingTask
(
Runnable
runnable
,
long
interval
Millis
)
{
this
.
repeatingTask
(
runnable
,
intervalMillis
,
MiraiTaskExceptionHandler
.
byDefault
());
}
public
void
repeatingTask
(
Runnable
runnable
,
long
interval
,
MiraiTaskExceptionHandler
handler
)
{
this
.
repeatingTask
(
runnable
,
interval
,
a
->
true
,
handler
);
public
void
repeatingTask
(
Runnable
runnable
,
long
interval
Millis
,
MiraiTaskExceptionHandler
handler
)
{
this
.
repeatingTask
(
runnable
,
intervalMillis
,
a
->
true
,
handler
);
}
public
void
repeatingTask
(
Runnable
runnable
,
long
interval
,
int
times
)
{
this
.
repeatingTask
(
runnable
,
interval
,
times
,
MiraiTaskExceptionHandler
.
byDefault
());
public
void
repeatingTask
(
Runnable
runnable
,
long
interval
Millis
,
int
times
)
{
this
.
repeatingTask
(
runnable
,
intervalMillis
,
times
,
MiraiTaskExceptionHandler
.
byDefault
());
}
public
void
repeatingTask
(
Runnable
runnable
,
long
interval
,
int
times
,
MiraiTaskExceptionHandler
handler
)
{
public
void
repeatingTask
(
Runnable
runnable
,
long
interval
Millis
,
int
times
,
MiraiTaskExceptionHandler
handler
)
{
AtomicInteger
integer
=
new
AtomicInteger
(
times
-
1
);
this
.
repeatingTask
(
runnable
,
interval
,
a
->
integer
.
getAndDecrement
()
>
0
,
handler
runnable
,
intervalMillis
,
a
->
integer
.
getAndDecrement
()
>
0
,
handler
);
}
public
<
D
extends
Runnable
>
void
repeatingTask
(
D
runnable
,
long
interval
,
Predicate
<
D
>
shouldContinue
,
MiraiTaskExceptionHandler
handler
)
{
public
<
D
extends
Runnable
>
void
repeatingTask
(
D
runnable
,
long
interval
Millis
,
Predicate
<
D
>
shouldContinue
,
MiraiTaskExceptionHandler
handler
)
{
new
Thread
(()
->
{
do
{
this
.
pool
.
execute
(()
->
{
...
...
@@ -120,7 +119,7 @@ public class MiraiTaskManager {
}
});
try
{
Thread
.
sleep
(
interval
);
Thread
.
sleep
(
interval
Millis
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
...
...
@@ -128,10 +127,10 @@ public class MiraiTaskManager {
}).
start
();
}
public
void
deletingTask
(
Runnable
runnable
,
long
interval
)
{
public
void
deletingTask
(
Runnable
runnable
,
long
interval
Millis
)
{
new
Thread
(()
->
{
try
{
Thread
.
sleep
(
interval
);
Thread
.
sleep
(
interval
Millis
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
...
...
mirai-core/src/main/java/net/mamoe/mirai/util/ClientLoginStatus.java
0 → 100644
View file @
4508c662
package
net.mamoe.mirai.util
;
/**
* @author Him188moe
*/
public
enum
ClientLoginStatus
{
ONLINE
(
0x0A
);
// TODO: 2019/8/31 add more
public
final
int
id
;
//1byte
ClientLoginStatus
(
int
id
)
{
this
.
id
=
id
;
}
}
mirai-core/src/main/java/net/mamoe/mirai/util/DebugLogger.kt
View file @
4508c662
...
...
@@ -24,11 +24,11 @@ fun ByteArray.decryptionDebugLogging() {
}
fun
ServerPacket
.
logging
()
{
DebugLogger
.
buff
.
append
(
this
.
toString
())
DebugLogger
.
buff
.
append
(
this
.
toString
())
.
append
(
"\n"
)
}
@ExperimentalUnsignedTypes
fun
ClientPacket
.
logging
()
{
DebugLogger
.
buff
.
append
(
this
.
toString
())
DebugLogger
.
buff
.
append
(
this
.
toString
())
.
append
(
"\n"
)
}
\ No newline at end of file
mirai-core/src/main/java/net/mamoe/mirai/util/Utils.kt
View file @
4508c662
...
...
@@ -3,6 +3,7 @@ package net.mamoe.mirai.util
import
net.mamoe.mirai.network.Protocol
import
java.io.ByteArrayOutputStream
import
java.io.DataOutputStream
import
java.io.File
import
java.lang.reflect.Field
import
java.util.*
import
java.util.zip.CRC32
...
...
@@ -79,6 +80,24 @@ fun getRandomKey(length: Int): ByteArray {
return
bytes
.
toByteArray
()
}
operator
fun
File
.
plus
(
child
:
String
):
File
=
File
(
this
,
child
)
private
const
val
GTK_BASE_VALUE
:
Int
=
5381
fun
getGTK
(
sKey
:
String
):
Int
{
var
value
=
GTK_BASE_VALUE
for
(
c
in
sKey
.
toCharArray
())
{
value
+=
(
value
shl
5
)
+
c
.
toInt
()
}
value
=
value
and
Int
.
MAX_VALUE
return
value
}
fun
main
()
{
println
(
getGTK
(
"ABCDEFGEFC"
))
}
fun
getCrc32
(
key
:
ByteArray
):
Int
=
CRC32
().
let
{
it
.
update
(
key
);
it
.
value
.
toInt
()
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment