首页 > 其他分享 >通过端口复用直接进行正向tcp代理--win会被识别为病毒

通过端口复用直接进行正向tcp代理--win会被识别为病毒

时间:2024-06-06 15:59:28浏览次数:19  
标签:return err -- win tcp windows fd func net

学习项目,win会被识别为病毒,关闭病毒和威胁防护,参考 https://blog.csdn.net/u_say2what/article/details/134669122

main.go

package main

import (
	"context"
	"fmt"
	_ "golang.org/x/sys/unix"
	"golang.org/x/sys/windows"
	"io"
	"net"
	"os"
	"runtime"
	"strconv"
	"syscall"
	"time"
)

var timeout = 1

var lc = net.ListenConfig{
	Control: func(network, address string, c syscall.RawConn) error {
		var opErr error
		if runtime.GOOS == "windows" {
			if err := c.Control(func(fd uintptr) {
				opErr = windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_REUSEADDR, 1)
			}); err != nil {
				return err
			}
		} else {
			if err := c.Control(func(fd uintptr) {
				//opErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1)
			}); err != nil {
				return err
			}
		}

		return opErr
	},
}

func isIPAddress(ipStr string) bool {
	ip := net.ParseIP(ipStr)
	return ip != nil
}

func isPort(portStr string) bool {
	port, err := strconv.Atoi(portStr)
	if err != nil {
		return false
	}
	return port > 0 && port <= 65535
}

// 示例 .\main.exe 192.168.20.0 8080 192.168.252.128 8080
func main() {
	lhost := os.Args[1]
	lprot := os.Args[2]
	rhost := os.Args[3]
	rport := os.Args[4]
	if !(isIPAddress(lhost) && isPort(lprot) && isIPAddress(rhost) && isPort(rport)) {
		fmt.Println("'" + os.Args[0] + "' " + "参数不能被识别")
		os.Exit(0)
	}
	if lhost == "0.0.0.0" || lhost == "127.0.0.1" || lhost == rhost {
		fmt.Println("本地地址和远程地址不能为 127.0.0.1,0.0.0.0")
		os.Exit(0)
	} else if lprot == rport && lhost == rhost {
		fmt.Println("参数错误")
		os.Exit(0)
	}
	laddr := fmt.Sprintf("%s:%s", lhost, lprot)
	l, err := lc.Listen(context.Background(), "tcp", laddr)
	go func() {
		time.Sleep(2 * time.Minute)
		l.Close()
		if timeout == 1 {
			os.Exit(0)
		}
	}()
	if err != nil {
		fmt.Println("无法监听端口:", err)
		return
	}
	fmt.Printf("开始监听端口 %s,将转发到 %s:%s\n", lprot, rhost, rport)
	for {
		clientConn, err := l.Accept()
		if err != nil {
			continue
		}
		go handleClient(clientConn, rhost, lprot)
	}
}

func handleClient(clientConn net.Conn, remoteHost, remotePort string) {
	// 连接到目标主机
	serverConn, err := net.Dial("tcp", remoteHost+":"+remotePort)
	if err != nil {
		fmt.Println("连接到目标主机时出错:", err)
		clientConn.Close()
		return
	}
	defer serverConn.Close()

	// 在 goroutine 中进行双向数据传输
	done := make(chan struct{})
	go copyData(clientConn, serverConn, done)
	go copyData(serverConn, clientConn, done)

	// 等待任意一个goroutine完成后关闭另一个连接
	<-done
	clientConn.Close()
	<-done
}

func copyData(dst io.Writer, src io.Reader, done chan<- struct{}) {
	buf := make([]byte, 4096) // 使用较大的缓冲区,提高性能
	_, err := io.CopyBuffer(dst, src, buf)
	if err != nil && err != io.EOF {
		fmt.Println("数据传输时出错:", err)
	}
	done <- struct{}{}
}

使用实例

.\main.exe 192.168.20.0 8080 192.168.252.128 8080
程序 本地地址 本地程序端口 目标地址 目标程序端口

标签:return,err,--,win,tcp,windows,fd,func,net
From: https://www.cnblogs.com/qcy-blog/p/18235262

相关文章

  • 如果是你来设计国产原理图设计软件,你认为应该加一些什么功能?
    虽然国产EDA软件在某些方面可能还在追赶成熟的EDA设计软件,但并不意味着它们不能在某些方面或特定应用场景下表现得更加优秀。在我看来国产原理图设计软件应该具备以下优秀的功能:丰富的元器件库:软件应该提供一个包含各种常用电子元器件的库,包括晶体管、电阻、电容器、集成......
  • Vue指令_v-if&v-show
    VUE指令—v-if及v-showv-if条件性的渲染某元素,判定为true时渲染,否则不渲染,结合v-if-else和v-else使用<body><divid="app">年龄<inputtype="text"v-model="age">经判定,为:<spanv-if="age<=35">年轻人(35及以下)......
  • Android视频开发入门: VideoView、MediaPlayer、 FFmpeg、exoplayer...
    现在,视频功能是越来越普遍的需求。本文将提供一个关于Android视频开发的入门指南,帮助读者快速掌握视频播放、录制和处理等基本功能。1、概述在Android平台上,视频开发主要涉及以下几个方面:视频播放与控制视频录制与处理视频编解码与格式转换视频流媒体与直播接下来,我......
  • Vue指令_v-bind&v-model
    VUE指令—v-bind及v-modelv-bind:为HTML标签绑定属性值,如设置href,css样式等。当vue对象中的数据模型发生变化时,标签的属性值会随之发生变化。v-model:在表单元素上创建双向数据绑定。vue对象的data属性中的数据变化,视图展示会一起变化;视图数据发生变化,vue对象的data属性......
  • Android网络请求:协程+Flow+Retrofit+OkHttp
    在Android开发中,网络请求是一个很常见的任务。随着Kotlin协程和Flow的流行,我们有了新的工具来优雅地处理网络请求。结合Retrofit和OkHttp,我们可以构建一个强大的、易于理解和维护的网络请求框架。一、Kotlin协程与FlowKotlin协程是Kotlin提供的一种轻量级线程管理方式。它......
  • 手写深拷贝
    JSON不支持日期、正则、undefined、函数,环结构JSON.parse(JSON.stringify(obj))JS深拷贝(递归、判断类型、避免环)constcloneDeep=(a,cache)=>{if(!cache){cache=newMap();//避免全局变量,仅第一次拷贝创建}if(cache.get(a)){//避免环......
  • SD321BF 低功耗单运算放大器芯片IC
    一般说明    SD321为低功耗系统带来性能和经济性。具有高单位增益频率和保证0.4V/在此情况下,静态电流仅为430μa/aef(5V)。输入通用模式范围包括地面,因此该设备能够在单电源应用和双电源应用中工作。它还能够舒适地驱动大容量负载。    SD321可在SOT23-5封装......
  • Git 常用命令
    Git常用命令修改commit中的信息1.只修改本地最近一次commit例如,刚刚在本地进行了一次提交gitcommit-m"init"后觉得commit信息太简短了,或者写错了等情况想要修改这次commit信息时,使用:gitcommit--amend这个命令会进入一个vi编辑界面,完成更改后会用一个新的提交顶替......
  • 写一个linux驱动
    简单一点,写一个字符设备驱动。首先我们希望在/dev下面出现一个新的字符设备文件。1.分配一个设备号;intalloc_chrdev_region(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*name);示例:首先定义一个dev_t的变量,它其实就是一个32位的整数。再使用上述函......
  • 超越预期:Containerd 如何成为 Kubernetes 的首选容器运行时
    >作者:尹珉,KubeSphereAmbassado,rKubeSphereContributor,KubeSphere社区用户委员会杭州站站长。踏上Containerd技术之旅容器技术已经成为现代软件开发和部署的核心工具。通过容器,开发者可以创建轻量级、便携的运行环境,从而简化应用程序的开发、测试和部署流程。在容器技术......