修复一个判断是否为加密包的严重错误

This commit is contained in:
dmy@lab 2015-11-18 20:24:39 +08:00
parent 6eb855ee9a
commit fc214b2c72
6 changed files with 93 additions and 13 deletions

73
benckmark.go Normal file
View File

@ -0,0 +1,73 @@
package main
import (
llog "github.com/TransX/log"
"github.com/davecheney/profile"
"io/ioutil"
"log"
"math/rand"
"net/http"
"sync"
"time"
)
var mux sync.Mutex
var benchSeed int
func transClient() {
t := NewTransTCP()
t.Start("1200", "127.0.0.1", "1201", "client")
}
func transServer() {
t := NewTransTCP()
t.Start("1201", "192.168.56.101", "80", "server")
}
func doHttp(c chan int) {
resp, err := http.Get("http://127.0.0.1:1200/test.bin")
if err != nil {
log.Println("could not get:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
log.Printf("got %d bytes\n", len(body))
if err != nil {
log.Println("not get:", err)
} else {
}
c <- 0
}
func randMillionSecond() time.Duration {
mux.Lock()
benchSeed++
defer mux.Unlock()
s := rand.NewSource(int64(benchSeed))
r := rand.New(s)
return time.Duration(r.Int() % 1000)
}
func attack() {
c := make(chan int)
for i := 0; i < 10; i++ {
time.Sleep(time.Millisecond * randMillionSecond())
go doHttp(c)
}
for i := 0; i < 10; i++ {
<-c
}
log.Println("Finish")
}
func main() {
llog.LogTo("applog/log.txt", "DEBUG")
defer profile.Start(profile.CPUProfile).Stop()
benchSeed = 0
go transClient()
go transServer()
attack()
}

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"github.com/TransX/cli" "github.com/TransX/cli"
"github.com/TransX/log" "github.com/TransX/log"
"github.com/davecheney/profile"
"strconv" "strconv"
) )
@ -22,6 +23,7 @@ func tunnel() {
} }
func main() { func main() {
defer profile.Start(profile.CPUProfile).Stop()
flag.Parse() flag.Parse()
fmt.Println("Hello World!") fmt.Println("Hello World!")
log.LogTo(cli.LogTo, "INFO") log.LogTo(cli.LogTo, "INFO")

View File

@ -181,7 +181,7 @@ func clientBin(t *testing.T) {
} }
log.Info("Test Client Receive %s", bytes[:n]) log.Info("Test Client Receive %s", bytes[:n])
fmt.Println("Test Client Receive ", string(bytes[:n])) fmt.Println("Test Client Receive ", string(bytes[:n]))
// time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
conn.Close() conn.Close()
log.Info("Test Client closed") log.Info("Test Client closed")
@ -220,7 +220,7 @@ func clientText(t *testing.T) {
} }
func TestTunnel(t *testing.T) { func TestTunnel(t *testing.T) {
log.LogTo("log.txt", "DEBUG") log.LogTo("stdout", "ERROR")
log.Info("Test Start testing.") log.Info("Test Start testing.")
go serverBin(t) go serverBin(t)
go clientBin(t) go clientBin(t)

View File

@ -1 +1 @@
.\TransX -destip 191.101.11.132 -destport 8321 -listenport 1082 -encrypt server -log applog/server.log .\TransX -destip 127.0.0.1 -destport 1084 -listenport 1082 -encrypt server -log applog/server.log

View File

@ -2,6 +2,7 @@ package tscipher
import ( import (
"bytes" "bytes"
"fmt"
"github.com/TransX/log" "github.com/TransX/log"
"github.com/TransX/utils" "github.com/TransX/utils"
"io" "io"
@ -82,8 +83,9 @@ func WrapPackage(data []byte) []byte { //把要加密传输的数据打包成一
sizeOfData := len(data) sizeOfData := len(data)
binSize := utils.Int2binary(sizeOfData, 10) binSize := utils.Int2binary(sizeOfData, 10)
header := append(append(StartMark, binSize...), EndMark...) header := append(append(StartMark, binSize...), EndMark...)
// log.Error("size of header %d %x", len(header), header)
//加密 //加密
key := []byte("hahahehe~-1!") key := []byte("#2GD+.>dt`Qdp")
key = key key = key
cipheredHeader := make([]byte, len(header)) cipheredHeader := make([]byte, len(header))
for i, v := range header { for i, v := range header {
@ -96,11 +98,13 @@ func UnwrapPackage(pacakge []byte) (data []byte, rest []byte, err error) {
//前14个字节是header //前14个字节是header
cipheredHeader := pacakge[:18] cipheredHeader := pacakge[:18]
header := make([]byte, len(cipheredHeader)) header := make([]byte, len(cipheredHeader))
key := []byte("hahahehe~-1!") key := []byte("#2GD+.>dt`Qdp")
key = key key = key
for i, v := range cipheredHeader { for i, v := range cipheredHeader {
header[i] = v ^ key[i%len(key)] header[i] = v ^ key[i%len(key)]
} }
// log.Error("receive header %d %x", len(header), header)
// log.Error("receive pacakge %d %x", len(pacakge[:180]), pacakge[:180])
start := header[:4] start := header[:4]
end := header[14:] end := header[14:]
binSize := header[4:14] binSize := header[4:14]
@ -126,7 +130,7 @@ func UnwrapPackage(pacakge []byte) (data []byte, rest []byte, err error) {
b := strings.Index(string(pacakge), "_=1z") b := strings.Index(string(pacakge), "_=1z")
err = &NotPackageError{"NotPackageError(contains)" + "start:" + string(start) + " end:" + string(end) + "pacakge " + strconv.Itoa(len(pacakge)) + "start" + strconv.Itoa(a) + "end" + strconv.Itoa(b)} err = &NotPackageError{"NotPackageError(contains)" + "start:" + string(start) + " end:" + string(end) + "pacakge " + strconv.Itoa(len(pacakge)) + "start" + strconv.Itoa(a) + "end" + strconv.Itoa(b)}
} else { } else {
err = &NotPackageError{"NotPackageError" + "start:" + string(start) + " end:" + string(end)} err = &NotPackageError{fmt.Sprintf("NotPackageError start: %s end: %s whole %x", string(start), string(end), header)}
} }
} }
return return
@ -164,11 +168,11 @@ func RowReceiveData(carrier *Carrier) (n int, err error) {
} }
func ReceiveData(carrier *Carrier) (n int, err error) { func ReceiveData(carrier *Carrier) (n int, err error) {
defer func() { // defer func() {
if r := recover(); r != nil { // if r := recover(); r != nil {
log.Error("ReceiveData err %s", r) // log.Error("ReceiveData err %s", r)
} // }
}() // }()
log.Info("id %s wrapedPackage := carrier.GetReceiveBuff()", carrier.AttachedTunnelID) log.Info("id %s wrapedPackage := carrier.GetReceiveBuff()", carrier.AttachedTunnelID)
wrapedPackage := carrier.GetReceiveBuff() //make([]byte, 0, cap(carrier.Cache)) wrapedPackage := carrier.GetReceiveBuff() //make([]byte, 0, cap(carrier.Cache))
var packageData []byte var packageData []byte
@ -178,7 +182,8 @@ func ReceiveData(carrier *Carrier) (n int, err error) {
data, rest, err := UnwrapPackage(wrapedPackage) data, rest, err := UnwrapPackage(wrapedPackage)
packageData = data packageData = data
_rest = rest _rest = rest
if err, ok := err.(*NotPackageError); len(wrapedPackage) > 0 && ok { if err, ok := err.(*NotPackageError); len(wrapedPackage) >= 18 && ok {
log.Debug("return NotPackageError %s", carrier.AttachedTunnelID)
return 0, err return 0, err
} }
log.Debug("id %s length of package %d", carrier.AttachedTunnelID, len(packageData)) log.Debug("id %s length of package %d", carrier.AttachedTunnelID, len(packageData))

View File

@ -83,7 +83,7 @@ func (this *Tunnel) run() { //单向的从src发送到dest
if err != nil { if err != nil {
log.Panic("Write panic. ID: %s, Err: %s, Remote Add: %s", id, err, dest.RemoteAddr().String()) log.Panic("Write panic. ID: %s, Err: %s, Remote Add: %s", id, err, dest.RemoteAddr().String())
} }
log.Info("Write %d bytes from %s to %s. Tunnel: %s . 18 bytes", n, dest.LocalAddr(), dest.RemoteAddr().String(), id, string(sendCarrier.Cache[:18])) log.Info("Write %d bytes from %s to %s. Tunnel: %s . 18 bytes %x", n, dest.LocalAddr(), dest.RemoteAddr().String(), id, sendCarrier.Cache[:18])
} }
} }