使用 gofmt 格式化代码,idea 格式化居然和 gofmt不兼容...

This commit is contained in:
GameXG
2016-05-15 18:33:12 +08:00
parent 2714ebc030
commit 1b2d224463
13 changed files with 354 additions and 361 deletions

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -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()
}
}

View File

@@ -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()
}
}

View File

@@ -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")

View File

@@ -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
}

View File

@@ -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) {
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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=%vB1=%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=%vB1=%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=%vB1=%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=%vB1=%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")
}

View File

@@ -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
}
}

View File

@@ -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("数据未正确发送")
}

View File

@@ -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, &eth, &ip4, &tcp, payload); err != nil {
return err
}
if err := gopacket.SerializeLayers(buf, opts, &eth, &ip4, &tcp, payload); err != nil {
return err
}
return handle.WritePacketData(buf.Bytes())
}
return handle.WritePacketData(buf.Bytes())
}