修复bug,增加lite版本

This commit is contained in:
Mob2003
2023-04-02 21:43:50 +08:00
parent e48ed59a73
commit ec51f136eb
29 changed files with 428 additions and 141 deletions
+26 -3
View File
@@ -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的代码
## 使用图示 ## 使用图示
![image](https://user-images.githubusercontent.com/128351726/226882870-f4f3cbc0-61df-486c-afc0-511d87586402.png) ![image](https://user-images.githubusercontent.com/128351726/226882870-f4f3cbc0-61df-486c-afc0-511d87586402.png)
+66 -14
View File
@@ -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
}
+1 -1
View File
@@ -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
) )
+23
View File
@@ -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
)
+22
View File
@@ -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
+21
View File
@@ -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
)
+17
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
module cert
go 1.20
+28
View File
@@ -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-----
+9
View File
@@ -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-----
+35
View File
@@ -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-----
+51
View File
@@ -0,0 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAuDy7wsgyy+MWUDee0DrVKD9JRVH7SMbgCXO07Lvf9/Qp+iTm
4o+ZdLvF08zf24Fju+QhKFi5Gk1KwRrY4tCcMriSC78FaOwU3BlkbQ3iq6hRHbIN
j1SQTcRLZSDanv/gHCovhlnYOscNbE6zWlwb/yQoZqdk/IM+xoQLqB3Kp3UfR5cU
0PevGicwetsq1jSDXNFIE5vOJTbMeO19Hgt2xIAY4CxcSHYzxoZh7JD2ByYODI5p
8FYApMkShpTTUsRR46IdZsQo6B6lhh2wRMGcb5K2MlJnhs4q6yWtZglyLRQmnWbt
lNSdm0CB9XjoYXrQwKZrbtKbRehUa0GNrDOyzk1XmxcJeKS9pu7n5E7gRHcRFrdd
35lFEKopxgg1pqJ4285039qrxmwZrUyzsbbuYmp5w03LDn6bZuVUGpmVerZPUQH9
VhRWZY7AGL7MknatghecW/PYLctHv8XGaF3vPjtGh3SNbfsZ/HPB8naGIVrdLxoz
M9TdLCAgSgeGtrhzDNZeKp81o9IezbfFePbrUDJ9OBqXifsx7FTfJUSS2mATav7D
FBoxJ3UzVOqF5ItdI64/6HIqNkjjnT8mIJpj6ER2idb7XmgMOvS2u2ZCeXyEBnLI
gUEH8sofZyKpIKrRZFIbOTAeIXzhW7X+gJwr+PjJNy66wMEUi2wrxbFbmgcCAwEA
AQKCAgAbgH1qwyXKB7kR+muLm+yr2F6gqW9AWuegoZQVbqotQlZtz8pjcZovscQD
LOcRxkvUBWbptezTv0v0bYSIvylB7QloFXjCQ9ONU4EJQnReuX56V1Ts22u7IB09
GF1qNLoImkeD36+GfqZDT7A4Qd2wBX6+bCiIBTN+wMFYtDHHM5WawzPJSd/qoIT9
IfBQD4C4f0kqHCz2oyp8tr7hmEZ/aLvN4vFXo8Vw0iiV/sGrKYQZXbz0snHgJ1/L
lTXCeinbOBz5dTjCBakhzxa7/MbUZOsrsd9gYTBI79Plkm1ny0VEY9P9TovEXCnK
MeVGf+XfjDgnT+r70YWgiSWT2hfLsPggg9IstWclGgDyMgpau3HVJZxCx7kI6i0Z
+40OfwAl537rQJAZvuKYVQaK49+yozRkQfHlhMXeL5UhfBRIWcG0wUFUahWUdMUd
eJGJMVWkS4pOWdE0eovYegsVSdHg/zP/elFeKnGlfbljOLJODU1DJbIUQnAEijEi
uC6gGt1tXuUxOCBkIZurKeheSNGWFt4/JgYe30RnoiJgne+kvFLgTg00zdWn32QO
pTFALIPRA31I6nVDRjGtXrgDH/+Mt8emFT/zwcHt5jUUi00lBYyEKQLHUyLx4wDw
F6N2Ju8aEQmbJaf5eKgVjBn7ut4LQKZ85REKKOjubzHDUV7DsQKCAQEAyMTeKJIO
i1TphgN24l30nCN0Exutgps63sKhb6jNveOMtbux3YP8zx8PN2t55aQL9EWB9le6
bd5O4ciVGj9KYwsjHhdyjqJvQxZWBCE7+9mTzYbB7mSXjLSs2LcQ2rjAG518cLaU
N4B5CETcsvmv9bNshDHF+Mjjj7rrZVLBuzmtz/QyvC/UZBxOnQ7mTxQaAVfkHIX+
gxVMDAMb6IEgPu8/9IcRxwkiMPT9jrNyKG4EfA7GN2IAIhk2E1SXeZoFwqtiZOWO
gpViFXmQ9T8jjtlaIBRYHdHBOtws117iFe1O2TK59ETu7YFixuwNMt5dGB+Cd9Ez
MkLT6+2C/astnwKCAQEA6uueFLtieCP716Ijms/NBW+sjDMc3ekDh8jm4AN2/1y8
kOQF4xvznOrv8jG9+Buqxu5gAGLUnEgZNK4Pry112ij6PGU66Xsp6mHfDRJXN0RO
Iy7opwX8/GM2XDTONmE0EQhayuA7dBtOu/vsBiHKFplarK/q4Ej1vMJLQtab2UFs
uoMw7KLxAMpYphG132X8YBUGbIQVi/dJhiulSR3uDBzMa0BbUhJIYsiBqmFxym2a
dvq4XHtI+vyoHADMgo9oN09vpTdb7ZWhKDi5SB7vLN/GeiPqLhB1fiCUN8fNoX9J
C6PNNQPz0bjVQyKt5n78Bre+aIPijWdcly/u72bqmQKCAQAKZO7fiNhJ7GZ+srU3
+QdOAiPjTV6JUYIVwFvdTQ8B0sMZMZN+1XOEQaZnByBzfC/GQMb+uwIC6CyLUfgu
OLKgOBZkW3Bp5A0Amypu4k2Zt2UIkf5+WiTiewQr4CZ2PHRtuZSUvU8lJHifrfkD
JxwuC1EF8xG91KC7c0D2qPcwu0a9anYp+gvz9uc3CGtyEqdaBHPh6ioIHVUnlg2e
1viVaYuVHF0WQenMQRLTjYTOhQukZJtsiJ1bJpT/ITUKbaf4sSjR8nSTXCqM1BNm
LxOnNKeO257IRHDNnFKR/+6SlgusAQ1RkTQRhc5YYCY6yPpm4lK9403UP1N7dnt+
qJsfAoIBAQDb9HR00OZnurlosuVHZF2AQ4l5U7ophKzLjC2vfU8D1h6wQu/ILzmv
qMG1MSG/lpgV3seAVQjgsxj2nCsPSC9abpetyNKaHbmnPLANmyiSFKBcjOVEzXSM
E5CoUMDrZaPMdtgbsEu6cH8Nv9jD/QsskbW2jpgKHAYKEJlLIYmWp41YLNG4HvAs
X0kVZOu3GdRtWgJDxIAwJv9uYptFlIJ4UNaNbRqUA45G/5l4n/hdIrZHxISuArjY
V4xHe/AAJqnbb8MHHIg0Ma9M659/iYdDqto5LjtrmfmIeJSOjcNY/Ma14U6X3vWB
XeBAFc5hTHBJEe10ClgrMaYd4MGE4gWxAoIBAQCad5JGYUKZW/XK5XYkuSpSE3Dm
kPoKW1g91FkuFbKdIlBW2Kj8C/60TgZZBGNJMAEABVaT8DFCJmKjR0z8dAG4rW9c
ADFCjTMSwf5En4zwdSIZxyAJjHpEFMo+6h1r9YXoKGyQcHAmKjQ3Kjwz5GcyfSDe
8/kht7wNzghfAeePlEl6bk/ni6Nisc2bZ2pIiWTRe3AeX63AHpRKDYqGwI2tLY22
lx8dBB6h67eQHirQMGLVP2KtcI8HVKE6R7aQwO63vD8o9hQTl2UBYOFZdR4RWo9X
zBCG+jrPesSEjeowjXEEXDrmhhkICyaDR8uCKca5RjAAfE4AYqRN1ZdACx6I
-----END RSA PRIVATE KEY-----
+22 -8
View File
@@ -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
View File
@@ -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
View File
@@ -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
// 数据包结构 包长(2byteUUID+UUID+MsgId+Ttl+cmd包 // 数据包结构 包长(2byteUUID+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
View File
@@ -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 -2
View File
@@ -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
-2
View File
@@ -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=
+3 -3
View File
@@ -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)
} }
+1 -1
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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"
+2 -1
View File
@@ -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
View File
@@ -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)