修复bug,增加lite版本
This commit is contained in:
@@ -14,16 +14,22 @@ rakshasa是一个使用Go语言编写的强大多级代理工具,专为实现*
|
|||||||
## 项目结构示例和截图
|
## 项目结构示例和截图
|
||||||
[点击查看更多介绍](./readme/rakshasa项目设计.md)
|
[点击查看更多介绍](./readme/rakshasa项目设计.md)
|
||||||
|
|
||||||
|
[win10+Proxifier实现内网穿透](./readme/rakshasa内网穿透--win10+Proxifier使用案例.md)
|
||||||
|
|
||||||
|
|
||||||
## 编译与使用
|
## 编译与使用
|
||||||
|
|
||||||
全新生成证书与节点
|
生成新的证书,编译所有版本节点
|
||||||
```shell
|
```shell
|
||||||
go run build.go -all
|
go run build.go -all
|
||||||
```
|
```
|
||||||
|
|
||||||
只生成证书
|
编译所有版本节点(不更新证书)
|
||||||
|
```shell
|
||||||
|
go run build.go -all -nocert
|
||||||
|
```
|
||||||
|
|
||||||
|
生成覆盖证书
|
||||||
```shell
|
```shell
|
||||||
go run build.go -gencert
|
go run build.go -gencert
|
||||||
```
|
```
|
||||||
@@ -38,7 +44,7 @@ go run build.go -fullnode
|
|||||||
go run build.go -node
|
go run build.go -node
|
||||||
```
|
```
|
||||||
|
|
||||||
证书保存在cert目录下
|
证书保存在cert目录下,可以使用第三方工具生成,请使用RSA PKCS1-V1.5
|
||||||
```shell
|
```shell
|
||||||
private.go --编译普通节点的时候要删除此文件
|
private.go --编译普通节点的时候要删除此文件
|
||||||
private.pem --与public.pem对应的公钥私钥,普通节点不包含私钥
|
private.pem --与public.pem对应的公钥私钥,普通节点不包含私钥
|
||||||
@@ -46,6 +52,23 @@ public.pem
|
|||||||
server.crt --tls通讯证书
|
server.crt --tls通讯证书
|
||||||
server.key --tls通讯私钥
|
server.key --tls通讯私钥
|
||||||
```
|
```
|
||||||
|
## 版本区别
|
||||||
|
|
||||||
|
| | fullnode | node|fullnode_lite|node_lite|
|
||||||
|
| ---- | ---- |---- |---- |---- |
|
||||||
|
|连接其他节点 | √ |√ |√ |√ |
|
||||||
|
|启动本地socks5代理 | √ |√ |√ |√ |
|
||||||
|
|启动本地http代理 | √ |√ |√ |√ |
|
||||||
|
|启动多层代理 | √ |× |√ |× |
|
||||||
|
|远程shell| √ |× |√ |× |
|
||||||
|
|其他远程功能| √ |× |√ |× |
|
||||||
|
| 交互式CLI | √ |√ |× |× |
|
||||||
|
| check_proxy | √ |√ |× |× |
|
||||||
|
|
||||||
|
简单来讲
|
||||||
|
- fullnode 完全版,能控制别人,也能被控
|
||||||
|
- node 能连接其他节点,但是不能对其他节点操控,适合作为被控端
|
||||||
|
- lite版本,精简掉cli和net/http,与一些debug的代码
|
||||||
|
|
||||||
## 使用图示
|
## 使用图示
|
||||||

|

