From de16def09853d7d198fdbc30eb3168a35906efdb Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Mon, 29 Apr 2024 23:08:18 +0800 Subject: [PATCH] fix TCP_SYN; fix SNI for big packet --- go.mod | 2 +- header/tcp.go | 33 ++++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index cdb15c6d..1b13bb86 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/macronut/ghostcp -go 1.16 +go 1.21 require ( github.com/chai2010/winsvc v0.0.0-20200705094454-db7ec320025c diff --git a/header/tcp.go b/header/tcp.go index 3fac123d..994438c8 100644 --- a/header/tcp.go +++ b/header/tcp.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" "fmt" + "math" "log" "math/rand" "net" @@ -325,14 +326,32 @@ func SendFakePacket(winDivert *godivert.WinDivertHandle, info *ConnInfo, packet } else { rawbuf[8] = byte(info.TTL) } - fake_packet.Raw = rawbuf[:len(packet.Raw)] + interval := 1500 + packetCount := math.Ceil(float64(len(packet.Raw)) / float64(interval)) + if packetCount > 1 { + for i := 0; i < len(packet.Raw); i += interval { + curLen := min(i+interval,len(packet.Raw)) + fake_packet.Raw = rawbuf[i:curLen] + + fake_packet.CalcNewChecksum(winDivert) + + for i := 0; i < count; i++ { + _, err = winDivert.Send(&fake_packet) + if err != nil { + return 0, err + } + } + } + } else { + fake_packet.Raw = rawbuf[:len(packet.Raw)] - fake_packet.CalcNewChecksum(winDivert) + fake_packet.CalcNewChecksum(winDivert) - for i := 0; i < count; i++ { - _, err = winDivert.Send(&fake_packet) - if err != nil { - return 0, err + for i := 0; i < count; i++ { + _, err = winDivert.Send(&fake_packet) + if err != nil { + return 0, err + } } } } @@ -956,7 +975,7 @@ func TCPDaemon(address string, forward bool) { } continue } - } else if packet.Raw[ipheadlen+13] == TCP_SYN { + } else if (packet.Raw[ipheadlen+13] & TCP_SYN) != 0 { dstIP := packet.DstIP() dstAddr := dstIP.String() config, ok := IPLookup(dstAddr)