mirror of
https://github.com/GameXG/ProxyClient.git
synced 2025-12-24 13:57:50 +08:00
使用 gofmt 格式化代码,idea 格式化居然和 gofmt不兼容...
This commit is contained in:
@@ -13,7 +13,7 @@ var B3 = []byte{47, 65, 36, 14, 89, 96, 32, 14, 56}
|
||||
|
||||
func testDirectProxyTCP1(t *testing.T) {
|
||||
|
||||
p, err := newDriectProxyClient("", false,0, make(map[string][]string))
|
||||
p, err := newDriectProxyClient("", false, 0, make(map[string][]string))
|
||||
if err != nil {
|
||||
t.Fatalf("启动直连代理失败:%s", err)
|
||||
return
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package proxyclient
|
||||
|
||||
import (
|
||||
"net"
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
"time"
|
||||
"bytes"
|
||||
)
|
||||
|
||||
type directTCPConn struct {
|
||||
@@ -79,7 +79,7 @@ func (p *directProxyClient) DialTimeout(network, address string, timeout time.Du
|
||||
return nil, fmt.Errorf("不支持的 network 类型:%v", network)
|
||||
}
|
||||
|
||||
d := net.Dialer{Timeout:timeout, LocalAddr:&p.TCPLocalAddr}
|
||||
d := net.Dialer{Timeout: timeout, LocalAddr: &p.TCPLocalAddr}
|
||||
conn, err := d.Dial(network, address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -130,18 +130,18 @@ func (p *directProxyClient) DialTCP(network string, laddr, raddr *net.TCPAddr) (
|
||||
return &directTCPConn{*conn, splitHttp, wTime, p}, nil
|
||||
}
|
||||
|
||||
func (p *directProxyClient)DialTCPSAddr(network string, raddr string) (ProxyTCPConn, error) {
|
||||
func (p *directProxyClient) DialTCPSAddr(network string, raddr string) (ProxyTCPConn, error) {
|
||||
return p.DialTCPSAddrTimeout(network, raddr, 0)
|
||||
}
|
||||
|
||||
// DialTCPSAddrTimeout 同 DialTCPSAddr 函数,增加了超时功能
|
||||
func (p *directProxyClient)DialTCPSAddrTimeout(network string, raddr string, timeout time.Duration) (rconn ProxyTCPConn, rerr error) {
|
||||
func (p *directProxyClient) DialTCPSAddrTimeout(network string, raddr string, timeout time.Duration) (rconn ProxyTCPConn, rerr error) {
|
||||
switch network {
|
||||
case "tcp", "tcp4", "tcp6":
|
||||
default:
|
||||
return nil, fmt.Errorf("不支持的 network 类型:%v", network)
|
||||
}
|
||||
d := net.Dialer{Timeout:timeout, LocalAddr:&p.TCPLocalAddr}
|
||||
d := net.Dialer{Timeout: timeout, LocalAddr: &p.TCPLocalAddr}
|
||||
conn, err := d.Dial(network, raddr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -189,8 +189,8 @@ func (c *directTCPConn) ProxyClient() ProxyClient {
|
||||
// 拆分 http 请求
|
||||
// 查找 'GET', 'HEAD', 'PUT', 'POST', 'TRACE', 'OPTIONS', 'DELETE', 'CONNECT' 及 HTTP、HOST
|
||||
//
|
||||
func SplitHttp(b[]byte) (res [][]byte) {
|
||||
split := func(b[]byte, i int) [][]byte {
|
||||
func SplitHttp(b []byte) (res [][]byte) {
|
||||
split := func(b []byte, i int) [][]byte {
|
||||
// 根据 i的值拆分成为 2 个 []byte 。
|
||||
// 注意,允许 i < len(b)
|
||||
if len(b) > i {
|
||||
@@ -202,45 +202,45 @@ func SplitHttp(b[]byte) (res [][]byte) {
|
||||
for i, v := range b {
|
||||
switch v {
|
||||
case 'G':
|
||||
if bytes.HasPrefix(b[i + 1:], []byte("ET ")) {
|
||||
res = split(b, i + 1)
|
||||
if bytes.HasPrefix(b[i+1:], []byte("ET ")) {
|
||||
res = split(b, i+1)
|
||||
res = append([][]byte{res[0]}, split(res[1], 3)...)
|
||||
|
||||
return append(res[:len(res) - 1], SplitHttp(res[len(res) - 1])...)
|
||||
return append(res[:len(res)-1], SplitHttp(res[len(res)-1])...)
|
||||
}
|
||||
case 'P':
|
||||
if bytes.HasPrefix(b[i + 1:], []byte("OST ")) {
|
||||
res = split(b, i + 1)
|
||||
if bytes.HasPrefix(b[i+1:], []byte("OST ")) {
|
||||
res = split(b, i+1)
|
||||
res = append([][]byte{res[0]}, split(res[1], 5)...)
|
||||
|
||||
return append(res[:len(res) - 1], SplitHttp(res[len(res) - 1])...)
|
||||
return append(res[:len(res)-1], SplitHttp(res[len(res)-1])...)
|
||||
}
|
||||
case 'C':
|
||||
if bytes.HasPrefix(b[i + 1:], []byte("ONNECT ")) {
|
||||
res = split(b, i + 1)
|
||||
if bytes.HasPrefix(b[i+1:], []byte("ONNECT ")) {
|
||||
res = split(b, i+1)
|
||||
res = append([][]byte{res[0]}, split(res[1], 8)...)
|
||||
|
||||
return append(res[:len(res) - 1], SplitHttp(res[len(res) - 1])...)
|
||||
return append(res[:len(res)-1], SplitHttp(res[len(res)-1])...)
|
||||
}
|
||||
case 'H':
|
||||
if bytes.HasPrefix(b[i + 1:], []byte("OST:")) {
|
||||
res = split(b, i + 1)
|
||||
if bytes.HasPrefix(b[i+1:], []byte("OST:")) {
|
||||
res = split(b, i+1)
|
||||
res = append([][]byte{res[0]}, split(res[1], 8)...)
|
||||
|
||||
return append(res[:len(res) - 1], SplitHttp(res[len(res) - 1])...)
|
||||
return append(res[:len(res)-1], SplitHttp(res[len(res)-1])...)
|
||||
}
|
||||
if bytes.HasPrefix(b[i + 1:], []byte("TTP")) {
|
||||
res = split(b, i + 1)
|
||||
if bytes.HasPrefix(b[i+1:], []byte("TTP")) {
|
||||
res = split(b, i+1)
|
||||
res = append([][]byte{res[0]}, split(res[1], 9)...)
|
||||
|
||||
return append(res[:len(res) - 1], SplitHttp(res[len(res) - 1])...)
|
||||
return append(res[:len(res)-1], SplitHttp(res[len(res)-1])...)
|
||||
}
|
||||
}
|
||||
}
|
||||
return [][]byte{b}
|
||||
}
|
||||
|
||||
func (c *directTCPConn) Write(b[]byte) (n int, err error) {
|
||||
func (c *directTCPConn) Write(b []byte) (n int, err error) {
|
||||
if c.wTime.IsZero() == false {
|
||||
c.wTime = time.Time{}
|
||||
time.Sleep(c.wTime.Sub(time.Now()))
|
||||
@@ -263,6 +263,6 @@ func (c *directTCPConn) Write(b[]byte) (n int, err error) {
|
||||
func (c *directUDPConn) ProxyClient() ProxyClient {
|
||||
return c.proxyClient
|
||||
}
|
||||
func (p *directProxyClient)GetProxyAddrQuery() map[string][]string {
|
||||
func (p *directProxyClient) GetProxyAddrQuery() map[string][]string {
|
||||
return p.query
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gamexg/proxyclient"
|
||||
"fmt"
|
||||
"github.com/gamexg/proxyclient"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -28,10 +29,10 @@ func main() {
|
||||
|
||||
if n, err := c.Read(b); err != nil {
|
||||
panic(err)
|
||||
}else {
|
||||
} else {
|
||||
fmt.Print(string(b[:n]))
|
||||
}
|
||||
|
||||
c.Close()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gamexg/proxyclient"
|
||||
"fmt"
|
||||
"github.com/gamexg/proxyclient"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -26,10 +27,10 @@ func main() {
|
||||
|
||||
if n, err := c.Read(b); err != nil {
|
||||
panic(err)
|
||||
}else {
|
||||
} else {
|
||||
fmt.Print(string(b[:n]))
|
||||
}
|
||||
|
||||
c.Close()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ func main() {
|
||||
|
||||
c, err := p.Dial("tcp", "www.163.com:80")
|
||||
if err != nil {
|
||||
panic("连接错误"+err.Error())
|
||||
panic("连接错误" + err.Error())
|
||||
}
|
||||
|
||||
io.WriteString(c, "GET / HTTP/1.0\r\nHOST:www.163.com\r\n\r\n")
|
||||
|
||||
27
httpproxy.go
27
httpproxy.go
@@ -2,25 +2,25 @@ package proxyclient
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"crypto/rand"
|
||||
"crypto/tls"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/big"
|
||||
srand "math/rand"
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
"crypto/rand"
|
||||
srand "math/rand"
|
||||
"math/big"
|
||||
"sync"
|
||||
"encoding/base64"
|
||||
"time"
|
||||
)
|
||||
|
||||
type httpTCPConn struct {
|
||||
Conn //http 协议时是原始链接、https协议时是tls.Conn
|
||||
rawConn TCPConn //原始链接
|
||||
tlsConn *tls.Conn //tls链接
|
||||
Conn //http 协议时是原始链接、https协议时是tls.Conn
|
||||
rawConn TCPConn //原始链接
|
||||
tlsConn *tls.Conn //tls链接
|
||||
localAddr, remoteAddr net.TCPAddr
|
||||
localHost, remoteHost string
|
||||
LocalPort, remotePort uint16
|
||||
@@ -52,7 +52,7 @@ func newHTTPProxyClient(proxyType string, proxyAddr string, proxyDomain string,
|
||||
}
|
||||
|
||||
if upProxy == nil {
|
||||
nUpProxy, err := newDriectProxyClient("",false,0, make(map[string][]string))
|
||||
nUpProxy, err := newDriectProxyClient("", false, 0, make(map[string][]string))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("创建直连代理错误:%v", err)
|
||||
}
|
||||
@@ -101,7 +101,6 @@ func (p *httpProxyClient) DialTCPSAddr(network string, raddr string) (ProxyTCPCo
|
||||
return p.DialTCPSAddrTimeout(network, raddr, 0)
|
||||
}
|
||||
|
||||
|
||||
func (p *httpProxyClient) DialTCPSAddrTimeout(network string, raddr string, timeout time.Duration) (ProxyTCPConn, error) {
|
||||
var rconn ProxyTCPConn
|
||||
var rerr error
|
||||
@@ -178,7 +177,7 @@ func (p *httpProxyClient) DialTCPSAddrTimeout(network string, raddr string, time
|
||||
var rInt64 int64
|
||||
if err != nil {
|
||||
rInt64 = srand.Int63n(20)
|
||||
}else {
|
||||
} else {
|
||||
rInt64 = rInt.Int64()
|
||||
}
|
||||
|
||||
@@ -209,7 +208,6 @@ func (p *httpProxyClient) DialTCPSAddrTimeout(network string, raddr string, time
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
br := bufio.NewReader(c)
|
||||
|
||||
res, err := http.ReadResponse(br, req)
|
||||
@@ -240,7 +238,6 @@ func (p *httpProxyClient) DialTCPSAddrTimeout(network string, raddr string, time
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
if timeout == 0 {
|
||||
go run()
|
||||
|
||||
@@ -275,11 +272,13 @@ func (p *httpProxyClient) DialTCPSAddrTimeout(network string, raddr string, time
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 重写了 Read 接口
|
||||
// 由于 http 协议问题,解析响应需要读缓冲,所以必须重写 Read 来兼容读缓冲功能。
|
||||
func (c *httpTCPConn) Read(b []byte) (n int, err error) {
|
||||
return c.r.Read(b)
|
||||
}
|
||||
|
||||
// 重写了 Read 接口
|
||||
// 由于 http 协议问题,解析响应需要读缓冲,所以必须重写 Read 来兼容读缓冲功能。
|
||||
func (c *httpTCPConn) Close() error {
|
||||
@@ -318,6 +317,6 @@ func (c *httpTCPConn) ProxyClient() ProxyClient {
|
||||
return c.proxyClient
|
||||
}
|
||||
|
||||
func (p *httpProxyClient)GetProxyAddrQuery() map[string][]string {
|
||||
func (p *httpProxyClient) GetProxyAddrQuery() map[string][]string {
|
||||
return p.query
|
||||
}
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
package proxyclient
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
const (CONNECT = "CONNECT")
|
||||
const (
|
||||
CONNECT = "CONNECT"
|
||||
)
|
||||
|
||||
// 伪装成为一个代理服务器。
|
||||
func testHTTPProixyServer(t *testing.T, proxyAddr string, rAddr string, ci chan int) {
|
||||
@@ -29,7 +31,7 @@ func testHTTPProixyServer(t *testing.T, proxyAddr string, rAddr string, ci chan
|
||||
|
||||
if _, err := c.Read(b); err != nil {
|
||||
t.Fatalf("读错误:%v", err)
|
||||
}/*else {
|
||||
} /*else {
|
||||
b = b[:n]
|
||||
t.Log(string(b))
|
||||
}*/
|
||||
@@ -48,23 +50,19 @@ func testHTTPProixyServer(t *testing.T, proxyAddr string, rAddr string, ci chan
|
||||
t.Fatalf("写数据错误")
|
||||
}
|
||||
|
||||
|
||||
if _, err := c.Read(b[:1024]); err != nil {
|
||||
t.Fatalf("读错误:%v", err)
|
||||
}/*else {
|
||||
} /*else {
|
||||
b = b[:n]
|
||||
print(b)
|
||||
}*/
|
||||
|
||||
|
||||
if _, err := c.Write([]byte("HTTP/1.0 200 ok\r\nHead1:11111\r\n\r\nHello Word!")); err != nil {
|
||||
t.Fatalf("写数据错误")
|
||||
}
|
||||
|
||||
c.Close()
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
func TestHttpProxy(t *testing.T) {
|
||||
@@ -89,7 +87,7 @@ func TestHttpProxy(t *testing.T) {
|
||||
b := make([]byte, 1024)
|
||||
if n, err := c.Read(b); err != nil {
|
||||
t.Fatalf("响应读取错误:%v", err)
|
||||
}else {
|
||||
} else {
|
||||
b = b[:n]
|
||||
}
|
||||
|
||||
@@ -102,4 +100,3 @@ func TestHttpProxy(t *testing.T) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Conn 用来表示连接
|
||||
@@ -53,6 +53,7 @@ type ProxyUDPConn interface {
|
||||
UDPConn
|
||||
ProxyClient() ProxyClient // 获得所属的代理
|
||||
}
|
||||
|
||||
// ProxyClient 仿 net 库接口的代理客户端
|
||||
// 支持级联代理功能,可以通过 SetUpProxy 设置上级代理。
|
||||
type ProxyClient interface {
|
||||
@@ -171,8 +172,8 @@ func NewProxyClient(addr string) (ProxyClient, error) {
|
||||
sleep := 0 * time.Millisecond
|
||||
if queryGet("sleep") != "" {
|
||||
if s, err := strconv.Atoi(queryGet("sleep")); err != nil {
|
||||
return nil,fmt.Errorf("sleep 参数错误:%v", err)
|
||||
}else {
|
||||
return nil, fmt.Errorf("sleep 参数错误:%v", err)
|
||||
} else {
|
||||
sleep = time.Duration(s) * time.Millisecond
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
socksCmdConect = 0x01
|
||||
socksCmdBind = 0x02
|
||||
socksCmdConect = 0x01
|
||||
socksCmdBind = 0x02
|
||||
socksCmdUDPAssociate = 0x03
|
||||
)
|
||||
|
||||
@@ -51,7 +51,7 @@ func newSocksProxyClient(proxyType, proxyAddr, username, password string, upProx
|
||||
}
|
||||
|
||||
if upProxy == nil {
|
||||
nUpProxy, err := newDriectProxyClient("",false,0, make(map[string][]string))
|
||||
nUpProxy, err := newDriectProxyClient("", false, 0, make(map[string][]string))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("创建直连代理错误:%v", err)
|
||||
}
|
||||
@@ -67,7 +67,7 @@ func newSocksProxyClient(proxyType, proxyAddr, username, password string, upProx
|
||||
return nil, fmt.Errorf("用户名或密码过长。")
|
||||
}
|
||||
|
||||
Socket5Authentication = make([]byte, 0, 3 + userLen + passLen)
|
||||
Socket5Authentication = make([]byte, 0, 3+userLen+passLen)
|
||||
Socket5Authentication = append(Socket5Authentication, 0x01, byte(userLen))
|
||||
Socket5Authentication = append(Socket5Authentication, []byte(username)...)
|
||||
Socket5Authentication = append(Socket5Authentication, byte(passLen))
|
||||
@@ -258,14 +258,14 @@ func socksLogin(c net.Conn, p *socksProxyClient) error {
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}else {
|
||||
} else {
|
||||
return fmt.Errorf("不被支持的代理服务器类型: %v", p.proxyType)
|
||||
}
|
||||
}
|
||||
|
||||
// 发送 socks 命令请求
|
||||
func socksSendCmdRequest(w io.Writer, p *socksProxyClient, cmd byte, raddr string) error {
|
||||
b := make([]byte, 0, 6 + len(raddr))
|
||||
b := make([]byte, 0, 6+len(raddr))
|
||||
|
||||
var port uint16
|
||||
host, portString, err := net.SplitHostPort(raddr)
|
||||
@@ -373,7 +373,7 @@ func socksSendCmdRequest(w io.Writer, p *socksProxyClient, cmd byte, raddr strin
|
||||
// 服务器应答状态码成功时 err == nil
|
||||
// 所以一般只需要判断 err 即可,不需要判断 rep
|
||||
func socksRecvCmdResponse(r io.Reader, p *socksProxyClient) (rep int, dstAddr string, dstPort uint16, bndAddr string, bndPort uint16, err error) {
|
||||
b := make([]byte, 255 + 10)
|
||||
b := make([]byte, 255+10)
|
||||
if p.proxyType == "socks4" || p.proxyType == "socks4a" {
|
||||
//ver
|
||||
if _, cerr := io.ReadFull(r, b[:1]); cerr != nil || b[0] != 0x04 {
|
||||
@@ -393,7 +393,7 @@ func socksRecvCmdResponse(r io.Reader, p *socksProxyClient) (rep int, dstAddr st
|
||||
}
|
||||
|
||||
dstPort = binary.BigEndian.Uint16(b[1:3])
|
||||
dstIP := net.IP(b[3 : 3 + 4])
|
||||
dstIP := net.IP(b[3 : 3+4])
|
||||
dstAddr = dstIP.String()
|
||||
|
||||
return
|
||||
@@ -457,6 +457,6 @@ func socksRecvCmdResponse(r io.Reader, p *socksProxyClient) (rep int, dstAddr st
|
||||
}
|
||||
}
|
||||
|
||||
func (p *socksProxyClient)GetProxyAddrQuery() map[string][]string {
|
||||
func (p *socksProxyClient) GetProxyAddrQuery() map[string][]string {
|
||||
return p.query
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,183 +1,183 @@
|
||||
package proxyclient
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"io"
|
||||
"net"
|
||||
"testing"
|
||||
"time"
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"io"
|
||||
"net"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func testSocks5ProixyServer(t *testing.T, proxyAddr string, usernameAndPassword []byte, attypAddr []byte, port uint16, ci chan int) {
|
||||
b := make([]byte, 30)
|
||||
l, err := net.Listen("tcp", proxyAddr)
|
||||
if err != nil {
|
||||
t.Fatalf("错误,%v", err)
|
||||
}
|
||||
b := make([]byte, 30)
|
||||
l, err := net.Listen("tcp", proxyAddr)
|
||||
if err != nil {
|
||||
t.Fatalf("错误,%v", err)
|
||||
}
|
||||
|
||||
ci <- 1
|
||||
ci <- 1
|
||||
|
||||
c, err := l.Accept()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
c, err := l.Accept()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(usernameAndPassword) == 0 {
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], []byte{0x05, 0x01, 0x00}) != true {
|
||||
t.Fatal("鉴定请求错误:", err)
|
||||
}
|
||||
if len(usernameAndPassword) == 0 {
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], []byte{0x05, 0x01, 0x00}) != true {
|
||||
t.Fatal("鉴定请求错误:", err)
|
||||
}
|
||||
|
||||
if _, err := c.Write([]byte{0x05, 0x00}); err != nil {
|
||||
t.Fatalf("回应鉴定错误:%v", err)
|
||||
}
|
||||
} else {
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], []byte{0x05, 0x01, 0x02}) != true {
|
||||
t.Fatalf("鉴定请求错误:%v", err)
|
||||
}
|
||||
if _, err := c.Write([]byte{0x05, 0x00}); err != nil {
|
||||
t.Fatalf("回应鉴定错误:%v", err)
|
||||
}
|
||||
} else {
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], []byte{0x05, 0x01, 0x02}) != true {
|
||||
t.Fatalf("鉴定请求错误:%v", err)
|
||||
}
|
||||
|
||||
if _, err := c.Write([]byte{0x05, 0x02}); err != nil {
|
||||
t.Fatalf("回应鉴定错误:%v", err)
|
||||
}
|
||||
if _, err := c.Write([]byte{0x05, 0x02}); err != nil {
|
||||
t.Fatalf("回应鉴定错误:%v", err)
|
||||
}
|
||||
|
||||
if n, err := c.Read(b); err != nil || b[0] != 0x01 || bytes.Equal(b[1:n], usernameAndPassword) != true {
|
||||
t.Fatalf("用户名密码错误:%v", err)
|
||||
}
|
||||
if n, err := c.Read(b); err != nil || b[0] != 0x01 || bytes.Equal(b[1:n], usernameAndPassword) != true {
|
||||
t.Fatalf("用户名密码错误:%v", err)
|
||||
}
|
||||
|
||||
if _, err := c.Write([]byte{0x01, 0x00}); err != nil {
|
||||
t.Fatalf("回应登陆错误:%v", err)
|
||||
}
|
||||
}
|
||||
if _, err := c.Write([]byte{0x01, 0x00}); err != nil {
|
||||
t.Fatalf("回应登陆错误:%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 构建应该受到的请求内容
|
||||
br := make([]byte, 5 + len(attypAddr))
|
||||
n := copy(br, []byte{0x05, 0x01, 0x00})
|
||||
n = copy(br[n:], attypAddr)
|
||||
binary.BigEndian.PutUint16(br[n + 3:], port)
|
||||
// 构建应该受到的请求内容
|
||||
br := make([]byte, 5+len(attypAddr))
|
||||
n := copy(br, []byte{0x05, 0x01, 0x00})
|
||||
n = copy(br[n:], attypAddr)
|
||||
binary.BigEndian.PutUint16(br[n+3:], port)
|
||||
|
||||
// 接收命令请求
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], br) != true {
|
||||
t.Fatalf("请求命令错误:%v,%v!=%v", err, br, b[:n])
|
||||
}
|
||||
// 接收命令请求
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], br) != true {
|
||||
t.Fatalf("请求命令错误:%v,%v!=%v", err, br, b[:n])
|
||||
}
|
||||
|
||||
// 发出回应
|
||||
if _, err := c.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x1, 0x2, 0x3, 0x4, 0x80, 0x80}); err != nil {
|
||||
t.Fatalf("请求回应错误:%v", err)
|
||||
}
|
||||
// 发出回应
|
||||
if _, err := c.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x1, 0x2, 0x3, 0x4, 0x80, 0x80}); err != nil {
|
||||
t.Fatalf("请求回应错误:%v", err)
|
||||
}
|
||||
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], B1) != true {
|
||||
t.Fatalf("B1不正确。err=%v,B1=%v,b=%v", err, B1, b[:n])
|
||||
}
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], B1) != true {
|
||||
t.Fatalf("B1不正确。err=%v,B1=%v,b=%v", err, B1, b[:n])
|
||||
}
|
||||
|
||||
// 发出B2
|
||||
if _, err := c.Write(B2); err != nil {
|
||||
t.Fatalf("B2 发送错误:%v", err)
|
||||
}
|
||||
// 发出B2
|
||||
if _, err := c.Write(B2); err != nil {
|
||||
t.Fatalf("B2 发送错误:%v", err)
|
||||
}
|
||||
|
||||
if v, ok := c.(TCPConn); ok != true {
|
||||
t.Fatalf("类型不匹配错误。")
|
||||
} else {
|
||||
v.SetLinger(5)
|
||||
}
|
||||
c.Close()
|
||||
if v, ok := c.(TCPConn); ok != true {
|
||||
t.Fatalf("类型不匹配错误。")
|
||||
} else {
|
||||
v.SetLinger(5)
|
||||
}
|
||||
c.Close()
|
||||
|
||||
}
|
||||
|
||||
func testSocks5ProxyClient(t *testing.T, proxyAddr string, addr string) {
|
||||
b := make([]byte, 30)
|
||||
p, err := NewProxyClient(proxyAddr)
|
||||
if err != nil {
|
||||
t.Fatal("启动代理错误:", err)
|
||||
}
|
||||
b := make([]byte, 30)
|
||||
p, err := NewProxyClient(proxyAddr)
|
||||
if err != nil {
|
||||
t.Fatal("启动代理错误:", err)
|
||||
}
|
||||
|
||||
c, err := p.DialTimeout("tcp", addr, 5 * time.Second)
|
||||
if err != nil {
|
||||
t.Fatal("通过代理建立连接错误:", err, "proxyAddr:", proxyAddr, "addr:", addr)
|
||||
}
|
||||
c, err := p.DialTimeout("tcp", addr, 5*time.Second)
|
||||
if err != nil {
|
||||
t.Fatal("通过代理建立连接错误:", err, "proxyAddr:", proxyAddr, "addr:", addr)
|
||||
}
|
||||
|
||||
// 发出B1
|
||||
if _, err := c.Write(B1); err != nil {
|
||||
t.Fatal("B1 发送错误:", err)
|
||||
}
|
||||
// 发出B1
|
||||
if _, err := c.Write(B1); err != nil {
|
||||
t.Fatal("B1 发送错误:", err)
|
||||
}
|
||||
|
||||
//接收B2
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], B2) != true {
|
||||
t.Fatalf("B2不正确。err=%v,B1=%v,b=%v", err, B2, b[:n])
|
||||
}
|
||||
//接收B2
|
||||
if n, err := c.Read(b); err != nil || bytes.Equal(b[:n], B2) != true {
|
||||
t.Fatalf("B2不正确。err=%v,B1=%v,b=%v", err, B2, b[:n])
|
||||
}
|
||||
|
||||
if _, err := c.Read(b); err != io.EOF {
|
||||
t.Fatal("读EOF错误。err=", err)
|
||||
}
|
||||
if _, err := c.Read(b); err != io.EOF {
|
||||
t.Fatal("读EOF错误。err=", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSocksProxy(t *testing.T) {
|
||||
ci := make(chan int)
|
||||
b := make([]byte, 0, 30)
|
||||
ci := make(chan int)
|
||||
b := make([]byte, 0, 30)
|
||||
|
||||
// 测试域名
|
||||
addr := "www.163.com"
|
||||
// 测试域名
|
||||
addr := "www.163.com"
|
||||
|
||||
b = append(b, 0x03, byte(len(addr)))
|
||||
b = append(b, []byte(addr)...)
|
||||
b = append(b, 0x03, byte(len(addr)))
|
||||
b = append(b, []byte(addr)...)
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13337", nil, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://127.0.0.1:13337", "www.163.com:80")
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13337", nil, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://127.0.0.1:13337", "www.163.com:80")
|
||||
|
||||
// 测试 ipv4
|
||||
addr = "1.2.3.4"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x01)
|
||||
b = append(b, []byte(net.ParseIP(addr).To4())...)
|
||||
// 测试 ipv4
|
||||
addr = "1.2.3.4"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x01)
|
||||
b = append(b, []byte(net.ParseIP(addr).To4())...)
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13338", nil, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://127.0.0.1:13338", "1.2.3.4:80")
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13338", nil, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://127.0.0.1:13338", "1.2.3.4:80")
|
||||
|
||||
// 测试 ipv6
|
||||
addr = "1:2:3:4::5:6"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x04)
|
||||
b = append(b, []byte(net.ParseIP(addr))...)
|
||||
// 测试 ipv6
|
||||
addr = "1:2:3:4::5:6"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x04)
|
||||
b = append(b, []byte(net.ParseIP(addr))...)
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13339", nil, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://127.0.0.1:13339", "[1:2:3:4::5:6]:80")
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13339", nil, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://127.0.0.1:13339", "[1:2:3:4::5:6]:80")
|
||||
}
|
||||
|
||||
func TestSocksProxyA(t *testing.T) {
|
||||
ci := make(chan int)
|
||||
b := make([]byte, 0, 30)
|
||||
ci := make(chan int)
|
||||
b := make([]byte, 0, 30)
|
||||
|
||||
userAndPass := []byte{0x04, 'u', 's', 'e', 'r', 0x04, 'p', 'a', 's', 's'}
|
||||
userAndPass := []byte{0x04, 'u', 's', 'e', 'r', 0x04, 'p', 'a', 's', 's'}
|
||||
|
||||
// 测试域名
|
||||
addr := "www.163.com"
|
||||
// 测试域名
|
||||
addr := "www.163.com"
|
||||
|
||||
b = append(b, 0x03, byte(len(addr)))
|
||||
b = append(b, []byte(addr)...)
|
||||
b = append(b, 0x03, byte(len(addr)))
|
||||
b = append(b, []byte(addr)...)
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13347", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13347", "www.163.com:80")
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13347", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13347", "www.163.com:80")
|
||||
|
||||
// 测试 ipv4
|
||||
addr = "1.2.3.4"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x01)
|
||||
b = append(b, []byte(net.ParseIP(addr).To4())...)
|
||||
// 测试 ipv4
|
||||
addr = "1.2.3.4"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x01)
|
||||
b = append(b, []byte(net.ParseIP(addr).To4())...)
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13348", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13348", "1.2.3.4:80")
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13348", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13348", "1.2.3.4:80")
|
||||
|
||||
// 测试 ipv6
|
||||
addr = "1:2:3:4::5:6"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x04)
|
||||
b = append(b, []byte(net.ParseIP(addr))...)
|
||||
// 测试 ipv6
|
||||
addr = "1:2:3:4::5:6"
|
||||
b = b[0:0]
|
||||
b = append(b, 0x04)
|
||||
b = append(b, []byte(net.ParseIP(addr))...)
|
||||
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13349", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13349", "[1:2:3:4::5:6]:80")
|
||||
go testSocks5ProixyServer(t, "127.0.0.1:13349", userAndPass, b, 80, ci)
|
||||
<-ci
|
||||
testSocks5ProxyClient(t, "socks5://user:pass@127.0.0.1:13349", "[1:2:3:4::5:6]:80")
|
||||
}
|
||||
|
||||
17
ssproxy.go
17
ssproxy.go
@@ -1,12 +1,12 @@
|
||||
package proxyclient
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
|
||||
"net"
|
||||
"fmt"
|
||||
"errors"
|
||||
"time"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type ssTCPConn struct {
|
||||
@@ -35,7 +35,7 @@ func newSsProxyClient(proxyAddr, method, password string, upProxy ProxyClient, q
|
||||
}
|
||||
|
||||
if upProxy == nil {
|
||||
nUpProxy, err := newDriectProxyClient("",false,0, make(map[string][]string))
|
||||
nUpProxy, err := newDriectProxyClient("", false, 0, make(map[string][]string))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("创建直连代理错误:%v", err)
|
||||
}
|
||||
@@ -50,7 +50,6 @@ func newSsProxyClient(proxyAddr, method, password string, upProxy ProxyClient, q
|
||||
return &p, nil
|
||||
}
|
||||
|
||||
|
||||
func (p *ssProxyClient) Dial(network, address string) (net.Conn, error) {
|
||||
if strings.HasPrefix(strings.ToLower(network), "tcp") {
|
||||
return p.DialTCPSAddr(network, address)
|
||||
@@ -107,7 +106,6 @@ func (p *ssProxyClient) DialTCPSAddrTimeout(network string, raddr string, timeou
|
||||
ch := make(chan int)
|
||||
defer close(ch)
|
||||
|
||||
|
||||
// 实际执行部分
|
||||
run := func() {
|
||||
sc := ss.NewConn(c, p.cipher.Copy())
|
||||
@@ -121,7 +119,6 @@ func (p *ssProxyClient) DialTCPSAddrTimeout(network string, raddr string, timeou
|
||||
}
|
||||
}()
|
||||
|
||||
|
||||
if _, err := sc.Write(ra); err != nil {
|
||||
closed = true
|
||||
sc.Close()
|
||||
@@ -130,7 +127,7 @@ func (p *ssProxyClient) DialTCPSAddrTimeout(network string, raddr string, timeou
|
||||
return
|
||||
}
|
||||
|
||||
r := ssTCPConn{TCPConn: c, sc:sc, proxyClient: p} //{c,net.ResolveTCPAddr("tcp","0.0.0.0:0"),net.ResolveTCPAddr("tcp","0.0.0.0:0"),"","",0,0 p}
|
||||
r := ssTCPConn{TCPConn: c, sc: sc, proxyClient: p} //{c,net.ResolveTCPAddr("tcp","0.0.0.0:0"),net.ResolveTCPAddr("tcp","0.0.0.0:0"),"","",0,0 p}
|
||||
|
||||
rconn = &r
|
||||
ch <- 1
|
||||
@@ -198,6 +195,6 @@ func (c *ssUDPConn) ProxyClient() ProxyClient {
|
||||
return c.proxyClient
|
||||
}
|
||||
|
||||
func (p *ssProxyClient)GetProxyAddrQuery() map[string][]string {
|
||||
func (p *ssProxyClient) GetProxyAddrQuery() map[string][]string {
|
||||
return p.query
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
package proxyclient
|
||||
|
||||
import (
|
||||
"net"
|
||||
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
|
||||
"testing"
|
||||
"bytes"
|
||||
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
|
||||
"net"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
||||
func TestSsProxy(t *testing.T) {
|
||||
|
||||
// 测试域名
|
||||
@@ -49,7 +48,7 @@ func TestSsProxy(t *testing.T) {
|
||||
buf := make([]byte, 1024)
|
||||
if n, err := sc.Read(buf); err != nil {
|
||||
t.Fatal("i=", i, "服务器读内容错误:", err)
|
||||
}else {
|
||||
} else {
|
||||
if _, err := sc.Write(buf[:n]); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -63,7 +62,7 @@ func TestSsProxy(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
c, err := p.DialTimeout("tcp", testAddr,1*time.Second)
|
||||
c, err := p.DialTimeout("tcp", testAddr, 1*time.Second)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -73,7 +72,7 @@ func TestSsProxy(t *testing.T) {
|
||||
buf := make([]byte, 1024)
|
||||
if n, err := c.Read(buf); err != nil {
|
||||
t.Fatal("读地址错误:", err)
|
||||
}else {
|
||||
} else {
|
||||
if bytes.Compare(buf[:n], testRawAddr) != 0 {
|
||||
t.Fatal("地址未正确发送")
|
||||
}
|
||||
@@ -86,7 +85,7 @@ func TestSsProxy(t *testing.T) {
|
||||
|
||||
if n, err := c.Read(buf); err != nil {
|
||||
t.Fatal(err)
|
||||
}else {
|
||||
} else {
|
||||
if bytes.Compare(buf[:n], testData) != 0 {
|
||||
t.Fatal("数据未正确发送")
|
||||
}
|
||||
|
||||
272
ttl/ttl.go
272
ttl/ttl.go
@@ -1,6 +1,5 @@
|
||||
package main
|
||||
|
||||
|
||||
/*
|
||||
|
||||
ttl 反劫持功能
|
||||
@@ -15,166 +14,165 @@ ttl 反劫持功能
|
||||
|
||||
*/
|
||||
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/google/gopacket"
|
||||
"github.com/google/gopacket/pcap"
|
||||
"github.com/google/gopacket/layers"
|
||||
"net"
|
||||
"os"
|
||||
"sync"
|
||||
"fmt"
|
||||
"github.com/google/gopacket"
|
||||
"github.com/google/gopacket/layers"
|
||||
"github.com/google/gopacket/pcap"
|
||||
"net"
|
||||
"os"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func main() {
|
||||
devs, err := pcap.FindAllDevs()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
devs, err := pcap.FindAllDevs()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
wg := sync.WaitGroup{}
|
||||
for _, dev := range devs {
|
||||
wg.Add(1)
|
||||
dev := dev
|
||||
fmt.Println("开始混淆:")
|
||||
fmt.Println(dev.Name)
|
||||
fmt.Println(dev.Addresses)
|
||||
fmt.Println(dev.Description)
|
||||
fmt.Println("")
|
||||
fmt.Println("")
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
capturePacket(dev.Name)
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
wg := sync.WaitGroup{}
|
||||
for _, dev := range devs {
|
||||
wg.Add(1)
|
||||
dev := dev
|
||||
fmt.Println("开始混淆:")
|
||||
fmt.Println(dev.Name)
|
||||
fmt.Println(dev.Addresses)
|
||||
fmt.Println(dev.Description)
|
||||
fmt.Println("")
|
||||
fmt.Println("")
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
capturePacket(dev.Name)
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func capturePacket(deviceName string) {
|
||||
if handle, err := pcap.OpenLive(deviceName, 1600, false, pcap.BlockForever); err != nil {
|
||||
fmt.Println("监听失败,请确认安装了 pacp 库。详细信息:", err)
|
||||
os.Exit(-1)
|
||||
// 捕获所有 源端口是 80 的 SYN、ACK 包
|
||||
} else if err := handle.SetBPFFilter("tcp and src port 80 and tcp[13] == 0x12"); err != nil {
|
||||
// } else if err := handle.SetBPFFilter("tcp and ((dst port 80 and tcp[13] == 0x02)or (src port 80 and tcp[13] == 0x12))"); err != nil { // optional
|
||||
panic(err)
|
||||
} else {
|
||||
defer handle.Close()
|
||||
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
|
||||
for packet := range packetSource.Packets() {
|
||||
handlePacket(handle, packet)
|
||||
}
|
||||
}
|
||||
if handle, err := pcap.OpenLive(deviceName, 1600, false, pcap.BlockForever); err != nil {
|
||||
fmt.Println("监听失败,请确认安装了 pacp 库。详细信息:", err)
|
||||
os.Exit(-1)
|
||||
// 捕获所有 源端口是 80 的 SYN、ACK 包
|
||||
} else if err := handle.SetBPFFilter("tcp and src port 80 and tcp[13] == 0x12"); err != nil {
|
||||
// } else if err := handle.SetBPFFilter("tcp and ((dst port 80 and tcp[13] == 0x02)or (src port 80 and tcp[13] == 0x12))"); err != nil { // optional
|
||||
panic(err)
|
||||
} else {
|
||||
defer handle.Close()
|
||||
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
|
||||
for packet := range packetSource.Packets() {
|
||||
handlePacket(handle, packet)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func handlePacket(handle *pcap.Handle, packet gopacket.Packet) {
|
||||
ethLayer := packet.LinkLayer()
|
||||
if ethLayer == nil {
|
||||
return
|
||||
}
|
||||
eth, ok := ethLayer.(*layers.Ethernet)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
ethLayer := packet.LinkLayer()
|
||||
if ethLayer == nil {
|
||||
return
|
||||
}
|
||||
eth, ok := ethLayer.(*layers.Ethernet)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
ipLayer := packet.NetworkLayer()
|
||||
if ipLayer == nil {
|
||||
return
|
||||
}
|
||||
ipLayer := packet.NetworkLayer()
|
||||
if ipLayer == nil {
|
||||
return
|
||||
}
|
||||
|
||||
ip, ok := ipLayer.(*layers.IPv4)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
ip, ok := ipLayer.(*layers.IPv4)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
tcpLayer := packet.Layer(layers.LayerTypeTCP)
|
||||
if tcpLayer == nil {
|
||||
return
|
||||
}
|
||||
tcp, ok := tcpLayer.(*layers.TCP)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
tcpLayer := packet.Layer(layers.LayerTypeTCP)
|
||||
if tcpLayer == nil {
|
||||
return
|
||||
}
|
||||
tcp, ok := tcpLayer.(*layers.TCP)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
// 服务器回应 SYN 请求
|
||||
if tcp.SYN == true && tcp.ACK == true {
|
||||
ttl := uint8(0)
|
||||
// 服务器回应 SYN 请求
|
||||
if tcp.SYN == true && tcp.ACK == true {
|
||||
ttl := uint8(0)
|
||||
|
||||
switch {
|
||||
case ip.TTL > 128:
|
||||
//Solaris/AIX
|
||||
ttl = 254 - ip.TTL
|
||||
case ip.TTL > 64:
|
||||
// windows
|
||||
ttl = 128 - ip.TTL
|
||||
default:
|
||||
// linux
|
||||
ttl = 64 - ip.TTL
|
||||
}
|
||||
switch {
|
||||
case ip.TTL > 128:
|
||||
//Solaris/AIX
|
||||
ttl = 254 - ip.TTL
|
||||
case ip.TTL > 64:
|
||||
// windows
|
||||
ttl = 128 - ip.TTL
|
||||
default:
|
||||
// linux
|
||||
ttl = 64 - ip.TTL
|
||||
}
|
||||
|
||||
switch {
|
||||
case ttl > 10:
|
||||
ttl -= 4
|
||||
case ttl > 5:
|
||||
ttl -= 2
|
||||
case ttl > 2:
|
||||
ttl -= 1
|
||||
default:
|
||||
return
|
||||
}
|
||||
switch {
|
||||
case ttl > 10:
|
||||
ttl -= 4
|
||||
case ttl > 5:
|
||||
ttl -= 2
|
||||
case ttl > 2:
|
||||
ttl -= 1
|
||||
default:
|
||||
return
|
||||
}
|
||||
|
||||
ack := tcp.Seq + uint32(len(tcp.Payload)) + 1
|
||||
data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
|
||||
seq := tcp.Ack
|
||||
sendPacket(handle, eth.DstMAC, eth.SrcMAC, ip.DstIP, ip.SrcIP, tcp.DstPort, tcp.SrcPort, ip.Id + 123, ttl, seq, ack, 258, data)
|
||||
seq += 2048
|
||||
sendPacket(handle, eth.DstMAC, eth.SrcMAC, ip.DstIP, ip.SrcIP, tcp.DstPort, tcp.SrcPort, ip.Id + 123, ttl, seq, ack, 258, nil)
|
||||
//go fmt.Printf("伪重置 %v:%v 的 tcp 连接。\r\n", ip.SrcIP, tcp.SrcPort)
|
||||
}
|
||||
ack := tcp.Seq + uint32(len(tcp.Payload)) + 1
|
||||
data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
|
||||
seq := tcp.Ack
|
||||
sendPacket(handle, eth.DstMAC, eth.SrcMAC, ip.DstIP, ip.SrcIP, tcp.DstPort, tcp.SrcPort, ip.Id+123, ttl, seq, ack, 258, data)
|
||||
seq += 2048
|
||||
sendPacket(handle, eth.DstMAC, eth.SrcMAC, ip.DstIP, ip.SrcIP, tcp.DstPort, tcp.SrcPort, ip.Id+123, ttl, seq, ack, 258, nil)
|
||||
//go fmt.Printf("伪重置 %v:%v 的 tcp 连接。\r\n", ip.SrcIP, tcp.SrcPort)
|
||||
}
|
||||
}
|
||||
|
||||
func sendPacket(handle *pcap.Handle, sMac, dMac net.HardwareAddr, sIp, dIp net.IP, sPort, dPort layers.TCPPort, IpId uint16, IpTtl uint8, TcpSeq, ack uint32, WindowsSize uint16, data []byte) error {
|
||||
eth := layers.Ethernet{
|
||||
SrcMAC: sMac,
|
||||
DstMAC: dMac,
|
||||
EthernetType: layers.EthernetTypeIPv4,
|
||||
}
|
||||
ip4 := layers.IPv4{
|
||||
SrcIP: sIp,
|
||||
DstIP: dIp,
|
||||
Id: IpId,
|
||||
Flags: layers.IPv4DontFragment,
|
||||
Version: 4,
|
||||
TTL: IpTtl,
|
||||
Protocol: layers.IPProtocolTCP,
|
||||
}
|
||||
tcp := layers.TCP{
|
||||
SrcPort: sPort,
|
||||
DstPort: dPort,
|
||||
Seq:TcpSeq,
|
||||
ACK:true,
|
||||
Ack:ack,
|
||||
Window:WindowsSize,
|
||||
PSH:true, // 立刻处理
|
||||
}
|
||||
eth := layers.Ethernet{
|
||||
SrcMAC: sMac,
|
||||
DstMAC: dMac,
|
||||
EthernetType: layers.EthernetTypeIPv4,
|
||||
}
|
||||
ip4 := layers.IPv4{
|
||||
SrcIP: sIp,
|
||||
DstIP: dIp,
|
||||
Id: IpId,
|
||||
Flags: layers.IPv4DontFragment,
|
||||
Version: 4,
|
||||
TTL: IpTtl,
|
||||
Protocol: layers.IPProtocolTCP,
|
||||
}
|
||||
tcp := layers.TCP{
|
||||
SrcPort: sPort,
|
||||
DstPort: dPort,
|
||||
Seq: TcpSeq,
|
||||
ACK: true,
|
||||
Ack: ack,
|
||||
Window: WindowsSize,
|
||||
PSH: true, // 立刻处理
|
||||
}
|
||||
|
||||
if len(data) == 0 {
|
||||
tcp.RST = true
|
||||
}
|
||||
if len(data) == 0 {
|
||||
tcp.RST = true
|
||||
}
|
||||
|
||||
tcp.SetNetworkLayerForChecksum(&ip4)
|
||||
tcp.SetNetworkLayerForChecksum(&ip4)
|
||||
|
||||
buf := gopacket.NewSerializeBuffer()
|
||||
opts := gopacket.SerializeOptions{
|
||||
FixLengths: true,
|
||||
ComputeChecksums: true,
|
||||
}
|
||||
buf := gopacket.NewSerializeBuffer()
|
||||
opts := gopacket.SerializeOptions{
|
||||
FixLengths: true,
|
||||
ComputeChecksums: true,
|
||||
}
|
||||
|
||||
payload := gopacket.Payload(data)
|
||||
payload := gopacket.Payload(data)
|
||||
|
||||
if err := gopacket.SerializeLayers(buf, opts, ð, &ip4, &tcp, payload); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := gopacket.SerializeLayers(buf, opts, ð, &ip4, &tcp, payload); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return handle.WritePacketData(buf.Bytes())
|
||||
}
|
||||
return handle.WritePacketData(buf.Bytes())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user