0x01

https://github.com/Goqi/Erfrp

https://github.com/uknowsec/frpModify

https://www.anquanke.com/post/id/231685 frp改造二

https://www.anquanke.com/post/id/231424 frp改造一

https://xie.infoq.cn/article/d6e190ea22c428a4e21b4f0d0 Frp 流量隐匿对抗排查

https://www.cnblogs.com/N0r4h/p/15848541.html frp魔改记录

Erfrp比较方便,基于frp-0.45.0,增加了远程配置加载,修改了流量特征,开启默认的tls,还有配置文件删除。

erfrp这个作者有点奇怪,他新加了aes加密ip,但为什么要在这里这样写,这样的话,就相当于如果通过默认配置或者本地或远程加载配置里的ip都只能是明文不能是加密后的,如果配置文件的ip加密了,就读取程序里的加密ip。

解密配置文件ip

pkg/config/server.go:292 
替换成:
net.JoinHostPort(dscrypto.AesDecrypt(svr.cfg.ServerAddr, dscrypto.AESKey), strconv.Itoa(svr.cfg.ServerPort))

删除配置文件

cmd/frpc/root.go:236  删除配置文件不会检查存不存在
替换,执行--delini参数时候运行默认配置并自动删除:
	if delEnable == true {
		if _, errFileExist := os.Stat("frpc.ini"); errFileExist == nil {
			err := os.Remove(cfgFile)
			if err != nil {
				return err
			}
		}else{
			os.Remove(cfgFile)
		}	
			
	}

修改默认配置文件

#修改默认配置文件,为了方便自己使用
pkg/config/DefaultiniBytefrpc.go
pkg/config/DefaultiniBytefrps.go

不自动生成配置文件

cmd/frpc/root.go
# 直接删掉或者注释,这样就可以只允许远程加载

func init() {
	frpcini := "frpc.ini"
	if _, errFileExist := os.Stat(frpcini); errFileExist != nil {
		f, err := os.Create(frpcini)
		if err != nil {
			os.Exit(1)
		}
		_, err = f.Write(config.DefaultiniBytefrpc)
	}

编译ip加密函数

pkg/dscrypto/main/main.go 修改
$#: cd /Erfrp-main/pkg/dscrypto/main
$#: go build main.go
$#: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o amd64.exe main.go
$#: ./main x.x.x.x.

macOs直接交叉编译即可,windows执行里面的build.bat即可编译各个环境

0x02

tips:
frpc --delini  //运行默认配置并删除配置文件
frpc -c http://www.xx.com/xxx.xx //远程加载
frpc reload -c ./frpc.ini //动态加载配置文件,通常会在 10 秒内完成代理的更新

0x03

Linux amd64编译后的有10M以上,使用upx可压缩到4M左右

brew install upx
upx --ultra-brute frpc

本当の声を響かせてよ