|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@@ -11,14 +13,29 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
all := flag.Bool("all", false, "生成新的证书,生成控制端节点和普通节点")
|
all := flag.Bool("all", false, "生成新的证书,生成控制端节点和普通节点")
|
||||||
|
nocert := flag.Bool("nocert", false, "不生成证书")
|
||||||
gencert := flag.Bool("gencert", false, "生成证书")
|
gencert := flag.Bool("gencert", false, "生成证书")
|
||||||
fullNode := flag.Bool("fullnode", false, "只编译生成控制端节点+普通节点")
|
fullNode := flag.Bool("fullnode", false, "编译生成控制端节点+普通节点")
|
||||||
node := flag.Bool("node", false, "只生成普通节点")
|
node := flag.Bool("node", false, "只生成普通节点")
|
||||||
|
fullNodeLite := flag.Bool("fullnode-lite", false, "编译生成lite版本的: 控制端节点+普通节点")
|
||||||
|
nodeLite := flag.Bool("node-lite", false, "只生成lite版本的: 普通节点")
|
||||||
|
genfullNodePrivate := flag.Bool("gen-private", false, "将private.pem转为private.go")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
if *all == true {
|
if *all == true {
|
||||||
*gencert = true
|
*gencert = true
|
||||||
*fullNode = true
|
*fullNode = true
|
||||||
*node = false
|
*node = true
|
||||||
|
*fullNodeLite = true
|
||||||
|
*nodeLite = true
|
||||||
|
}
|
||||||
|
if *nocert {
|
||||||
|
*gencert = false
|
||||||
|
}
|
||||||
|
if *genfullNodePrivate {
|
||||||
|
b, _ := os.ReadFile("./cert/private.pem")
|
||||||
|
data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b)
|
||||||
|
os.WriteFile("./cert/private.go", []byte(data), 0655)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
if *gencert {
|
if *gencert {
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
@@ -28,7 +45,7 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_, err := exec.Command("bin/bash", "-c", "cd gencert && go run main.go").CombinedOutput()
|
b, err := exec.Command("/bin/bash", "-c", "cd gencert && go run main.go").CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
|
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
|
||||||
return
|
return
|
||||||
@@ -59,27 +76,62 @@ func main() {
|
|||||||
} else if *node {
|
} else if *node {
|
||||||
os.Remove("./cert/private.go")
|
os.Remove("./cert/private.go")
|
||||||
buildNode("build_node")
|
buildNode("build_node")
|
||||||
} else {
|
}
|
||||||
|
if *fullNodeLite {
|
||||||
|
b, _ := os.ReadFile("./cert/private.pem")
|
||||||
|
data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b)
|
||||||
|
os.WriteFile("./cert/private.go", []byte(data), 0655)
|
||||||
|
buildNode("build_fullnode_lite")
|
||||||
|
} else if *nodeLite {
|
||||||
|
os.Remove("./cert/private.go")
|
||||||
|
buildNode("build_node_lite")
|
||||||
|
}
|
||||||
|
if !*gencert && !*fullNode && !*node && !*fullNodeLite && !*nodeLite && !*genfullNodePrivate {
|
||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func buildNode(name string) {
|
func buildNode(name string) {
|
||||||
if runtime.GOOS == "windows" {
|
if runtime.GOOS == "windows" {
|
||||||
cmdstr := fmt.Sprintf(`cd build && %s.bat`, name)
|
cmdstr := fmt.Sprintf(`cd build && %s.bat`, name)
|
||||||
_, err := exec.Command("cmd.exe", "/c", cmdstr).CombinedOutput()
|
err := runCommand("cmd.exe", "/c", cmdstr)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exec.Command("/bin/bash", "-c", "cd build && sudo chmod 755 "+name+".sh").CombinedOutput()
|
||||||
|
cmdstr := fmt.Sprintf(`cd build && ./%s.sh`, name)
|
||||||
|
err := runCommand("/bin/bash", "-c", cmdstr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
|
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
|
||||||
exec.Command("bin/bash", "-c", "cd build && sudo chmod 755 "+name+".sh").CombinedOutput()
|
|
||||||
cmdstr := fmt.Sprintf(`cd build && ./%s.sh`, name)
|
|
||||||
_, err := exec.Command("/bin/bash", "-c", cmdstr).CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func runCommand(name string, arg ...string) error {
|
||||||
|
cmd := exec.Command(name, arg...)
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
err = cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//创建一个流来读取管道内内容,这里逻辑是通过一行一行的读取的
|
||||||
|
reader := bufio.NewReader(stdout)
|
||||||
|
//实时循环读取输出流中的一行内容
|
||||||
|
go func() {
|
||||||
|
|
||||||
|
for {
|
||||||
|
line, err2 := reader.ReadString('\n')
|
||||||
|
if err2 != nil || io.EOF == err2 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Print(line)
|
||||||
|
}
|
||||||
|
|
||||||
|
}()
|
||||||
|
cmd.Wait()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,6 +17,6 @@ del "private.go"
|
|||||||
cd ../build
|
cd ../build
|
||||||
build_node.bat
|
build_node.bat
|
||||||
) ELSE (
|
) ELSE (
|
||||||
echo ÕÒ²»µ½private.go,ÇëʹÓà go run build.go -full-nodeÀ´±àÒë
|
echo ÕÒ²»µ½private.go,ÇëʹÓà go run build.go -fullnodeÀ´±àÒë
|
||||||
ping -n 3 127.0.0.1 > nul
|
ping -n 3 127.0.0.1 > nul
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
@echo off
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
IF EXIST ./cert/private.go (
|
||||||
|
cd rakshasa_lite
|
||||||
|
echo Start build fullnode-lite
|
||||||
|
echo build windows
|
||||||
|
set GOOS=windows
|
||||||
|
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_win.exe main.go
|
||||||
|
echo build linux
|
||||||
|
set GOOS=linux
|
||||||
|
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_linux main.go
|
||||||
|
echo build darwin
|
||||||
|
set GOOS=darwin
|
||||||
|
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_darwin main.go
|
||||||
|
cd ../cert
|
||||||
|
del "private.go"
|
||||||
|
cd ../build
|
||||||
|
build_node_lite.bat
|
||||||
|
) ELSE (
|
||||||
|
echo ÕÒ²»µ½private.go,ÇëʹÓà go run build.go -fullnode-liteÀ´±àÒë
|
||||||
|
ping -n 3 127.0.0.1 > nul
|
||||||
|
)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
file=./cert/private.go
|
||||||
|
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
cd rakshasa_lite
|
||||||
|
echo "Start build fullnode-lite"
|
||||||
|
echo "build windows"
|
||||||
|
GOOS=windows go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_win.exe main.go
|
||||||
|
echo "build linux"
|
||||||
|
GOOS=linux go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_linux main.go
|
||||||
|
echo "build darwin"
|
||||||
|
GOOS=darwin go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_darwin main.go
|
||||||
|
cd ../cert
|
||||||
|
rm -f "private.go"
|
||||||
|
cd ../build
|
||||||
|
chmod 755 build_node.sh
|
||||||
|
./build_node.sh
|
||||||
|
else
|
||||||
|
echo "找不到private.go,请使用 go run build.go -fullnode-lite来编译"
|
||||||
|
fi
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
@echo off
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
IF EXIST ./cert/private.go (
|
||||||
|
echo Çëɾ³ýprivate.goºóÔÚ±àÒë
|
||||||
|
ping -n 3 127.0.0.1 > nul
|
||||||
|
) ELSE (
|
||||||
|
cd rakshasa_lite
|
||||||
|
echo Start build node-lite
|
||||||
|
echo build windows
|
||||||
|
set GOOS=windows
|
||||||
|
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_win.exe main.go
|
||||||
|
echo build linux
|
||||||
|
set GOOS=linux
|
||||||
|
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_linux main.go
|
||||||
|
echo build darwin
|
||||||
|
set GOOS=darwin
|
||||||
|
go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_darwin main.go
|
||||||
|
echo End
|
||||||
|
|
||||||
|
)
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
file=./cert/private.go
|
||||||
|
|
||||||
|
if [ ! -f "$file" ]; then
|
||||||
|
cd rakshasa_lite
|
||||||
|
echo "Start build node-lite"
|
||||||
|
echo "build windows"
|
||||||
|
GOOS=windows go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_win.exe main.go
|
||||||
|
echo "build linux"
|
||||||
|
GOOS=linux go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_linux main.go
|
||||||
|
echo "build darwin"
|
||||||
|
GOOS=darwin go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_darwin main.go
|
||||||
|
else
|
||||||
|
echo "请删除private.go后在编译"
|
||||||
|
fi
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
module cert
|
||||||
|
|
||||||
|
go 1.20
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN RSA Private Key-----
|
||||||
|
MIIEvwIBAAKCAQcAxKyN5To5fAulOKJ6Ngiv+iJ/ws4q45QYB4T6UfWfKfeaIdhY
|
||||||
|
ek3QTKDm6zbge1+c6qzHPt3tnjJkVqh1jpr5MZmr2vbfPQWCZrHMpcrK3VTv+2uq
|
||||||
|
ieYWE1nGb71ImufqKAIwc7OMyYXufHX9PQMGEubSUx4Fw/KwF3mMYZIwUNJs6Q6S
|
||||||
|
PzuEL9incITKw1tl93uGLHM7KlYcXcLQh1YYY3tWcLkjNmQJND8d6q3ie9Tov/HL
|
||||||
|
cItANnKVWQLtD7UcyLm8pzfOhIqQzD83nxOaXjVV9G4qViukuZ74kusNrS4o3F3v
|
||||||
|
bM+KKHVkYWypYkTx/w0eQ4HR4/iWIKKJ3pOHPtNJcni/qwIDAQABAoIBBmdLzdcI
|
||||||
|
ZqrNHwEI7TE2DN9OgVXanNIctSY15JdpbyhGoJCIJahO+ElW9RGzJ+IEjNEA4EEX
|
||||||
|
pLbC9spA/kVhBeLUOFvv774IB75SQg8N3NC0zLp7iP2WeB+/tiZ3/wtFJUnQJIyQ
|
||||||
|
UDCEBIcgHVqPHQCOdQcsrJCHBY++yklw06mPa55XmYb7STAgKmE1LxoJogV1t064
|
||||||
|
Pvecc8/tjJrPkT3jMkTEJ6iJ+gyEdNxIOkz189MQ+SNjM+d0HRyApWpNDAEDKJgl
|
||||||
|
Q53yHCKtxqwgLqW6fD1OCODiL++BxSoYbfN16GyCiulXmnEGaCRYHRV0Gfliyjlj
|
||||||
|
N0A32RYE9P8NUgOSqTZsqVECgYQA8YBlCPuRzPXC3TTtMZY8ypybZydysOHFc0XE
|
||||||
|
QwkuuwmUcAPKsdrHOdT5d+fHt6u9lgz8HkpGBxuI+DB974fToJ2/2tc8ocjPv1qB
|
||||||
|
pDcPkKiRHOlXcMwTdYJj1baoMLmMtiSf1c2EJAh6yQnOniB+ZqfRaqRFZasVjGL2
|
||||||
|
xZdumWyNpdMCgYQA0Hs2LvYPmvJ4zUqn+i6g7AFeocXzhqSBatlP4P0fCZRjjLRQ
|
||||||
|
5bfrJPCuXY3ehi01r+Ll+73tvF6HlvnlrwyXSq59Jv4v9AUy4BYNAZmAtugcsx1F
|
||||||
|
e2U4mIHiJ4UXIbrWG2CbTyxbLCRgPjUvhWnFYIIlYzq9EFS42vk/pe2n9bH/H8kC
|
||||||
|
gYQAvv/E6K3OSkO0si7ByY4A1l21qofQdYSaHOj4p+wDQXn6I/1buf5Fwr9l7icq
|
||||||
|
FWGGt73dSDeF2uk0EtaHQ4IxJb6dlf7UvT+MztJN5gqGDOrEmhESTuuYGD/fpY6o
|
||||||
|
xqB5YTTmFLpN4BG0ynsvJnCch6QCRE1XdWkxya4bbXquxjjMbnECgYNHAK+DbuoB
|
||||||
|
q3LY+AQdgKPtvMmt7uzxfjVVXo2F4q8fZBpDYWXr1qeO/SllU1vl9p/CN1R8WEMP
|
||||||
|
VGJ5WMKQy4j7NlIJZaiPQvYAu4HSeaUMpiCgH+f6Do8n4ZRUQU+PfUJOMKi0Xjbu
|
||||||
|
4bSlexekKFHAfJKfKPIbDb+nVBwJNtdtJiHtgQKBhACR7mGC7n0sEU5SJZhx3qwG
|
||||||
|
S8WglFmWzITsbuFcpJq223b5H1bTxLeOuDjREkwIgIR/S4YAW/2FByf6zMc7IbLJ
|
||||||
|
aes/tQVJ5JsggXt3tMGAUk2omqhwxetNGhmD4AiNo1v4LaczwRudMro05Q+w2OhN
|
||||||
|
9vCqsHbi1B+tLr36sHVbnMcYgg==
|
||||||
|
-----END RSA Private Key-----
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
-----BEGIN RSA Public Key-----
|
||||||
|
MIIBKDANBgkqhkiG9w0BAQEFAAOCARUAMIIBEAKCAQcAxKyN5To5fAulOKJ6Ngiv
|
||||||
|
+iJ/ws4q45QYB4T6UfWfKfeaIdhYek3QTKDm6zbge1+c6qzHPt3tnjJkVqh1jpr5
|
||||||
|
MZmr2vbfPQWCZrHMpcrK3VTv+2uqieYWE1nGb71ImufqKAIwc7OMyYXufHX9PQMG
|
||||||
|
EubSUx4Fw/KwF3mMYZIwUNJs6Q6SPzuEL9incITKw1tl93uGLHM7KlYcXcLQh1YY
|
||||||
|
Y3tWcLkjNmQJND8d6q3ie9Tov/HLcItANnKVWQLtD7UcyLm8pzfOhIqQzD83nxOa
|
||||||
|
XjVV9G4qViukuZ74kusNrS4o3F3vbM+KKHVkYWypYkTx/w0eQ4HR4/iWIKKJ3pOH
|
||||||
|
PtNJcni/qwIDAQAB
|
||||||
|
-----END RSA Public Key-----
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIGAjCCA+qgAwIBAgICBj8wDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT
|
||||||
|
MQkwBwYDVQQIEwAxFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xGzAZBgNVBAkTEkdv
|
||||||
|
bGRlbiBHYXRlIEJyaWRnZTEOMAwGA1UEERMFOTQwMTYxFjAUBgNVBAoTDUNvbXBh
|
||||||
|
bnksIElOQy4xGDAWBgNVBAMTD2NoaW5hbW9iaWxlLmNvbTAgFw0yMzA0MDIxMjM5
|
||||||
|
MTdaGA8yMzg4MDQwMjEyMzkxN1owgY8xCzAJBgNVBAYTAlVTMQkwBwYDVQQIEwAx
|
||||||
|
FjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xGzAZBgNVBAkTEkdvbGRlbiBHYXRlIEJy
|
||||||
|
aWRnZTEOMAwGA1UEERMFOTQwMTYxFjAUBgNVBAoTDUNvbXBhbnksIElOQy4xGDAW
|
||||||
|
BgNVBAMTD2NoaW5hbW9iaWxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
|
||||||
|
AgoCggIBALg8u8LIMsvjFlA3ntA61Sg/SUVR+0jG4AlztOy73/f0Kfok5uKPmXS7
|
||||||
|
xdPM39uBY7vkIShYuRpNSsEa2OLQnDK4kgu/BWjsFNwZZG0N4quoUR2yDY9UkE3E
|
||||||
|
S2Ug2p7/4BwqL4ZZ2DrHDWxOs1pcG/8kKGanZPyDPsaEC6gdyqd1H0eXFND3rxon
|
||||||
|
MHrbKtY0g1zRSBObziU2zHjtfR4LdsSAGOAsXEh2M8aGYeyQ9gcmDgyOafBWAKTJ
|
||||||
|
EoaU01LEUeOiHWbEKOgepYYdsETBnG+StjJSZ4bOKuslrWYJci0UJp1m7ZTUnZtA
|
||||||
|
gfV46GF60MCma27Sm0XoVGtBjawzss5NV5sXCXikvabu5+RO4ER3ERa3Xd+ZRRCq
|
||||||
|
KcYINaaieNvOdN/aq8ZsGa1Ms7G27mJqecNNyw5+m2blVBqZlXq2T1EB/VYUVmWO
|
||||||
|
wBi+zJJ2rYIXnFvz2C3LR7/Fxmhd7z47Rod0jW37GfxzwfJ2hiFa3S8aMzPU3Swg
|
||||||
|
IEoHhra4cwzWXiqfNaPSHs23xXj261AyfTgal4n7MexU3yVEktpgE2r+wxQaMSd1
|
||||||
|
M1TqheSLXSOuP+hyKjZI450/JiCaY+hEdonW+15oDDr0trtmQnl8hAZyyIFBB/LK
|
||||||
|
H2ciqSCq0WRSGzkwHiF84Vu1/oCcK/j4yTcuusDBFItsK8WxW5oHAgMBAAGjZDBi
|
||||||
|
MA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw
|
||||||
|
DgYDVR0OBAcEBQECAwQGMCEGA1UdEQQaMBiCEHRlc3QuZGVmYXVsdC5zdmOCBHRl
|
||||||
|
c3QwDQYJKoZIhvcNAQELBQADggIBAG/dkL0EZn/NdH/uVLAtsQ98vHHIiNZxEXnQ
|
||||||
|
qgDMHtgQZ6mZkMAJa6NlELsO45hAmMiPvDJE+g4ZGWsLIIn730A9rBVfkQU2FKSc
|
||||||
|
EgNHVbIlPoHzwlJ7L5s1gVU/KkSsMKp73ltnUcnMr/Y9U8UQY/GGS/Cr8TdaW0Rg
|
||||||
|
4Y9zBxQmIh0ZRTGKZreBEyyWWmcIdOTHicEgM1utfngz+bu5tkjJ6Z/rfJz4z0M3
|
||||||
|
rNoTsBFWVlFKj9G4+Gs35NtlmDrBRhLF/Lnp79TWqCryIoJ6al+9+Rq8Kl1q0b6y
|
||||||
|
o8qY9LigACygoFoTv41U2BeHMQ+8pqjpvHgIFVuVXFpR/0gIPE2xQmEF8DNSFB++
|
||||||
|
oSqq95vW6cdQoPObLihPuJJiJhZRJ/C4CP50NreAi3hOkCm1au+OzvgbMDgkaJYH
|
||||||
|
COYTvg15bmlqmqPXhm3E/IM+dsTfSeXTQCdDPNrCr6/Yi1Vs+EBmtFOMu0LkfglB
|
||||||
|
Lqa5gCXoYd3vqX3BJ/HcEgXQ5GVIi+HEJNPZfoiFZe+erDgcEj2kEH6sWcbT6M/X
|
||||||
|
L+Ex/T4nvUYwcIQx3yY8txPAiswzVvr2iKToH6zpSBeI2mzuHM6dUZSEXgcbWrC4
|
||||||
|
7MelU3NG0a4ykGW4vWd1M5csjyojVeDDtdbHHgczKWBFLtIuWfrXDN7RtO9/M2Np
|
||||||
|
Vxo17mAc
|
||||||
|
-----END CERTIFICATE-----
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
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
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
+22
-8
@@ -8,22 +8,25 @@ import (
|
|||||||
_ "embed"
|
_ "embed"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"github.com/farmerx/gorsa"
|
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
|
"github.com/farmerx/gorsa"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed server.crt
|
//go:embed server.crt
|
||||||
var rsaCert []byte
|
var rsaCert []byte
|
||||||
|
|
||||||
//go:embed server.key
|
//go:embed server.key
|
||||||
var PrivateKey []byte
|
var RsaPrivateKey []byte
|
||||||
|
|
||||||
var Tlsconfig *tls.Config
|
var Tlsconfig *tls.Config
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
||||||
//内置证书
|
//内置证书
|
||||||
|
|
||||||
cert, err := tls.X509KeyPair(rsaCert, PrivateKey)
|
cert, err := tls.X509KeyPair(rsaCert, RsaPrivateKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicln(err)
|
log.Panicln(err)
|
||||||
return
|
return
|
||||||
@@ -60,7 +63,6 @@ func init() {
|
|||||||
//go:embed public.pem
|
//go:embed public.pem
|
||||||
var publicKey []byte
|
var publicKey []byte
|
||||||
|
|
||||||
|
|
||||||
var privateKey []byte
|
var privateKey []byte
|
||||||
|
|
||||||
// 使用公钥进行加密
|
// 使用公钥进行加密
|
||||||
@@ -103,7 +105,7 @@ func RSAEncrypterByPrivByte(msg []byte) []byte {
|
|||||||
prienctypt, _ := gorsa.RSA.PriKeyENCTYPT([]byte(msg))
|
prienctypt, _ := gorsa.RSA.PriKeyENCTYPT([]byte(msg))
|
||||||
return prienctypt
|
return prienctypt
|
||||||
}
|
}
|
||||||
func RSADecrypterByPub(cipherText string) string{
|
func RSADecrypterByPub(cipherText string) string {
|
||||||
b, _ := base64.StdEncoding.DecodeString(cipherText)
|
b, _ := base64.StdEncoding.DecodeString(cipherText)
|
||||||
pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(b)
|
pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(b)
|
||||||
return string(pubdecrypt)
|
return string(pubdecrypt)
|
||||||
@@ -112,7 +114,19 @@ func RSADecrypterByPubByte(cipherText []byte) []byte {
|
|||||||
pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(cipherText)
|
pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(cipherText)
|
||||||
return pubdecrypt
|
return pubdecrypt
|
||||||
}
|
}
|
||||||
func init(){
|
func init() {
|
||||||
gorsa.RSA.SetPublicKey(string(publicKey))
|
if err := gorsa.RSA.SetPublicKey(string(publicKey)); err != nil {
|
||||||
gorsa.RSA.SetPrivateKey(string(privateKey))
|
log.Fatalln("无法加载publicKey,请检查public.pem")
|
||||||
|
}
|
||||||
|
if len(privateKey) > 0 {
|
||||||
|
//fullnode
|
||||||
|
if err := gorsa.RSA.SetPrivateKey(string(privateKey)); err != nil {
|
||||||
|
log.Fatalln("无法加载privateKey,请检查private.go")
|
||||||
|
}
|
||||||
|
test := "hello world"
|
||||||
|
if RSADecrypterByPub(RSAEncrypterByPriv(test)) != test {
|
||||||
|
log.Fatalln("当前内置的public.pem 与 private.pem 无法正常加密解密")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-43
@@ -4,7 +4,8 @@ import (
|
|||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/dlclark/regexp2"
|
"regexp"
|
||||||
|
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
@@ -25,68 +26,52 @@ func ParseAddr(str string) (cfg *Addr, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}()
|
}()
|
||||||
r, _ := regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\S+):(\d+)`, 0)
|
r, _ := regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\S+):(\d+)`)
|
||||||
m, err := r.FindStringMatch(str)
|
m := r.FindAllStringSubmatch(str, 1)
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("配置解析错误," + err.Error())
|
|
||||||
}
|
|
||||||
if m != nil {
|
if m != nil {
|
||||||
var res_v []string
|
|
||||||
for _, v := range m.Groups() {
|
addr, err := net.ResolveTCPAddr("tcp", m[0][4]+":"+m[0][5])
|
||||||
res_v = append(res_v, v.String())
|
|
||||||
}
|
|
||||||
addr, err := net.ResolveTCPAddr("tcp", res_v[4]+":"+res_v[5])
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("配置解析错误 " + res_v[4] + ":" + res_v[5] + " 不是有效的 地址:端口")
|
return nil, errors.New("配置解析错误 " + m[0][4] + ":" + m[0][5] + " 不是有效的 地址:端口")
|
||||||
}
|
}
|
||||||
return &Addr{
|
return &Addr{
|
||||||
scheam: res_v[1],
|
scheam: m[0][1],
|
||||||
user: res_v[2],
|
user: m[0][2],
|
||||||
passwd: res_v[3],
|
passwd: m[0][3],
|
||||||
ip: res_v[4],
|
ip: m[0][4],
|
||||||
port: addr.Port,
|
port: addr.Port,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
r, _ = regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\d+)`, 0)
|
r, _ = regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\d+)`)
|
||||||
m, err = r.FindStringMatch(str)
|
m = r.FindAllStringSubmatch(str, 1)
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("配置解析错误," + err.Error())
|
|
||||||
}
|
|
||||||
if m != nil {
|
|
||||||
var res_v []string
|
|
||||||
for _, v := range m.Groups() {
|
|
||||||
res_v = append(res_v, v.String())
|
|
||||||
}
|
|
||||||
port, _ := strconv.Atoi(res_v[4])
|
|
||||||
|
|
||||||
|
if m != nil {
|
||||||
|
|
||||||
|
port, _ := strconv.Atoi(m[0][4])
|
||||||
return &Addr{
|
return &Addr{
|
||||||
scheam: res_v[1],
|
scheam: m[0][1],
|
||||||
user: res_v[2],
|
user: m[0][2],
|
||||||
passwd: res_v[3],
|
passwd: m[0][3],
|
||||||
ip: "",
|
ip: "",
|
||||||
port: port,
|
port: port,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
r, _ = regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)$`, 0)
|
r, _ = regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)$`)
|
||||||
m, err = r.FindStringMatch(str)
|
m = r.FindAllStringSubmatch(str, 1)
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("配置解析错误," + err.Error())
|
|
||||||
}
|
|
||||||
if m != nil {
|
if m != nil {
|
||||||
var res_v []string
|
|
||||||
for _, v := range m.Groups() {
|
addr, err := net.ResolveTCPAddr("tcp", m[0][2]+":"+m[0][3])
|
||||||
res_v = append(res_v, v.String())
|
|
||||||
}
|
|
||||||
addr, err := net.ResolveTCPAddr("tcp", res_v[2]+":"+res_v[3])
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("配置解析错误 " + res_v[1] + ":" + res_v[2] + " 不是有效的 地址:端口")
|
return nil, errors.New("配置解析错误 " + m[0][1] + ":" + m[0][2] + " 不是有效的 地址:端口")
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Addr{
|
return &Addr{
|
||||||
scheam: res_v[1],
|
scheam: m[0][1],
|
||||||
user: "",
|
user: "",
|
||||||
passwd: "",
|
passwd: "",
|
||||||
ip: res_v[2],
|
ip: m[0][2],
|
||||||
port: addr.Port,
|
port: addr.Port,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-11
@@ -4,15 +4,16 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/dlclark/regexp2"
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"rakshasa/aes"
|
"rakshasa/aes"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Debug bool = false
|
var Debug bool = false
|
||||||
@@ -28,10 +29,10 @@ var EnableTermVt bool
|
|||||||
|
|
||||||
// 数据包结构 包长(2byte)UUID+UUID+MsgId+Ttl+cmd包
|
// 数据包结构 包长(2byte)UUID+UUID+MsgId+Ttl+cmd包
|
||||||
type Msg struct {
|
type Msg struct {
|
||||||
From string
|
From string
|
||||||
To string
|
To string
|
||||||
MsgId uint32
|
MsgId uint32
|
||||||
Ttl uint8
|
Ttl uint8
|
||||||
CmdOpteion uint8
|
CmdOpteion uint8
|
||||||
CmdId uint32
|
CmdId uint32
|
||||||
CmdData []byte
|
CmdData []byte
|
||||||
@@ -311,13 +312,13 @@ func ResolveTCPAddr(str string) ([]string, error) {
|
|||||||
dst = append(dst[:i], dst[i+1:]...)
|
dst = append(dst[:i], dst[i+1:]...)
|
||||||
} else {
|
} else {
|
||||||
if _, err := net.ResolveTCPAddr("tcp", addr); err != nil {
|
if _, err := net.ResolveTCPAddr("tcp", addr); err != nil {
|
||||||
if i>0{
|
if i > 0 {
|
||||||
r, _ := regexp2.Compile(`^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}`, 0)
|
r, _ := regexp.Compile(`^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}`)
|
||||||
match,_ :=r.MatchString(addr)
|
match := r.MatchString(addr)
|
||||||
if !match{
|
if !match {
|
||||||
return nil, fmt.Errorf("参数错误 格式为\"ip:端口\",多个地址以逗号隔开,错误详情%v", err)
|
return nil, fmt.Errorf("参数错误 格式为\"ip:端口\",多个地址以逗号隔开,错误详情%v", err)
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
return nil, fmt.Errorf("参数错误 格式为\"ip:端口,第二个地址可以是UUID\",多个地址以逗号隔开,错误详情%v", err)
|
return nil, fmt.Errorf("参数错误 格式为\"ip:端口,第二个地址可以是UUID\",多个地址以逗号隔开,错误详情%v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -2,7 +2,6 @@ dstnode:
|
|||||||
#- 192.168.1.180:8883
|
#- 192.168.1.180:8883
|
||||||
password: ""
|
password: ""
|
||||||
port: 8884
|
port: 8884
|
||||||
listenip:
|
listenip: 192.168.1.151
|
||||||
- 192.168.1.151
|
|
||||||
limit: false
|
limit: false
|
||||||
filename: config.yaml
|
filename: config.yaml
|
||||||
|
|||||||
@@ -4,11 +4,13 @@ go 1.16
|
|||||||
|
|
||||||
replace github.com/abiosoft/readline => ./readline
|
replace github.com/abiosoft/readline => ./readline
|
||||||
|
|
||||||
|
replace cert => ./cert
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
cert v0.0.0-00010101000000-000000000000
|
||||||
github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db
|
github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db
|
||||||
github.com/creack/pty v1.1.18
|
github.com/creack/pty v1.1.18
|
||||||
github.com/dlclark/regexp2 v1.7.0
|
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 // indirect
|
||||||
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40
|
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
github.com/luyu6056/ishell v1.0.1
|
github.com/luyu6056/ishell v1.0.1
|
||||||
github.com/mattn/go-colorable v0.1.12 // indirect
|
github.com/mattn/go-colorable v0.1.12 // indirect
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr
|
|||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo=
|
|
||||||
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
|
||||||
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 h1:OgoboV484kN/ngW4apHvSw8iy9YhhQusAKSLT8nGl94=
|
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 h1:OgoboV484kN/ngW4apHvSw8iy9YhhQusAKSLT8nGl94=
|
||||||
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40/go.mod h1:Gdtd77IQrjXqFfiourWpNnE1jDPC4opZPDPxPLWFlr0=
|
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40/go.mod h1:Gdtd77IQrjXqFfiourWpNnE1jDPC4opZPDPxPLWFlr0=
|
||||||
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"cert"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
"rakshasa/aes"
|
"rakshasa/aes"
|
||||||
"rakshasa/cert"
|
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
"rakshasa/httppool"
|
"rakshasa/httppool"
|
||||||
"rakshasa/server"
|
"rakshasa/server"
|
||||||
@@ -108,7 +108,7 @@ func main() {
|
|||||||
server.SetConfig(config)
|
server.SetConfig(config)
|
||||||
|
|
||||||
//设置一下秘钥
|
//设置一下秘钥
|
||||||
aes.Key = aes.MD5_B(config.Password + string(cert.PrivateKey[:16]))
|
aes.Key = aes.MD5_B(config.Password + string(cert.RsaPrivateKey[:16]))
|
||||||
//初始化node
|
//初始化node
|
||||||
server.InitCurrentNode()
|
server.InitCurrentNode()
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ func main() {
|
|||||||
if *shellCode != "" {
|
if *shellCode != "" {
|
||||||
server.RunShellcodeWithDst(*dstNode, *shellCode, *shellCodeXorKey, *shellCodeParam, *shellCodeTimeout)
|
server.RunShellcodeWithDst(*dstNode, *shellCode, *shellCodeXorKey, *shellCodeParam, *shellCodeTimeout)
|
||||||
}
|
}
|
||||||
if err := server.StartServer(fmt.Sprintf("%s:%d", config.ListenIp, config.Port)); err != nil {
|
if err := server.StartServer(fmt.Sprintf(":%d", config.Port)); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ rakshasa是一个用Go编写的程序,旨在创建一个能够实现**多级
|
|||||||
- Go语言:因为Go语言是一门高效的并发编程语言,非常适合网络编程。
|
- Go语言:因为Go语言是一门高效的并发编程语言,非常适合网络编程。
|
||||||
- github.com/abiosoft/ishell包:实现各操作系统中的CLI。
|
- github.com/abiosoft/ishell包:实现各操作系统中的CLI。
|
||||||
- github.com/creack/pty包:实现Linux伪终端,可以执行交互式命令与更高级的终端显示效果。
|
- github.com/creack/pty包:实现Linux伪终端,可以执行交互式命令与更高级的终端显示效果。
|
||||||
- github.com/dlclark/regexp2包:全功能正则表达式 。
|
- github.com/farmerx/gorsa包:实现私钥加密公钥解密,用来解决节点权限限制。
|
||||||
|
|
||||||
## 4. 项目结构
|
## 4. 项目结构
|
||||||
|
|
||||||
|
|||||||
+10
-9
@@ -2,6 +2,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cert"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -10,7 +11,6 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"rakshasa/aes"
|
"rakshasa/aes"
|
||||||
"rakshasa/cert"
|
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -690,12 +690,6 @@ func (c *Conn) handle() {
|
|||||||
func (c *Conn) reg() error {
|
func (c *Conn) reg() error {
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
c.nodeConn, err = tls.Dial("tcp", c.nodeaddr, cert.Tlsconfig.Clone())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
reg := &common.RegMsg{
|
reg := &common.RegMsg{
|
||||||
UUID: currentNode.uuid,
|
UUID: currentNode.uuid,
|
||||||
MainIp: cert.RSAEncrypterStr(currentNode.mainIp),
|
MainIp: cert.RSAEncrypterStr(currentNode.mainIp),
|
||||||
@@ -710,7 +704,6 @@ func (c *Conn) reg() error {
|
|||||||
CmdOpteion: common.CMD_REG,
|
CmdOpteion: common.CMD_REG,
|
||||||
CmdData: regb,
|
CmdData: regb,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = c.tlsWrite(msg.Marshal()); err != nil {
|
if err = c.tlsWrite(msg.Marshal()); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -734,7 +727,15 @@ func (c *Conn) Write(b []byte) {
|
|||||||
|
|
||||||
func (c *Conn) tlsWrite(b []byte) error {
|
func (c *Conn) tlsWrite(b []byte) error {
|
||||||
c.nodeConn.SetWriteDeadline(time.Now().Add(common.WRITE_DEADLINE))
|
c.nodeConn.SetWriteDeadline(time.Now().Add(common.WRITE_DEADLINE))
|
||||||
_, err := c.nodeConn.Write(b)
|
n, err := c.nodeConn.Write(b)
|
||||||
|
if common.Debug {
|
||||||
|
if c.node!=nil{
|
||||||
|
fmt.Println("writeto", c.node.uuid, n)
|
||||||
|
}else{
|
||||||
|
fmt.Println("writeto",common.NoneUUID, n)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.Close("Write " + err.Error())
|
c.Close("Write " + err.Error())
|
||||||
upNodeWrite <- b
|
upNodeWrite <- b
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"rakshasa/cert"
|
"cert"
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
"rakshasa/httppool"
|
"rakshasa/httppool"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
|||||||
+22
-19
@@ -2,6 +2,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cert"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
@@ -11,7 +12,6 @@ import (
|
|||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"rakshasa/cert"
|
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -226,18 +226,21 @@ func connectNew(addr string) (n *node, e error) {
|
|||||||
addrs, e := i.Addrs()
|
addrs, e := i.Addrs()
|
||||||
if e == nil {
|
if e == nil {
|
||||||
for _, localAddr := range addrs {
|
for _, localAddr := range addrs {
|
||||||
go func() {
|
go func(localAddr net.Addr) {
|
||||||
localstr := localAddr.String()
|
localstr := localAddr.String()
|
||||||
localstr = localstr[:strings.LastIndex(localstr, "/")] + ":0"
|
localstr = localstr[:strings.LastIndex(localstr, "/")] + ":0"
|
||||||
laddr, _ := net.ResolveTCPAddr("tcp", localstr)
|
laddr, _ := net.ResolveTCPAddr("tcp", localstr)
|
||||||
if netconn, e := net.DialTCP("tcp", laddr, raddr); e == nil {
|
if laddr!=nil{
|
||||||
conn := tls.Client(netconn, config)
|
if netconn, e := net.DialTCP("tcp", laddr, raddr); e == nil {
|
||||||
select {
|
conn := tls.Client(netconn, config)
|
||||||
case connChan <- conn:
|
select {
|
||||||
default:
|
case connChan <- conn:
|
||||||
|
default:
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
|
||||||
|
}(localAddr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -470,6 +473,8 @@ func (n *node) do(msg *common.Msg) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
currentNode.broadcastNode()
|
currentNode.broadcastNode()
|
||||||
|
//把本机所有节点同步到注册机器
|
||||||
|
go n.writeGetNodeResult(msg.CmdId)
|
||||||
}()
|
}()
|
||||||
case common.CMD_REG_RESULT:
|
case common.CMD_REG_RESULT:
|
||||||
var regmsg common.RegMsg
|
var regmsg common.RegMsg
|
||||||
@@ -536,8 +541,8 @@ func (n *node) do(msg *common.Msg) {
|
|||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
|
||||||
//回复节点
|
//交换节点
|
||||||
//n.writeGetNodeResult(msg.CmdId)
|
n.writeGetNodeResult(msg.CmdId)
|
||||||
|
|
||||||
case common.CMD_REMOTE_REG:
|
case common.CMD_REMOTE_REG:
|
||||||
|
|
||||||
@@ -616,8 +621,7 @@ func (n *node) do(msg *common.Msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
l.Unlock()
|
l.Unlock()
|
||||||
//fmt.Printf("connect to %s(%s) success\n", regmsg.UUID, regmsg.RegAddr)
|
n.writeGetNodeResult(msg.CmdId)
|
||||||
//n.writeGetNodeResult(msg.CmdId)
|
|
||||||
|
|
||||||
case common.CMD_PING:
|
case common.CMD_PING:
|
||||||
n.Write(common.CMD_PONG, msg.CmdId, append(msg.CmdData, n.conn.nodeConn.LocalAddr().String()...))
|
n.Write(common.CMD_PONG, msg.CmdId, append(msg.CmdData, n.conn.nodeConn.LocalAddr().String()...))
|
||||||
@@ -1427,18 +1431,17 @@ func GetNodeFromAddrs(dst []string) (n *node, err error) {
|
|||||||
if n, err = getNode(dst[0]); err != nil {
|
if n, err = getNode(dst[0]); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if n.uuid == currentNode.uuid {
|
||||||
|
return nil, errors.New("不能连接自己")
|
||||||
|
}
|
||||||
for i := 1; i < len(dst); i++ {
|
for i := 1; i < len(dst); i++ {
|
||||||
n, err = n.remoteReg(dst[i])
|
n, err = n.remoteReg(dst[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s,%v", dst[i], err)
|
return nil, fmt.Errorf("%s,%v", dst[i], err)
|
||||||
}
|
}
|
||||||
}
|
if n.uuid == currentNode.uuid {
|
||||||
if n == nil {
|
return nil, errors.New("不能连接自己")
|
||||||
return nil, fmt.Errorf("无法连接 %v", dst)
|
}
|
||||||
}
|
|
||||||
if n.uuid == currentNode.uuid {
|
|
||||||
return nil, errors.New("不能连接自己")
|
|
||||||
}
|
}
|
||||||
n.reConnectAddrs = make([]string, len(dst))
|
n.reConnectAddrs = make([]string, len(dst))
|
||||||
copy(n.reConnectAddrs, dst)
|
copy(n.reConnectAddrs, dst)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"hash/crc32"
|
"hash/crc32"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"rakshasa/cert"
|
"cert"
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"rakshasa/cert"
|
"cert"
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|||||||
+14
-11
@@ -6,6 +6,7 @@ package server
|
|||||||
*/
|
*/
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cert"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -13,8 +14,9 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"rakshasa/aes"
|
"rakshasa/aes"
|
||||||
"rakshasa/cert"
|
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
|
|
||||||
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -24,7 +26,6 @@ import (
|
|||||||
|
|
||||||
"github.com/abiosoft/readline"
|
"github.com/abiosoft/readline"
|
||||||
"github.com/creack/pty"
|
"github.com/creack/pty"
|
||||||
"github.com/dlclark/regexp2"
|
|
||||||
"github.com/luyu6056/ishell"
|
"github.com/luyu6056/ishell"
|
||||||
"golang.org/x/text/encoding/simplifiedchinese"
|
"golang.org/x/text/encoding/simplifiedchinese"
|
||||||
"golang.org/x/text/transform"
|
"golang.org/x/text/transform"
|
||||||
@@ -109,7 +110,7 @@ func init() {
|
|||||||
c.Println(c.Args)
|
c.Println(c.Args)
|
||||||
currentConfig.Password = c.Args[0]
|
currentConfig.Password = c.Args[0]
|
||||||
currentConfig.FileSave = false
|
currentConfig.FileSave = false
|
||||||
aes.Key = aes.MD5_B(currentConfig.Password + string(cert.PrivateKey[:16]))
|
aes.Key = aes.MD5_B(currentConfig.Password + string(cert.RsaPrivateKey[:16]))
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
configShell.AddCmd(&ishell.Cmd{
|
configShell.AddCmd(&ishell.Cmd{
|
||||||
@@ -133,7 +134,9 @@ func init() {
|
|||||||
currentConfig.Port = port
|
currentConfig.Port = port
|
||||||
currentNode.port = port
|
currentNode.port = port
|
||||||
currentConfig.FileSave = false
|
currentConfig.FileSave = false
|
||||||
StartServer(fmt.Sprintf("%s:%d", currentConfig.ListenIp, currentConfig.Port))
|
if err := StartServer(fmt.Sprintf(":%d", currentConfig.Port)); err != nil {
|
||||||
|
c.Printf("启动节点失败 %v, 请重新修改监听端口",currentConfig.Port)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -261,7 +264,7 @@ func init() {
|
|||||||
pwd = dir
|
pwd = dir
|
||||||
} else {
|
} else {
|
||||||
pwd += "/" + dir
|
pwd += "/" + dir
|
||||||
pwd = strings.TrimRight(realpath(pwd), "/")
|
pwd = strings.TrimRight(getRealPath(pwd), "/")
|
||||||
}
|
}
|
||||||
|
|
||||||
resChan := make(chan interface{}, 1)
|
resChan := make(chan interface{}, 1)
|
||||||
@@ -326,7 +329,7 @@ func init() {
|
|||||||
}
|
}
|
||||||
filename := pwd[i+1:]
|
filename := pwd[i+1:]
|
||||||
dir := pwd[:i]
|
dir := pwd[:i]
|
||||||
dir = strings.TrimRight(realpath(dir), "/") + "/"
|
dir = strings.TrimRight(getRealPath(dir), "/") + "/"
|
||||||
pwd = dir + filename
|
pwd = dir + filename
|
||||||
resChan := make(chan interface{}, 9999) //避免收消息阻塞
|
resChan := make(chan interface{}, 9999) //避免收消息阻塞
|
||||||
|
|
||||||
@@ -432,7 +435,7 @@ func init() {
|
|||||||
}
|
}
|
||||||
filename := pwd[i+1:]
|
filename := pwd[i+1:]
|
||||||
dir := pwd[:i]
|
dir := pwd[:i]
|
||||||
dir = strings.TrimRight(realpath(dir), "/") + "/"
|
dir = strings.TrimRight(getRealPath(dir), "/") + "/"
|
||||||
mydir, err := os.Getwd()
|
mydir, err := os.Getwd()
|
||||||
local := "./" + filename
|
local := "./" + filename
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -468,7 +471,7 @@ func init() {
|
|||||||
b[be+5] = byte(total >> 40)
|
b[be+5] = byte(total >> 40)
|
||||||
b[be+6] = byte(total >> 48)
|
b[be+6] = byte(total >> 48)
|
||||||
b[be+7] = byte(total >> 56)
|
b[be+7] = byte(total >> 56)
|
||||||
n.Write(common.CMD_DOWNLOAD, id,cert.RSAEncrypterByPrivByte(b))
|
n.Write(common.CMD_DOWNLOAD, id, cert.RSAEncrypterByPrivByte(b))
|
||||||
c.ProgressBar().Start()
|
c.ProgressBar().Start()
|
||||||
size := int64(0)
|
size := int64(0)
|
||||||
resnum := 0
|
resnum := 0
|
||||||
@@ -621,8 +624,8 @@ func init() {
|
|||||||
if !common.EnableTermVt {
|
if !common.EnableTermVt {
|
||||||
s.translate = func(in []byte) ([]byte, error) {
|
s.translate = func(in []byte) ([]byte, error) {
|
||||||
if in[0] == 27 {
|
if in[0] == 27 {
|
||||||
r, _ := regexp2.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`, 0)
|
r, _ := regexp.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`)
|
||||||
res, _ := r.Replace(string(in), "", 0, -1)
|
res := r.ReplaceAllString(string(in), "")
|
||||||
return []byte(res), nil
|
return []byte(res), nil
|
||||||
}
|
}
|
||||||
return in, nil
|
return in, nil
|
||||||
@@ -758,7 +761,7 @@ func printNodes(c *ishell.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func realpath(path string) string {
|
func getRealPath(path string) string {
|
||||||
|
|
||||||
path_s := strings.Split(path, "/")
|
path_s := strings.Split(path, "/")
|
||||||
realpath := []string{}
|
realpath := []string{}
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"rakshasa/cert"
|
"cert"
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
kernel32 = syscall.MustLoadDLL("kernel32.dll")
|
kernel32 = syscall.MustLoadDLL("kernel32.dll")
|
||||||
VirtualProtect = kernel32.MustFindProc("VirtualProtect")
|
|
||||||
old32 = syscall.MustLoadDLL("ole32.dll")
|
old32 = syscall.MustLoadDLL("ole32.dll")
|
||||||
CoTaskMemAlloc = old32.MustFindProc("CoTaskMemAlloc")
|
CoTaskMemAlloc = old32.MustFindProc("CoTaskMemAlloc")
|
||||||
)
|
)
|
||||||
@@ -22,6 +22,7 @@ func shellcodeRun(code []byte) error {
|
|||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
VirtualProtect := kernel32.MustFindProc("VirtualProtect")
|
||||||
l := uintptr(len(code))
|
l := uintptr(len(code))
|
||||||
pwstrLocal, _, _ := CoTaskMemAlloc.Call(l)
|
pwstrLocal, _, _ := CoTaskMemAlloc.Call(l)
|
||||||
|
|
||||||
|
|||||||
+3
-7
@@ -2,6 +2,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cert"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -9,7 +10,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"rakshasa/cert"
|
|
||||||
"rakshasa/common"
|
"rakshasa/common"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -23,8 +23,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
STATUS_OFF = 0
|
|
||||||
STATUS_ON = 1
|
|
||||||
UDP_PORT_MIN = 30000
|
UDP_PORT_MIN = 30000
|
||||||
UDP_PORT_MAX = 60000
|
UDP_PORT_MAX = 60000
|
||||||
SOCKES5_VERSION = 5
|
SOCKES5_VERSION = 5
|
||||||
@@ -32,13 +30,11 @@ const (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
SOCKES5_AUTH_SUSSCES []byte = []byte{5, 0}
|
SOCKES5_AUTH_SUSSCES []byte = []byte{5, 0}
|
||||||
SOCKES5_AUTHPW_SUSSCES []byte = []byte{5, 2}
|
SOCKES5_AUTH_SUSSCES_PASSWD []byte = []byte{5, 2}
|
||||||
|
|
||||||
PROTOCOL_ERR = errors.New("protocolErr")
|
PROTOCOL_ERR = errors.New("protocolErr")
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
SERVER_NUM = 4 //有效的连接数量
|
|
||||||
CONN_AUTH_CLOSE = 0
|
CONN_AUTH_CLOSE = 0
|
||||||
CONN_AUTH_NONE = 1
|
CONN_AUTH_NONE = 1
|
||||||
CONN_AUTH_PW = 2
|
CONN_AUTH_PW = 2
|
||||||
@@ -270,7 +266,7 @@ func handleSocks5Local(s *clientConnect) {
|
|||||||
if len(data) > 2 {
|
if len(data) > 2 {
|
||||||
if data[0] == 5 {
|
if data[0] == 5 {
|
||||||
if s.cfg.User() != "" && s.cfg.Password() != "" {
|
if s.cfg.User() != "" && s.cfg.Password() != "" {
|
||||||
s.conn.Write(SOCKES5_AUTH_SUSSCES)
|
s.conn.Write(SOCKES5_AUTH_SUSSCES_PASSWD)
|
||||||
s.auth = CONN_AUTH_PW
|
s.auth = CONN_AUTH_PW
|
||||||
} else {
|
} else {
|
||||||
s.conn.Write(SOCKES5_AUTH_SUSSCES)
|
s.conn.Write(SOCKES5_AUTH_SUSSCES)
|
||||||
|
|||||||
Reference in New Issue
Block a user