POC: inspect incoming traffic
This commit is contained in:
parent
81f6b89f70
commit
0f9cb77677
39
messages7/ctrl_accept.go
Normal file
39
messages7/ctrl_accept.go
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
package messages7
|
||||||
|
|
||||||
|
import (
|
||||||
|
"slices"
|
||||||
|
|
||||||
|
"github.com/teeworlds-go/teeworlds/network7"
|
||||||
|
"github.com/teeworlds-go/teeworlds/packer"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CtrlAccept struct {
|
||||||
|
Token [4]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg CtrlAccept) MsgId() int {
|
||||||
|
return network7.MsgCtrlAccept
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg CtrlAccept) MsgType() network7.MsgType {
|
||||||
|
return network7.TypeControl
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg CtrlAccept) System() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg CtrlAccept) Vital() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg CtrlAccept) Pack() []byte {
|
||||||
|
return slices.Concat(
|
||||||
|
[]byte{network7.MsgCtrlAccept},
|
||||||
|
msg.Token[:],
|
||||||
|
[]byte{512: 0},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg *CtrlAccept) Unpack(u *packer.Unpacker) {
|
||||||
|
}
|
47
messages7/sv_chat.go
Normal file
47
messages7/sv_chat.go
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
package messages7
|
||||||
|
|
||||||
|
import (
|
||||||
|
"slices"
|
||||||
|
|
||||||
|
"github.com/teeworlds-go/teeworlds/network7"
|
||||||
|
"github.com/teeworlds-go/teeworlds/packer"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SvChat struct {
|
||||||
|
Mode int
|
||||||
|
ClientId int
|
||||||
|
TargetId int
|
||||||
|
Message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg SvChat) MsgId() int {
|
||||||
|
return network7.MsgGameSvChat
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg SvChat) MsgType() network7.MsgType {
|
||||||
|
return network7.TypeNet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg SvChat) System() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg SvChat) Vital() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg SvChat) Pack() []byte {
|
||||||
|
return slices.Concat(
|
||||||
|
packer.PackInt(msg.Mode),
|
||||||
|
packer.PackInt(msg.ClientId),
|
||||||
|
packer.PackInt(msg.TargetId),
|
||||||
|
packer.PackStr(msg.Message),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msg *SvChat) Unpack(u *packer.Unpacker) {
|
||||||
|
msg.Mode = u.GetInt()
|
||||||
|
msg.ClientId = u.GetInt()
|
||||||
|
msg.TargetId = u.GetInt()
|
||||||
|
msg.Message = u.GetString()
|
||||||
|
}
|
|
@ -111,9 +111,9 @@ func (connection *Connection) OnSystemMsg(msg int, chunk chunk7.Chunk, u *packer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client *Connection) OnChatMessage(mode int, clientId int, targetId int, message string) {
|
func (client *Connection) OnChatMessage(msg *messages7.SvChat) {
|
||||||
name := client.Players[clientId].Info.Name
|
name := client.Players[msg.ClientId].Info.Name
|
||||||
fmt.Printf("[chat] <%s> %s\n", name, message)
|
fmt.Printf("[chat] <%s> %s\n", name, msg.Message)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client *Connection) OnMotd(motd string) {
|
func (client *Connection) OnMotd(motd string) {
|
||||||
|
@ -131,11 +131,10 @@ func (client *Connection) OnGameMsg(msg int, chunk chunk7.Chunk, u *packer.Unpac
|
||||||
client.OnMotd(motd)
|
client.OnMotd(motd)
|
||||||
}
|
}
|
||||||
} else if msg == network7.MsgGameSvChat {
|
} else if msg == network7.MsgGameSvChat {
|
||||||
mode := u.GetInt()
|
chat := &messages7.SvChat{}
|
||||||
clientId := u.GetInt()
|
chat.Unpack(u)
|
||||||
targetId := u.GetInt()
|
client.OnChatMessage(chat)
|
||||||
message := u.GetString()
|
result.Packet.Messages = append(result.Packet.Messages, chat)
|
||||||
client.OnChatMessage(mode, clientId, targetId, message)
|
|
||||||
} else if msg == network7.MsgGameSvClientInfo {
|
} else if msg == network7.MsgGameSvClientInfo {
|
||||||
clientId := packer.UnpackInt(chunk.Data[1:])
|
clientId := packer.UnpackInt(chunk.Data[1:])
|
||||||
client.Players[clientId].Info.Unpack(u)
|
client.Players[clientId].Info.Unpack(u)
|
||||||
|
@ -202,6 +201,7 @@ func (connection *Connection) OnPacket(data []byte) (*PacketResult, error) {
|
||||||
copy(connection.ServerToken[:], payload[1:5])
|
copy(connection.ServerToken[:], payload[1:5])
|
||||||
result.Response.Header.Token = connection.ServerToken
|
result.Response.Header.Token = connection.ServerToken
|
||||||
fmt.Printf("got server token %x\n", connection.ServerToken)
|
fmt.Printf("got server token %x\n", connection.ServerToken)
|
||||||
|
result.Packet.Messages = append(result.Packet.Messages, &messages7.CtrlToken{Token: connection.ServerToken})
|
||||||
result.Response.Messages = append(
|
result.Response.Messages = append(
|
||||||
result.Response.Messages,
|
result.Response.Messages,
|
||||||
&messages7.CtrlConnect{
|
&messages7.CtrlConnect{
|
||||||
|
@ -210,6 +210,7 @@ func (connection *Connection) OnPacket(data []byte) (*PacketResult, error) {
|
||||||
)
|
)
|
||||||
} else if ctrlMsg == network7.MsgCtrlAccept {
|
} else if ctrlMsg == network7.MsgCtrlAccept {
|
||||||
fmt.Println("got accept")
|
fmt.Println("got accept")
|
||||||
|
result.Packet.Messages = append(result.Packet.Messages, &messages7.CtrlAccept{})
|
||||||
// TODO: don't hardcode info
|
// TODO: don't hardcode info
|
||||||
result.Response.Messages = append(result.Response.Messages, &messages7.Info{})
|
result.Response.Messages = append(result.Response.Messages, &messages7.Info{})
|
||||||
} else if ctrlMsg == network7.MsgCtrlClose {
|
} else if ctrlMsg == network7.MsgCtrlClose {
|
||||||
|
|
16
teeworlds.go
16
teeworlds.go
|
@ -73,12 +73,26 @@ func main() {
|
||||||
}
|
}
|
||||||
if result.Response != nil {
|
if result.Response != nil {
|
||||||
|
|
||||||
|
// example of inspecting incoming trafic
|
||||||
|
for i, msg := range result.Packet.Messages {
|
||||||
|
if msg.MsgId() == network7.MsgGameSvChat {
|
||||||
|
var chat *messages7.SvChat
|
||||||
|
var ok bool
|
||||||
|
if chat, ok = result.Packet.Messages[i].(*messages7.SvChat); ok {
|
||||||
|
fmt.Printf("got chat msg: %s\n", chat.Message)
|
||||||
|
|
||||||
|
// modify chat if this was a proxy
|
||||||
|
result.Response.Messages[i] = chat
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// example of modifying outgoing traffic
|
// example of modifying outgoing traffic
|
||||||
for i, msg := range result.Response.Messages {
|
for i, msg := range result.Response.Messages {
|
||||||
if msg.MsgId() == network7.MsgCtrlConnect {
|
if msg.MsgId() == network7.MsgCtrlConnect {
|
||||||
var connect *messages7.CtrlConnect
|
var connect *messages7.CtrlConnect
|
||||||
var ok bool
|
var ok bool
|
||||||
if connect, ok = result.Response.Messages[0].(*messages7.CtrlConnect); ok {
|
if connect, ok = result.Response.Messages[i].(*messages7.CtrlConnect); ok {
|
||||||
connect.Token = [4]byte{0xaa, 0xaa, 0xaa, 0xaa}
|
connect.Token = [4]byte{0xaa, 0xaa, 0xaa, 0xaa}
|
||||||
result.Response.Messages[i] = connect
|
result.Response.Messages[i] = connect
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue