修复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)
[win10+Proxifier实现内网穿透](./readme/rakshasa内网穿透--win10+Proxifier使用案例.md)
## 编译与使用
全新生成证书与节点
生成新的证书,编译所有版本节点
```shell
go run build.go -all
```
只生成证书
编译所有版本节点(不更新证书
```shell
go run build.go -all -nocert
```
生成覆盖证书
```shell
go run build.go -gencert
```
@@ -38,7 +44,7 @@ go run build.go -fullnode
go run build.go -node
```
证书保存在cert目录下
证书保存在cert目录下,可以使用第三方工具生成,请使用RSA PKCS1-V1.5
```shell
private.go --编译普通节点的时候要删除此文件
private.pem --与public.pem对应的公钥私钥,普通节点不包含私钥
@@ -46,6 +52,23 @@ public.pem
server.crt --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)
+66 -14
View File
@@ -1,8 +1,10 @@
package main
import (
"bufio"
"flag"
"fmt"
"io"
"log"
"os"
"os/exec"
@@ -11,14 +13,29 @@ import (
func main() {
all := flag.Bool("all", false, "生成新的证书,生成控制端节点和普通节点")
nocert := flag.Bool("nocert", false, "不生成证书")
gencert := flag.Bool("gencert", false, "生成证书")
fullNode := flag.Bool("fullnode", false, "编译生成控制端节点+普通节点")
fullNode := flag.Bool("fullnode", 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()
if *all == true {
*gencert = 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 runtime.GOOS == "windows" {
@@ -28,7 +45,7 @@ func main() {
return
}
} 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 {
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
return
@@ -59,27 +76,62 @@ func main() {
} else if *node {
os.Remove("./cert/private.go")
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()
}
}
func buildNode(name string) {
if runtime.GOOS == "windows" {
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 {
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 := 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
build_node.bat
) 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
)
+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-----
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
Vxo17mAc
-----END CERTIFICATE-----
+51
View File
@@ -0,0 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
+22 -8
View File
@@ -8,22 +8,25 @@ import (
_ "embed"
"encoding/base64"
"encoding/pem"
"github.com/farmerx/gorsa"
"log"
"github.com/farmerx/gorsa"
)
//go:embed server.crt
var rsaCert []byte
//go:embed server.key
var PrivateKey []byte
var RsaPrivateKey []byte
var Tlsconfig *tls.Config
func init() {
//内置证书
cert, err := tls.X509KeyPair(rsaCert, PrivateKey)
cert, err := tls.X509KeyPair(rsaCert, RsaPrivateKey)
if err != nil {
log.Panicln(err)
return
@@ -60,7 +63,6 @@ func init() {
//go:embed public.pem
var publicKey []byte
var privateKey []byte
// 使用公钥进行加密
@@ -103,7 +105,7 @@ func RSAEncrypterByPrivByte(msg []byte) []byte {
prienctypt, _ := gorsa.RSA.PriKeyENCTYPT([]byte(msg))
return prienctypt
}
func RSADecrypterByPub(cipherText string) string{
func RSADecrypterByPub(cipherText string) string {
b, _ := base64.StdEncoding.DecodeString(cipherText)
pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(b)
return string(pubdecrypt)
@@ -112,7 +114,19 @@ func RSADecrypterByPubByte(cipherText []byte) []byte {
pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(cipherText)
return pubdecrypt
}
func init(){
gorsa.RSA.SetPublicKey(string(publicKey))
gorsa.RSA.SetPrivateKey(string(privateKey))
func init() {
if err := gorsa.RSA.SetPublicKey(string(publicKey)); err != nil {
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"
"errors"
"fmt"
"github.com/dlclark/regexp2"
"regexp"
"net"
"strconv"
)
@@ -25,68 +26,52 @@ func ParseAddr(str string) (cfg *Addr, err error) {
}
}()
r, _ := regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\S+):(\d+)`, 0)
m, err := r.FindStringMatch(str)
if err != nil {
return nil, errors.New("配置解析错误," + err.Error())
}
r, _ := regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\S+):(\d+)`)
m := r.FindAllStringSubmatch(str, 1)
if m != nil {
var res_v []string
for _, v := range m.Groups() {
res_v = append(res_v, v.String())
}
addr, err := net.ResolveTCPAddr("tcp", res_v[4]+":"+res_v[5])
addr, err := net.ResolveTCPAddr("tcp", m[0][4]+":"+m[0][5])
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{
scheam: res_v[1],
user: res_v[2],
passwd: res_v[3],
ip: res_v[4],
scheam: m[0][1],
user: m[0][2],
passwd: m[0][3],
ip: m[0][4],
port: addr.Port,
}, nil
}
r, _ = regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\d+)`, 0)
m, err = r.FindStringMatch(str)
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])
r, _ = regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\d+)`)
m = r.FindAllStringSubmatch(str, 1)
if m != nil {
port, _ := strconv.Atoi(m[0][4])
return &Addr{
scheam: res_v[1],
user: res_v[2],
passwd: res_v[3],
scheam: m[0][1],
user: m[0][2],
passwd: m[0][3],
ip: "",
port: port,
}, nil
}
r, _ = regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)$`, 0)
m, err = r.FindStringMatch(str)
if err != nil {
return nil, errors.New("配置解析错误," + err.Error())
}
r, _ = regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)$`)
m = r.FindAllStringSubmatch(str, 1)
if m != nil {
var res_v []string
for _, v := range m.Groups() {
res_v = append(res_v, v.String())
}
addr, err := net.ResolveTCPAddr("tcp", res_v[2]+":"+res_v[3])
addr, err := net.ResolveTCPAddr("tcp", m[0][2]+":"+m[0][3])
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{
scheam: res_v[1],
scheam: m[0][1],
user: "",
passwd: "",
ip: res_v[2],
ip: m[0][2],
port: addr.Port,
}, nil
}
+12 -11
View File
@@ -4,15 +4,16 @@ import (
"bytes"
"errors"
"fmt"
"github.com/dlclark/regexp2"
"github.com/google/uuid"
"math/rand"
"net"
"rakshasa/aes"
"regexp"
"strings"
"sync"
"sync/atomic"
"time"
"github.com/google/uuid"
)
var Debug bool = false
@@ -28,10 +29,10 @@ var EnableTermVt bool
// 数据包结构 包长(2byteUUID+UUID+MsgId+Ttl+cmd包
type Msg struct {
From string
To string
MsgId uint32
Ttl uint8
From string
To string
MsgId uint32
Ttl uint8
CmdOpteion uint8
CmdId uint32
CmdData []byte
@@ -311,13 +312,13 @@ func ResolveTCPAddr(str string) ([]string, error) {
dst = append(dst[:i], dst[i+1:]...)
} else {
if _, err := net.ResolveTCPAddr("tcp", addr); err != nil {
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)
match,_ :=r.MatchString(addr)
if !match{
if i > 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)
if !match {
return nil, fmt.Errorf("参数错误 格式为\"ip:端口\",多个地址以逗号隔开,错误详情%v", err)
}
}else{
} else {
return nil, fmt.Errorf("参数错误 格式为\"ip:端口,第二个地址可以是UUID\",多个地址以逗号隔开,错误详情%v", err)
}
+1 -2
View File
@@ -2,7 +2,6 @@ dstnode:
#- 192.168.1.180:8883
password: ""
port: 8884
listenip:
- 192.168.1.151
listenip: 192.168.1.151
limit: false
filename: config.yaml
+4 -2
View File
@@ -4,11 +4,13 @@ go 1.16
replace github.com/abiosoft/readline => ./readline
replace cert => ./cert
require (
cert v0.0.0-00010101000000-000000000000
github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db
github.com/creack/pty v1.1.18
github.com/dlclark/regexp2 v1.7.0
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40
github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 // indirect
github.com/google/uuid v1.3.0
github.com/luyu6056/ishell v1.0.1
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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
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/go.mod h1:Gdtd77IQrjXqFfiourWpNnE1jDPC4opZPDPxPLWFlr0=
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
+3 -3
View File
@@ -1,13 +1,13 @@
package main
import (
"cert"
"flag"
"fmt"
"log"
"net/http"
_ "net/http/pprof"
"rakshasa/aes"
"rakshasa/cert"
"rakshasa/common"
"rakshasa/httppool"
"rakshasa/server"
@@ -108,7 +108,7 @@ func main() {
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
server.InitCurrentNode()
@@ -133,7 +133,7 @@ func main() {
if *shellCode != "" {
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)
}
+1 -1
View File
@@ -30,7 +30,7 @@ rakshasa是一个用Go编写的程序,旨在创建一个能够实现**多级
- Go语言:因为Go语言是一门高效的并发编程语言,非常适合网络编程。
- github.com/abiosoft/ishell包:实现各操作系统中的CLI。
- github.com/creack/pty包:实现Linux伪终端,可以执行交互式命令与更高级的终端显示效果。
- github.com/dlclark/regexp2包:全功能正则表达式
- github.com/farmerx/gorsa包:实现私钥加密公钥解密,用来解决节点权限限制
## 4. 项目结构
+10 -9
View File
@@ -2,6 +2,7 @@ package server
import (
"bytes"
"cert"
"crypto/tls"
"encoding/json"
"fmt"
@@ -10,7 +11,6 @@ import (
"net"
"net/url"
"rakshasa/aes"
"rakshasa/cert"
"rakshasa/common"
"strconv"
"strings"
@@ -690,12 +690,6 @@ func (c *Conn) handle() {
func (c *Conn) reg() error {
var err error
c.nodeConn, err = tls.Dial("tcp", c.nodeaddr, cert.Tlsconfig.Clone())
if err != nil {
return err
}
reg := &common.RegMsg{
UUID: currentNode.uuid,
MainIp: cert.RSAEncrypterStr(currentNode.mainIp),
@@ -710,7 +704,6 @@ func (c *Conn) reg() error {
CmdOpteion: common.CMD_REG,
CmdData: regb,
}
if err = c.tlsWrite(msg.Marshal()); err != nil {
return err
}
@@ -734,7 +727,15 @@ func (c *Conn) Write(b []byte) {
func (c *Conn) tlsWrite(b []byte) error {
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 {
c.Close("Write " + err.Error())
upNodeWrite <- b
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"net"
"net/url"
"os"
"rakshasa/cert"
"cert"
"rakshasa/common"
"rakshasa/httppool"
"runtime/debug"
+22 -19
View File
@@ -2,6 +2,7 @@ package server
import (
"bytes"
"cert"
"crypto/tls"
"encoding/json"
"errors"
@@ -11,7 +12,6 @@ import (
"math/rand"
"net"
"os"
"rakshasa/cert"
"rakshasa/common"
"runtime"
"strconv"
@@ -226,18 +226,21 @@ func connectNew(addr string) (n *node, e error) {
addrs, e := i.Addrs()
if e == nil {
for _, localAddr := range addrs {
go func() {
go func(localAddr net.Addr) {
localstr := localAddr.String()
localstr = localstr[:strings.LastIndex(localstr, "/")] + ":0"
laddr, _ := net.ResolveTCPAddr("tcp", localstr)
if netconn, e := net.DialTCP("tcp", laddr, raddr); e == nil {
conn := tls.Client(netconn, config)
select {
case connChan <- conn:
default:
if laddr!=nil{
if netconn, e := net.DialTCP("tcp", laddr, raddr); e == nil {
conn := tls.Client(netconn, config)
select {
case connChan <- conn:
default:
}
}
}
}()
}(localAddr)
}
}
}
@@ -470,6 +473,8 @@ func (n *node) do(msg *common.Msg) {
}
currentNode.broadcastNode()
//把本机所有节点同步到注册机器
go n.writeGetNodeResult(msg.CmdId)
}()
case common.CMD_REG_RESULT:
var regmsg common.RegMsg
@@ -536,8 +541,8 @@ func (n *node) do(msg *common.Msg) {
default:
}
//回复节点
//n.writeGetNodeResult(msg.CmdId)
//交换节点
n.writeGetNodeResult(msg.CmdId)
case common.CMD_REMOTE_REG:
@@ -616,8 +621,7 @@ func (n *node) do(msg *common.Msg) {
}
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:
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 {
return
}
if n.uuid == currentNode.uuid {
return nil, errors.New("不能连接自己")
}
for i := 1; i < len(dst); i++ {
n, err = n.remoteReg(dst[i])
if err != nil {
return nil, fmt.Errorf("%s,%v", dst[i], err)
}
}
if n == nil {
return nil, fmt.Errorf("无法连接 %v", dst)
}
if n.uuid == currentNode.uuid {
return nil, errors.New("不能连接自己")
if n.uuid == currentNode.uuid {
return nil, errors.New("不能连接自己")
}
}
n.reConnectAddrs = make([]string, len(dst))
copy(n.reConnectAddrs, dst)
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"hash/crc32"
"math/rand"
"net"
"rakshasa/cert"
"cert"
"rakshasa/common"
"strconv"
"strings"
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"errors"
"fmt"
"math/rand"
"rakshasa/cert"
"cert"
"rakshasa/common"
"strconv"
"strings"
+14 -11
View File
@@ -6,6 +6,7 @@ package server
*/
import (
"bytes"
"cert"
"encoding/json"
"fmt"
"io"
@@ -13,8 +14,9 @@ import (
"os"
"os/exec"
"rakshasa/aes"
"rakshasa/cert"
"rakshasa/common"
"regexp"
"runtime"
"strconv"
"strings"
@@ -24,7 +26,6 @@ import (
"github.com/abiosoft/readline"
"github.com/creack/pty"
"github.com/dlclark/regexp2"
"github.com/luyu6056/ishell"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
@@ -109,7 +110,7 @@ func init() {
c.Println(c.Args)
currentConfig.Password = c.Args[0]
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{
@@ -133,7 +134,9 @@ func init() {
currentConfig.Port = port
currentNode.port = port
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
} else {
pwd += "/" + dir
pwd = strings.TrimRight(realpath(pwd), "/")
pwd = strings.TrimRight(getRealPath(pwd), "/")
}
resChan := make(chan interface{}, 1)
@@ -326,7 +329,7 @@ func init() {
}
filename := pwd[i+1:]
dir := pwd[:i]
dir = strings.TrimRight(realpath(dir), "/") + "/"
dir = strings.TrimRight(getRealPath(dir), "/") + "/"
pwd = dir + filename
resChan := make(chan interface{}, 9999) //避免收消息阻塞
@@ -432,7 +435,7 @@ func init() {
}
filename := pwd[i+1:]
dir := pwd[:i]
dir = strings.TrimRight(realpath(dir), "/") + "/"
dir = strings.TrimRight(getRealPath(dir), "/") + "/"
mydir, err := os.Getwd()
local := "./" + filename
if err == nil {
@@ -468,7 +471,7 @@ func init() {
b[be+5] = byte(total >> 40)
b[be+6] = byte(total >> 48)
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()
size := int64(0)
resnum := 0
@@ -621,8 +624,8 @@ func init() {
if !common.EnableTermVt {
s.translate = func(in []byte) ([]byte, error) {
if in[0] == 27 {
r, _ := regexp2.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`, 0)
res, _ := r.Replace(string(in), "", 0, -1)
r, _ := regexp.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`)
res := r.ReplaceAllString(string(in), "")
return []byte(res), 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, "/")
realpath := []string{}
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"os"
"os/exec"
"path/filepath"
"rakshasa/cert"
"cert"
"rakshasa/common"
"strconv"
"time"
+2 -1
View File
@@ -11,7 +11,7 @@ import (
var (
kernel32 = syscall.MustLoadDLL("kernel32.dll")
VirtualProtect = kernel32.MustFindProc("VirtualProtect")
old32 = syscall.MustLoadDLL("ole32.dll")
CoTaskMemAlloc = old32.MustFindProc("CoTaskMemAlloc")
)
@@ -22,6 +22,7 @@ func shellcodeRun(code []byte) error {
fmt.Println(err)
}
}()
VirtualProtect := kernel32.MustFindProc("VirtualProtect")
l := uintptr(len(code))
pwstrLocal, _, _ := CoTaskMemAlloc.Call(l)
+3 -7
View File
@@ -2,6 +2,7 @@ package server
import (
"bytes"
"cert"
"encoding/binary"
"errors"
"fmt"
@@ -9,7 +10,6 @@ import (
"log"
"math/rand"
"net"
"rakshasa/cert"
"rakshasa/common"
"runtime/debug"
"strconv"
@@ -23,8 +23,6 @@ import (
)
const (
STATUS_OFF = 0
STATUS_ON = 1
UDP_PORT_MIN = 30000
UDP_PORT_MAX = 60000
SOCKES5_VERSION = 5
@@ -32,13 +30,11 @@ const (
var (
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")
)
const (
SERVER_NUM = 4 //有效的连接数量
CONN_AUTH_CLOSE = 0
CONN_AUTH_NONE = 1
CONN_AUTH_PW = 2
@@ -270,7 +266,7 @@ func handleSocks5Local(s *clientConnect) {
if len(data) > 2 {
if data[0] == 5 {
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
} else {
s.conn.Write(SOCKES5_AUTH_SUSSCES)