diff --git a/go.mod b/go.mod index b892731..bd365e3 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ go 1.19 replace github.com/sandertv/gophertunnel => github.com/olebeck/gophertunnel v1.26.2 //replace github.com/df-mc/dragonfly => ./dragonfly -replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.1-4 +replace github.com/df-mc/dragonfly => github.com/olebeck/dragonfly v0.9.1-5 require ( github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 diff --git a/go.sum b/go.sum index ce840dc..9d16547 100644 --- a/go.sum +++ b/go.sum @@ -74,6 +74,8 @@ github.com/olebeck/dragonfly v0.9.1-3 h1:ULE04Wx6MzBMuMmjj+xb9VtdYnCRoI6EafOWqcY github.com/olebeck/dragonfly v0.9.1-3/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0= github.com/olebeck/dragonfly v0.9.1-4 h1:eHGO1wBiG21cfDFMx3p+oaVV49JxzT1cMwdZOTSupPE= github.com/olebeck/dragonfly v0.9.1-4/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0= +github.com/olebeck/dragonfly v0.9.1-5 h1:Y0o2x/r5l0xFreVEQR9p9pVEjAsbcxkSlQ/xKl8Dfq0= +github.com/olebeck/dragonfly v0.9.1-5/go.mod h1:ZjzPME6I1nc73voUgr2s5lpkoTxnWuR54V6c1KbULX0= github.com/olebeck/gophertunnel v1.26.2 h1:AbiZcmeR5LenSJ5NX/2BPxLC3ddlvgWjrjouPmOB6BA= github.com/olebeck/gophertunnel v1.26.2/go.mod h1:dYFetA6r62huhc1EgR9p8VFAFtKOuGgVE/iXf5CzZ4o= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= diff --git a/subcommands/capture.go b/subcommands/capture.go index 06fbefd..b736106 100644 --- a/subcommands/capture.go +++ b/subcommands/capture.go @@ -61,7 +61,9 @@ func (c *CaptureCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interfac return 1 } - fio, err := os.Create(hostname + "-" + time.Now().Format("2006-01-02_15-04-05") + ".pcap2") + os.Mkdir("captures", 0o775) + + fio, err := os.Create("captures/" + hostname + "-" + time.Now().Format("2006-01-02_15-04-05") + ".pcap2") if err != nil { logrus.Fatal(err) return 1 diff --git a/subcommands/world/world.go b/subcommands/world/world.go index bfc0a0c..0aa8bf3 100644 --- a/subcommands/world/world.go +++ b/subcommands/world/world.go @@ -175,6 +175,14 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{ return pk, nil } + super_verbose_log := false + if super_verbose_log { + utils.F_Log, err = os.Create("packets.log") + if err != nil { + logrus.Error(err) + } + } + err = proxy.Run(ctx, server_address) if err != nil { logrus.Error(err) diff --git a/utils/packet_logger.go b/utils/packet_logger.go index 38c464c..0cceef2 100644 --- a/utils/packet_logger.go +++ b/utils/packet_logger.go @@ -2,8 +2,13 @@ package utils import ( "bytes" + "encoding/json" + "fmt" + "io" "net" "reflect" + "strings" + "sync" "github.com/bedrock-tool/bedrocktool/locale" "github.com/fatih/color" @@ -44,6 +49,66 @@ var MutedPackets = []string{ } var ExtraVerbose []string +var F_Log io.Writer +var dmp_lock sync.Mutex + +func dmp_struct(level int, in any, w_type bool) (s string) { + t_base := strings.Repeat("\t", level) + + ii := reflect.Indirect(reflect.ValueOf(in)) + if w_type { + type_name := reflect.TypeOf(in).String() + s += type_name + " " + } else { + s += "\t" + } + + struct_entry := func(ii reflect.Value) { + s += "{\n" + for i := 0; i < ii.NumField(); i++ { + field := ii.Type().Field(i) + if field.IsExported() { + d := dmp_struct(level+1, ii.Field(i).Interface(), true) + s += t_base + fmt.Sprintf("\t%s = %s\n", field.Name, d) + } else { + s += t_base + "\t" + field.Name + " (unexported)" + } + } + s += t_base + "}\n" + } + + if ii.Kind() == reflect.Struct { + struct_entry(ii) + } else if ii.Kind() == reflect.Slice { + var t reflect.Type + if ii.Len() > 0 { + e := ii.Index(0) + t = reflect.TypeOf(e.Interface()) + } + if ii.Len() > 1000 { + s += " []" + } else if ii.Len() == 0 || t.Kind() == reflect.Struct { + s += "\t[\n" + for i := 0; i < ii.Len(); i++ { + s += t_base + s += dmp_struct(level+1, ii.Index(i).Interface(), false) + } + s += t_base + "]\n" + } else { + s += fmt.Sprintf("%#v", ii.Interface()) + } + } else if ii.Kind() == reflect.Map { + j, err := json.MarshalIndent(ii.Interface(), t_base, "\t") + if err != nil { + s += err.Error() + } + s += string(j) + } else { + s += fmt.Sprintf(" %#v", ii.Interface()) + } + + return s +} func PacketLogger(header packet.Header, payload []byte, src, dst net.Addr) { var pk packet.Packet @@ -55,12 +120,19 @@ func PacketLogger(header packet.Header, payload []byte, src, dst net.Addr) { defer func() { if recoveredErr := recover(); recoveredErr != nil { - logrus.Errorf("%T: %w", pk, recoveredErr.(error)) + logrus.Errorf("%T: %w", pk, recoveredErr) } }() pk.Unmarshal(protocol.NewReader(bytes.NewBuffer(payload), 0)) + if F_Log != nil { + dmp_lock.Lock() + defer dmp_lock.Unlock() + F_Log.Write([]byte(dmp_struct(0, pk, true))) + F_Log.Write([]byte("\n\n")) + } + pk_name := reflect.TypeOf(pk).String()[1:] if slices.Contains(MutedPackets, pk_name) { return diff --git a/utils/replay.go b/utils/replay.go index e360d91..dece900 100644 --- a/utils/replay.go +++ b/utils/replay.go @@ -1,13 +1,15 @@ package utils import ( + "bytes" "context" "encoding/binary" "io" + "net" "os" - "reflect" "github.com/sandertv/gophertunnel/minecraft" + "github.com/sandertv/gophertunnel/minecraft/protocol" "github.com/sandertv/gophertunnel/minecraft/protocol/packet" "github.com/sirupsen/logrus" ) @@ -79,7 +81,11 @@ func create_replay_connection(ctx context.Context, filename string, onConnect Co } for _, pk := range pks { - logrus.Printf("%s", reflect.TypeOf(pk).String()[1:]) + f := bytes.NewBuffer(nil) + b := protocol.NewWriter(f, 0) + pk.Marshal(b) + + PacketLogger(packet.Header{PacketID: pk.ID()}, f.Bytes(), &net.UDPAddr{}, &net.UDPAddr{}) if game_started { if packetCB != nil {