增加防探测功能,增加流量加密功能

This commit is contained in:
wenyifan
2022-09-09 15:29:41 +08:00
parent c2ab6cbe5f
commit a064f72104
12 changed files with 185 additions and 79 deletions

View File

@ -79,62 +79,11 @@ func handler(conn net.Conn, targetAddress string, fakeAddress string) {
go MyCopy(p, realConnection, exit)
go MyCopy(realConnection, p, exit)
<-exit
//go func() {
// buf := make([]byte, 64*1024)
// for {
// nr, er := realConnection.Read(buf)
// if er != nil {
// if er == io.EOF {
// continue
// } else {
// fmt.Println("read err:", er)
// break
// }
// } else {
// lenNum := make([]byte, 2)
// binary.BigEndian.PutUint16(lenNum, uint16(nr))
//
// packetBuf := bytes.NewBuffer(AppDataHeader)
// packetBuf.Write(lenNum)
// packetBuf.Write(buf[0:nr])
//
// _, ew := conn.Write(packetBuf.Bytes())
// if ew != nil {
// fmt.Printf("err2:%v\n", ew)
// break
// }
// }
// }
//}()
//
//go func() {
// result := bytes.NewBuffer(nil)
// var buf [65542]byte // 由于 标识数据包长度 的只有两个字节 故数据包最大为 2^16+4(魔数)+2(长度标识)
// for {
// n, er := conn.Read(buf[0:])
// result.Write(buf[0:n])
// if er != nil {
// if er == io.EOF {
// continue
// } else {
// fmt.Println("read err:", er)
// break
// }
// } else {
// scanner := bufio.NewScanner(result)
// scanner.Split(packetSlitFunc)
// for scanner.Scan() {
// realConnection.Write(scanner.Bytes()[HeaderLength+2:])
// }
// }
// result.Reset()
// }
//}()
}
func processHandshake(src net.Conn, dst net.Conn, waitCh chan int, srcType string) {
buf := make([]byte, 32*1024)
verifyPass := false
for {
nr, er := src.Read(buf)
if nr > 0 {
@ -142,10 +91,17 @@ func processHandshake(src net.Conn, dst net.Conn, waitCh chan int, srcType strin
if srcType == "client" {
header := ParseAndVerifyTLSHeader(buf[0:nr])
if header != nil {
if header != nil && header.Type == Handshake && header.HandshakeType == ClientHello && !verifyPass {
verifyPass = VerifyKey(header.Rand, HandshakePassword)
}
if header.Type == ChangeCipherSpec {
fmt.Println("[Server] handshake complete")
waitCh <- 1
break
if HandshakePassword != "" && !verifyPass {
fmt.Println("[Server] Probe detected,pass through all traffic.")
} else {
fmt.Println("[Server] handshake complete")
waitCh <- 1
break
}
}
//fmt.Println(header.toString())
}