From 14524cc3b713d72db149c6e8c48bf492e5d78d50 Mon Sep 17 00:00:00 2001 From: LjhAUMEM Date: Sat, 28 Mar 2026 01:20:43 +0800 Subject: [PATCH] Finalmask: Add `randRange` to "noise" (UDP), as the same as "header-custom"'s (TCP & UDP) (#5850) https://github.com/XTLS/Xray-core/pull/5812 --- infra/conf/transport_internet.go | 27 ++++++++++----- .../internet/finalmask/noise/config.pb.go | 34 ++++++++++++++----- .../internet/finalmask/noise/config.proto | 8 +++-- transport/internet/finalmask/noise/conn.go | 4 +-- 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/infra/conf/transport_internet.go b/infra/conf/transport_internet.go index 7a302aec..849f0e38 100644 --- a/infra/conf/transport_internet.go +++ b/infra/conf/transport_internet.go @@ -1425,10 +1425,11 @@ func (c *FragmentMask) Build() (proto.Message, error) { } type NoiseItem struct { - Rand Int32Range `json:"rand"` - Type string `json:"type"` - Packet json.RawMessage `json:"packet"` - Delay Int32Range `json:"delay"` + Rand Int32Range `json:"rand"` + RandRange *Int32Range `json:"randRange"` + Type string `json:"type"` + Packet json.RawMessage `json:"packet"` + Delay Int32Range `json:"delay"` } type NoiseMask struct { @@ -1445,16 +1446,24 @@ func (c *NoiseMask) Build() (proto.Message, error) { noiseSlice := make([]*noise.Item, 0, len(c.Noise)) for _, item := range c.Noise { + if item.RandRange == nil { + item.RandRange = &Int32Range{From: 0, To: 255} + } + if item.RandRange.From < 0 || item.RandRange.To > 255 { + return nil, errors.New("invalid randRange") + } var err error if item.Packet, err = PraseByteSlice(item.Packet, item.Type); err != nil { return nil, err } noiseSlice = append(noiseSlice, &noise.Item{ - RandMin: int64(item.Rand.From), - RandMax: int64(item.Rand.To), - Packet: item.Packet, - DelayMin: int64(item.Delay.From), - DelayMax: int64(item.Delay.To), + RandMin: int64(item.Rand.From), + RandMax: int64(item.Rand.To), + RandRangeMin: item.RandRange.From, + RandRangeMax: item.RandRange.To, + Packet: item.Packet, + DelayMin: int64(item.Delay.From), + DelayMax: int64(item.Delay.To), }) } diff --git a/transport/internet/finalmask/noise/config.pb.go b/transport/internet/finalmask/noise/config.pb.go index 16e1b253..71ba461a 100644 --- a/transport/internet/finalmask/noise/config.pb.go +++ b/transport/internet/finalmask/noise/config.pb.go @@ -25,9 +25,11 @@ type Item struct { state protoimpl.MessageState `protogen:"open.v1"` RandMin int64 `protobuf:"varint,1,opt,name=rand_min,json=randMin,proto3" json:"rand_min,omitempty"` RandMax int64 `protobuf:"varint,2,opt,name=rand_max,json=randMax,proto3" json:"rand_max,omitempty"` - Packet []byte `protobuf:"bytes,3,opt,name=packet,proto3" json:"packet,omitempty"` - DelayMin int64 `protobuf:"varint,4,opt,name=delay_min,json=delayMin,proto3" json:"delay_min,omitempty"` - DelayMax int64 `protobuf:"varint,5,opt,name=delay_max,json=delayMax,proto3" json:"delay_max,omitempty"` + RandRangeMin int32 `protobuf:"varint,3,opt,name=rand_range_min,json=randRangeMin,proto3" json:"rand_range_min,omitempty"` + RandRangeMax int32 `protobuf:"varint,4,opt,name=rand_range_max,json=randRangeMax,proto3" json:"rand_range_max,omitempty"` + Packet []byte `protobuf:"bytes,5,opt,name=packet,proto3" json:"packet,omitempty"` + DelayMin int64 `protobuf:"varint,6,opt,name=delay_min,json=delayMin,proto3" json:"delay_min,omitempty"` + DelayMax int64 `protobuf:"varint,7,opt,name=delay_max,json=delayMax,proto3" json:"delay_max,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -76,6 +78,20 @@ func (x *Item) GetRandMax() int64 { return 0 } +func (x *Item) GetRandRangeMin() int32 { + if x != nil { + return x.RandRangeMin + } + return 0 +} + +func (x *Item) GetRandRangeMax() int32 { + if x != nil { + return x.RandRangeMax + } + return 0 +} + func (x *Item) GetPacket() []byte { if x != nil { return x.Packet @@ -161,13 +177,15 @@ var File_transport_internet_finalmask_noise_config_proto protoreflect.FileDescri const file_transport_internet_finalmask_noise_config_proto_rawDesc = "" + "\n" + - "/transport/internet/finalmask/noise/config.proto\x12'xray.transport.internet.finalmask.noise\"\x8e\x01\n" + + "/transport/internet/finalmask/noise/config.proto\x12'xray.transport.internet.finalmask.noise\"\xda\x01\n" + "\x04Item\x12\x19\n" + "\brand_min\x18\x01 \x01(\x03R\arandMin\x12\x19\n" + - "\brand_max\x18\x02 \x01(\x03R\arandMax\x12\x16\n" + - "\x06packet\x18\x03 \x01(\fR\x06packet\x12\x1b\n" + - "\tdelay_min\x18\x04 \x01(\x03R\bdelayMin\x12\x1b\n" + - "\tdelay_max\x18\x05 \x01(\x03R\bdelayMax\"\x87\x01\n" + + "\brand_max\x18\x02 \x01(\x03R\arandMax\x12$\n" + + "\x0erand_range_min\x18\x03 \x01(\x05R\frandRangeMin\x12$\n" + + "\x0erand_range_max\x18\x04 \x01(\x05R\frandRangeMax\x12\x16\n" + + "\x06packet\x18\x05 \x01(\fR\x06packet\x12\x1b\n" + + "\tdelay_min\x18\x06 \x01(\x03R\bdelayMin\x12\x1b\n" + + "\tdelay_max\x18\a \x01(\x03R\bdelayMax\"\x87\x01\n" + "\x06Config\x12\x1b\n" + "\treset_min\x18\x01 \x01(\x03R\bresetMin\x12\x1b\n" + "\treset_max\x18\x02 \x01(\x03R\bresetMax\x12C\n" + diff --git a/transport/internet/finalmask/noise/config.proto b/transport/internet/finalmask/noise/config.proto index 552603fa..d874b973 100644 --- a/transport/internet/finalmask/noise/config.proto +++ b/transport/internet/finalmask/noise/config.proto @@ -9,9 +9,11 @@ option java_multiple_files = true; message Item { int64 rand_min = 1; int64 rand_max = 2; - bytes packet = 3; - int64 delay_min = 4; - int64 delay_max = 5; + int32 rand_range_min = 3; + int32 rand_range_max = 4; + bytes packet = 5; + int64 delay_min = 6; + int64 delay_max = 7; } message Config { diff --git a/transport/internet/finalmask/noise/conn.go b/transport/internet/finalmask/noise/conn.go index 022fb21b..c3ab89ab 100644 --- a/transport/internet/finalmask/noise/conn.go +++ b/transport/internet/finalmask/noise/conn.go @@ -1,12 +1,10 @@ package noise import ( - "crypto/rand" "net" "sync" "time" - "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/crypto" ) @@ -77,7 +75,7 @@ func (c *noiseConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { for _, item := range c.config.Items { if item.RandMax > 0 { item.Packet = make([]byte, crypto.RandBetween(item.RandMin, item.RandMax)) - common.Must2(rand.Read(item.Packet)) + crypto.RandBytesBetween(item.Packet, byte(item.RandRangeMin), byte(item.RandRangeMax)) } c.PacketConn.WriteTo(item.Packet, addr) time.Sleep(time.Duration(crypto.RandBetween(item.DelayMin, item.DelayMax)) * time.Millisecond)