Golang二进制文件混淆保护 加密保护

Go实在是太棒了。一处编译,处处运行,没有依赖,毫无麻烦!
不过麻烦的事情来了。我们写一个程序,就是想在别人的电脑上运行的。然而,Go语言的默认机制,会泄漏我们的一些信息,虽然不多,但也有点尴尬。本文结合网上的一些常用方法,总结出一套通用的简单易行的保护措施。
 

减少 golang 二进制文件大小

 

1删除调试符号


默认情况下go编译出的程序在运行出错时会输出自己在哪个线程哪个文件哪个函数哪行出的错,就像这样,

640?wx_fmt=png

图片来源StackOverflow

DWARF信息对于小黑客们可是如获至宝,这些关键信息不能留下。而且去掉这些东西也非常简单:

go build -ldflags "-s -w” [<your/package]

(需要Go版本大于1.7)

这里的 -ldflags 参数最终会在 go tool link 的时候传给它, go tool link -h解释如下

...
  -s    disable symbol table
  -w    disable DWARF generation

 

删除掉调试符号的另一个好处就是,显著减小了文件大小(平均20%)

 

-rwxr-xr-x 1 tim staff 1636736 May 5 11:59 bin/hello  <- 标准编译
-rwxr-xr-x 1 tim staff 1190272 May 5 11:59 hello      <- stripped

 

再加一个UPX壳,还可以压缩到原文件大小的五分之一!不知道为啥,go语言的二进制特别好压!

2删除trace文件信息

在go中触发 panic 时,上图的文件目录也是泄漏信息的一部分。比如上图就包括了小黑客用的操作系统(Linux),小黑客的名字(nikos),如果你用homebrew版本的Go还会泄漏你的编译器版本。所以这些当然也要删掉!
这些信息的来源是编译器运行时所处环境的环境变量。
上图中的函数编译时,环境变量就是这样。

 

GOROOT=/opt/goGOPATH=/home/nikos/projects/goGOROOT_FINAL=$GOROOT

 

这几个都是可以改的哦。根据参考资料,编译时GO会从$GOPATH寻找我们自己的代码,从$GOROOT提取标准库,在打包时将GOROOT改写为GOROOT_FINAL并作为trace信息的一部分写入目标文件。改写$GOPATH的方式也很简单,在一个不起眼的目录里对真实的GOPATH创建一个软链接(快捷方式),编译器在寻找时就会把快捷方式的目录名写到最终文件里,从而达到我们隐藏自己的目的。

话不多说,上代码。放到自己的.bash_profile或.zshrc中即可

 

ACTUAL_GOPATH="~/Programming/go"
export GOPATH='/tmp/go'
export GOROOT_FINAL=$GOPATH
 [ ! -d $GOPATH ] && ln -s "$ACTUAL_GOPATH" "$GOPATH"
 [[ ! $PATH =~ $GOPATH ]] && export PATH=$PATH:$GOPATH/bin

 

 

我个人把GOROOT_FINAL也写入为GOPATH,其实这个字符串可以是任意值,但写成一样的话,可以让逆向人员无法分辨,调用的库是我们自己写的还是go语言的标准库。非常猥琐哦~

这样一来,生成的二进制文件就相当于其他语言编译时的Release版本了。再发散一下,自己写一个库,将关键的字符串做成外部资源并在调用时解密,代码中不保留明文,再破解就只能人肉跟踪函数了。满分!
 

3.使用 UPX 给程序加壳

UPX 不仅能大幅压缩 Golang 静态编译的二进制程序,更能有效的增加反汇编的难度。具体命令为:

upx --brute [ binary ]

UPX 副作用是会增加程序的启动时间,但也无妨啦!

参考资料

 

  • How to reduce compiled file size?

  • Shrink your Go binaries with this one weird trick

  • cmd/link: delete source file path info in panic‘s stack trace for production releases · Issue #13809 · golang/go

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mac Prometheus 是一种用于监控和警报的开源软件,它提供了广泛的监控功能,可用于监控各种应用程序和服务,包括使用 golang 编写的二进制文件。 要在 Mac 上使用 Prometheus 监控 golang 二进制文件,首先需要安装并配置 Prometheus 和相关的组件。可以通过 Homebrew 或手动从 Prometheus 的官方网站下载安装包。安装完成后,需要在 Prometheus 的配置文件中指定要监控的目标和指标。 在 golang 二进制文件中,可以通过 Prometheus 客户端库来暴露自定义的指标。该库提供了一组函数,可以在代码中调用,以便将自定义的指标暴露给 Prometheus。这些指标可以是应用程序的各个方面,如请求处理时间、内存占用、并发连接数等等。 一旦 golang 二进制文件中的指标暴露出来,Prometheus 就可以通过配置文件中的目标来收集这些指标。Prometheus 会按照配置的时间间隔定期访问这些目标,收集指标数据并存储起来。你可以使用 Prometheus 的查询语言 PromQL 来分析和查询这些指标数据,并使用 PromQL 表达式设置警报规则。 为了在 Mac 上实现 golang 二进制文件的监控,你需要编写相应的 golang 代码来使用 Prometheus 客户端库暴露指标。然后,在 Prometheus 的配置文件中指定该 golang 二进制文件的地址作为监控目标。最后,启动 Prometheus 服务,并使用 Prometheus 的界面或 API 来查看和管理指标数据。 总之,通过 Mac Prometheus 监控 golang 二进制文件,你可以轻松地收集和分析应用程序的各种指标,并设置警报规则以监控应用程序的健康状况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值