添加客户端机器人

This commit is contained in:
flswld
2023-02-13 21:08:06 +08:00
parent 2f0f06f2ab
commit f8f55be5bd
11 changed files with 244 additions and 892 deletions

View File

@@ -317,9 +317,9 @@ func (k *KcpConnectManager) recvHandle(session *Session) {
}
recvData := recvBuf[:recvLen]
kcpMsgList := make([]*KcpMsg, 0)
k.decodeBinToPayload(recvData, &dataBuf, convId, &kcpMsgList, session.xorKey)
DecodeBinToPayload(recvData, &dataBuf, convId, &kcpMsgList, session.xorKey)
for _, v := range kcpMsgList {
protoMsgList := k.protoDecode(v)
protoMsgList := ProtoDecode(v, k.serverCmdProtoMap, k.clientCmdProtoMap)
for _, vv := range protoMsgList {
k.recvMsgHandle(vv, session)
}
@@ -341,12 +341,12 @@ func (k *KcpConnectManager) sendHandle(session *Session) {
k.closeKcpConn(session, kcp.EnetServerKick)
break
}
kcpMsg := k.protoEncode(protoMsg)
kcpMsg := ProtoEncode(protoMsg, k.serverCmdProtoMap, k.clientCmdProtoMap)
if kcpMsg == nil {
logger.Error("decode kcp msg is nil, convId: %v", convId)
continue
}
bin := k.encodePayloadToBin(kcpMsg, session.xorKey)
bin := EncodePayloadToBin(kcpMsg, session.xorKey)
_ = conn.SetWriteDeadline(time.Now().Add(time.Second * ConnSendTimeout))
_, err := conn.Write(bin)
if err != nil {

View File

@@ -32,13 +32,13 @@ type KcpMsg struct {
ProtoData []byte
}
func (k *KcpConnectManager) decodeBinToPayload(data []byte, dataBuf *[]byte, convId uint64, kcpMsgList *[]*KcpMsg, xorKey []byte) {
func DecodeBinToPayload(data []byte, dataBuf *[]byte, convId uint64, kcpMsgList *[]*KcpMsg, xorKey []byte) {
// xor解密
endec.Xor(data, xorKey)
k.decodeLoop(data, dataBuf, convId, kcpMsgList)
DecodeLoop(data, dataBuf, convId, kcpMsgList)
}
func (k *KcpConnectManager) decodeLoop(data []byte, dataBuf *[]byte, convId uint64, kcpMsgList *[]*KcpMsg) {
func DecodeLoop(data []byte, dataBuf *[]byte, convId uint64, kcpMsgList *[]*KcpMsg) {
if len(*dataBuf) != 0 {
// 取出之前的缓冲区数据
data = append(*dataBuf, data...)
@@ -93,11 +93,11 @@ func (k *KcpConnectManager) decodeLoop(data []byte, dataBuf *[]byte, convId uint
*kcpMsgList = append(*kcpMsgList, kcpMsg)
// 递归解析
if haveMorePacket {
k.decodeLoop(data[packetLen:], dataBuf, convId, kcpMsgList)
DecodeLoop(data[packetLen:], dataBuf, convId, kcpMsgList)
}
}
func (k *KcpConnectManager) encodePayloadToBin(kcpMsg *KcpMsg, xorKey []byte) (bin []byte) {
func EncodePayloadToBin(kcpMsg *KcpMsg, xorKey []byte) (bin []byte) {
if kcpMsg.HeadData == nil {
kcpMsg.HeadData = make([]byte, 0)
}

View File

@@ -4,6 +4,7 @@ import (
"reflect"
"hk4e/common/config"
"hk4e/gate/client_proto"
"hk4e/pkg/logger"
"hk4e/pkg/object"
"hk4e/protocol/cmd"
@@ -24,17 +25,18 @@ type ProtoMessage struct {
message pb.Message
}
func (k *KcpConnectManager) protoDecode(kcpMsg *KcpMsg) (protoMsgList []*ProtoMsg) {
func ProtoDecode(kcpMsg *KcpMsg,
serverCmdProtoMap *cmd.CmdProtoMap, clientCmdProtoMap *client_proto.ClientCmdProtoMap) (protoMsgList []*ProtoMsg) {
protoMsgList = make([]*ProtoMsg, 0)
if config.CONF.Hk4e.ClientProtoProxyEnable {
clientCmdId := kcpMsg.CmdId
clientProtoData := kcpMsg.ProtoData
cmdName := k.clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId)
cmdName := clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId)
if cmdName == "" {
logger.Error("get cmdName is nil, clientCmdId: %v", clientCmdId)
return protoMsgList
}
clientProtoObj := k.getClientProtoObjByName(cmdName)
clientProtoObj := GetClientProtoObjByName(cmdName, clientCmdProtoMap)
if clientProtoObj == nil {
logger.Error("get client proto obj is nil, cmdName: %v", cmdName)
return protoMsgList
@@ -44,12 +46,12 @@ func (k *KcpConnectManager) protoDecode(kcpMsg *KcpMsg) (protoMsgList []*ProtoMs
logger.Error("unmarshal client proto error: %v", err)
return protoMsgList
}
serverCmdId := k.serverCmdProtoMap.GetCmdIdByCmdName(cmdName)
serverCmdId := serverCmdProtoMap.GetCmdIdByCmdName(cmdName)
if serverCmdId == 0 {
logger.Error("get server cmdId is nil, cmdName: %v", cmdName)
return protoMsgList
}
serverProtoObj := k.serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId)
serverProtoObj := serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId)
if serverProtoObj == nil {
logger.Error("get server proto obj is nil, serverCmdId: %v", serverCmdId)
return protoMsgList
@@ -87,7 +89,7 @@ func (k *KcpConnectManager) protoDecode(kcpMsg *KcpMsg) (protoMsgList []*ProtoMs
}
// payload msg
protoMessageList := make([]*ProtoMessage, 0)
k.protoDecodePayloadLoop(kcpMsg.CmdId, kcpMsg.ProtoData, &protoMessageList)
ProtoDecodePayloadLoop(kcpMsg.CmdId, kcpMsg.ProtoData, &protoMessageList, serverCmdProtoMap, clientCmdProtoMap)
if len(protoMessageList) == 0 {
logger.Error("decode proto object is nil")
return protoMsgList
@@ -106,7 +108,8 @@ func (k *KcpConnectManager) protoDecode(kcpMsg *KcpMsg) (protoMsgList []*ProtoMs
if msg.PayloadMessage != nil {
cmdName = string(msg.PayloadMessage.ProtoReflect().Descriptor().FullName())
}
logger.Debug("[RECV UNION CMD], cmdId: %v, cmdName: %v, convId: %v, headMsg: %v", msg.CmdId, cmdName, msg.ConvId, msg.HeadMessage)
logger.Debug("[RECV UNION CMD], cmdId: %v, cmdName: %v, convId: %v, headMsg: %v",
msg.CmdId, cmdName, msg.ConvId, msg.HeadMessage)
}
} else {
protoMsg.PayloadMessage = protoMessageList[0].message
@@ -115,13 +118,15 @@ func (k *KcpConnectManager) protoDecode(kcpMsg *KcpMsg) (protoMsgList []*ProtoMs
if protoMsg.PayloadMessage != nil {
cmdName = string(protoMsg.PayloadMessage.ProtoReflect().Descriptor().FullName())
}
logger.Debug("[RECV], cmdId: %v, cmdName: %v, convId: %v, headMsg: %v", protoMsg.CmdId, cmdName, protoMsg.ConvId, protoMsg.HeadMessage)
logger.Debug("[RECV], cmdId: %v, cmdName: %v, convId: %v, headMsg: %v",
protoMsg.CmdId, cmdName, protoMsg.ConvId, protoMsg.HeadMessage)
}
return protoMsgList
}
func (k *KcpConnectManager) protoDecodePayloadLoop(cmdId uint16, protoData []byte, protoMessageList *[]*ProtoMessage) {
protoObj := k.decodePayloadToProto(cmdId, protoData)
func ProtoDecodePayloadLoop(cmdId uint16, protoData []byte, protoMessageList *[]*ProtoMessage,
serverCmdProtoMap *cmd.CmdProtoMap, clientCmdProtoMap *client_proto.ClientCmdProtoMap) {
protoObj := DecodePayloadToProto(cmdId, protoData, serverCmdProtoMap)
if protoObj == nil {
logger.Error("decode proto object is nil")
return
@@ -137,12 +142,12 @@ func (k *KcpConnectManager) protoDecodePayloadLoop(cmdId uint16, protoData []byt
if config.CONF.Hk4e.ClientProtoProxyEnable {
clientCmdId := uint16(unionCmd.MessageId)
clientProtoData := unionCmd.Body
cmdName := k.clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId)
cmdName := clientCmdProtoMap.GetClientCmdNameByCmdId(clientCmdId)
if cmdName == "" {
logger.Error("get cmdName is nil, clientCmdId: %v", clientCmdId)
continue
}
clientProtoObj := k.getClientProtoObjByName(cmdName)
clientProtoObj := GetClientProtoObjByName(cmdName, clientCmdProtoMap)
if clientProtoObj == nil {
logger.Error("get client proto obj is nil, cmdName: %v", cmdName)
continue
@@ -152,12 +157,12 @@ func (k *KcpConnectManager) protoDecodePayloadLoop(cmdId uint16, protoData []byt
logger.Error("unmarshal client proto error: %v", err)
continue
}
serverCmdId := k.serverCmdProtoMap.GetCmdIdByCmdName(cmdName)
serverCmdId := serverCmdProtoMap.GetCmdIdByCmdName(cmdName)
if serverCmdId == 0 {
logger.Error("get server cmdId is nil, cmdName: %v", cmdName)
continue
}
serverProtoObj := k.serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId)
serverProtoObj := serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId)
if serverProtoObj == nil {
logger.Error("get server proto obj is nil, serverCmdId: %v", serverCmdId)
continue
@@ -178,7 +183,8 @@ func (k *KcpConnectManager) protoDecodePayloadLoop(cmdId uint16, protoData []byt
unionCmd.MessageId = uint32(serverCmdId)
unionCmd.Body = serverProtoData
}
k.protoDecodePayloadLoop(uint16(unionCmd.MessageId), unionCmd.Body, protoMessageList)
ProtoDecodePayloadLoop(uint16(unionCmd.MessageId), unionCmd.Body, protoMessageList,
serverCmdProtoMap, clientCmdProtoMap)
}
}
*protoMessageList = append(*protoMessageList, &ProtoMessage{
@@ -187,12 +193,14 @@ func (k *KcpConnectManager) protoDecodePayloadLoop(cmdId uint16, protoData []byt
})
}
func (k *KcpConnectManager) protoEncode(protoMsg *ProtoMsg) (kcpMsg *KcpMsg) {
func ProtoEncode(protoMsg *ProtoMsg,
serverCmdProtoMap *cmd.CmdProtoMap, clientCmdProtoMap *client_proto.ClientCmdProtoMap) (kcpMsg *KcpMsg) {
cmdName := ""
if protoMsg.PayloadMessage != nil {
cmdName = string(protoMsg.PayloadMessage.ProtoReflect().Descriptor().FullName())
}
logger.Debug("[SEND], cmdId: %v, cmdName: %v, convId: %v, headMsg: %v", protoMsg.CmdId, cmdName, protoMsg.ConvId, protoMsg.HeadMessage)
logger.Debug("[SEND], cmdId: %v, cmdName: %v, convId: %v, headMsg: %v",
protoMsg.CmdId, cmdName, protoMsg.ConvId, protoMsg.HeadMessage)
kcpMsg = new(KcpMsg)
kcpMsg.ConvId = protoMsg.ConvId
kcpMsg.CmdId = protoMsg.CmdId
@@ -209,13 +217,14 @@ func (k *KcpConnectManager) protoEncode(protoMsg *ProtoMsg) (kcpMsg *KcpMsg) {
}
// payload msg
if protoMsg.PayloadMessage != nil {
cmdId, protoData := k.encodeProtoToPayload(protoMsg.PayloadMessage)
cmdId, protoData := EncodeProtoToPayload(protoMsg.PayloadMessage, serverCmdProtoMap)
if cmdId == 0 || protoData == nil {
logger.Error("encode proto data is nil")
return nil
}
if cmdId != 65535 && cmdId != protoMsg.CmdId {
logger.Error("cmd id is not match with proto obj, src cmd id: %v, found cmd id: %v", protoMsg.CmdId, cmdId)
logger.Error("cmd id is not match with proto obj, src cmd id: %v, found cmd id: %v",
protoMsg.CmdId, cmdId)
return nil
}
kcpMsg.ProtoData = protoData
@@ -225,7 +234,7 @@ func (k *KcpConnectManager) protoEncode(protoMsg *ProtoMsg) (kcpMsg *KcpMsg) {
if config.CONF.Hk4e.ClientProtoProxyEnable {
serverCmdId := kcpMsg.CmdId
serverProtoData := kcpMsg.ProtoData
serverProtoObj := k.serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId)
serverProtoObj := serverCmdProtoMap.GetProtoObjByCmdId(serverCmdId)
if serverProtoObj == nil {
logger.Error("get server proto obj is nil, serverCmdId: %v", serverCmdId)
return nil
@@ -235,12 +244,12 @@ func (k *KcpConnectManager) protoEncode(protoMsg *ProtoMsg) (kcpMsg *KcpMsg) {
logger.Error("unmarshal server proto error: %v", err)
return nil
}
cmdName := k.serverCmdProtoMap.GetCmdNameByCmdId(serverCmdId)
cmdName := serverCmdProtoMap.GetCmdNameByCmdId(serverCmdId)
if cmdName == "" {
logger.Error("get cmdName is nil, serverCmdId: %v", serverCmdId)
return nil
}
clientProtoObj := k.getClientProtoObjByName(cmdName)
clientProtoObj := GetClientProtoObjByName(cmdName, clientCmdProtoMap)
if clientProtoObj == nil {
logger.Error("get client proto obj is nil, cmdName: %v", cmdName)
return nil
@@ -258,7 +267,7 @@ func (k *KcpConnectManager) protoEncode(protoMsg *ProtoMsg) (kcpMsg *KcpMsg) {
logger.Error("marshal client proto error: %v", err)
return nil
}
clientCmdId := k.clientCmdProtoMap.GetClientCmdIdByCmdName(cmdName)
clientCmdId := clientCmdProtoMap.GetClientCmdIdByCmdName(cmdName)
if clientCmdId == 0 {
logger.Error("get client cmdId is nil, cmdName: %v", cmdName)
return nil
@@ -269,8 +278,8 @@ func (k *KcpConnectManager) protoEncode(protoMsg *ProtoMsg) (kcpMsg *KcpMsg) {
return kcpMsg
}
func (k *KcpConnectManager) decodePayloadToProto(cmdId uint16, protoData []byte) (protoObj pb.Message) {
protoObj = k.serverCmdProtoMap.GetProtoObjByCmdId(cmdId)
func DecodePayloadToProto(cmdId uint16, protoData []byte, serverCmdProtoMap *cmd.CmdProtoMap) (protoObj pb.Message) {
protoObj = serverCmdProtoMap.GetProtoObjByCmdId(cmdId)
if protoObj == nil {
logger.Error("get new proto object is nil")
return nil
@@ -283,8 +292,8 @@ func (k *KcpConnectManager) decodePayloadToProto(cmdId uint16, protoData []byte)
return protoObj
}
func (k *KcpConnectManager) encodeProtoToPayload(protoObj pb.Message) (cmdId uint16, protoData []byte) {
cmdId = k.serverCmdProtoMap.GetCmdIdByProtoObj(protoObj)
func EncodeProtoToPayload(protoObj pb.Message, serverCmdProtoMap *cmd.CmdProtoMap) (cmdId uint16, protoData []byte) {
cmdId = serverCmdProtoMap.GetCmdIdByProtoObj(protoObj)
var err error = nil
protoData, err = pb.Marshal(protoObj)
if err != nil {
@@ -294,8 +303,8 @@ func (k *KcpConnectManager) encodeProtoToPayload(protoObj pb.Message) (cmdId uin
return cmdId, protoData
}
func (k *KcpConnectManager) getClientProtoObjByName(protoObjName string) pb.Message {
fn := k.clientCmdProtoMap.RefValue.MethodByName("GetClientProtoObjByName")
func GetClientProtoObjByName(protoObjName string, clientCmdProtoMap *client_proto.ClientCmdProtoMap) pb.Message {
fn := clientCmdProtoMap.RefValue.MethodByName("GetClientProtoObjByName")
ret := fn.Call([]reflect.Value{reflect.ValueOf(protoObjName)})
obj := ret[0].Interface()
if obj == nil {

View File

@@ -482,10 +482,10 @@ func (k *KcpConnectManager) getPlayerToken(req *proto.GetPlayerTokenReq, session
timeRand := random.GetTimeRand()
serverSeedUint64 := timeRand.Uint64()
session.seed = serverSeedUint64
if req.GetKeyId() != 0 {
if req.KeyId != 0 {
logger.Debug("do hk4e 2.8 rsa logic, uid: %v", uid)
session.useMagicSeed = true
keyId := strconv.Itoa(int(req.GetKeyId()))
keyId := strconv.Itoa(int(req.KeyId))
encPubPrivKey, exist := k.encRsaKeyMap[keyId]
if !exist {
logger.Error("can not found key id: %v, uid: %v", keyId, uid)
@@ -504,7 +504,7 @@ func (k *KcpConnectManager) getPlayerToken(req *proto.GetPlayerTokenReq, session
loginFailClose()
return nil
}
clientSeedBase64 := req.GetClientRandKey()
clientSeedBase64 := req.ClientRandKey
clientSeedEnc, err := base64.StdEncoding.DecodeString(clientSeedBase64)
if err != nil {
logger.Error("parse client seed base64 error: %v, uid: %v", err, uid)