0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go语言的默认机制

Linux爱好者 来源:Linux爱好者 作者:Linux爱好者 2022-03-21 11:50 次阅读

本文介绍了作者避免开发者信息泄露的思路。

Go实在是太棒了。一处编译,处处运行,没有依赖,毫无麻烦!

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

删除调试符号

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

af7bfa50-9880-11ec-952b-dac502259ad0.png

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

gobuild-ldflags"-s-w”[

(需要Go版本大于1.7)

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

...
-sdisablesymboltable
-wdisableDWARFgeneration

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

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

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

删除trace文件信息

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

这些信息的来源是编译器运行时所处环境的环境变量。

上图中的函数编译时,环境变量就是这样。

GOROOT=/opt/go
GOPATH=/home/nikos/projects/go
GOROOT_FINAL=$GOROOT

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

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

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

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

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

原文标题:Golang二进制文件混淆保护

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

审核编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 程序
    +关注

    关注

    116

    文章

    3775

    浏览量

    80840
  • 代码
    +关注

    关注

    30

    文章

    4742

    浏览量

    68342
  • 编译
    +关注

    关注

    0

    文章

    653

    浏览量

    32806

原文标题:Golang二进制文件混淆保护

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Go语言简介和安装方法

    Go 又称 Golang ,是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言Go 语言语法与
    发表于 07-19 16:33 545次阅读

    Go语言常量的声明

    Go 语言中, 常量 表示的是固定的值,常量表达式的值在编译期进行计算,常量的值不可以修改。例如:3 、 Let's go 、 3.14 等等。常量中的数据类型只可以是 布尔型 、 数字型 (整数型、浮点型和复数)
    发表于 07-20 15:24 392次阅读

    Go语言中的整数类型

    Go 语言中,整型可以细分成两个种类十个类型。
    发表于 07-20 15:25 894次阅读

    Go语言开发有什么优势?怎么学?

      目前很多IT界的朋友们开始了学习Go这个语言,作为最近几年比较火的服务端开发语言,其开发效率高的特性,使得它迅速的占领了各大公司的服务端开发领域。相比其他服务端开发语言
    发表于 12-19 16:08

    go语言能做什么工作?

    Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长
    发表于 03-22 15:03

    Go开发语言的优势在哪里?

    Go语言是谷歌发布的第二款开源编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性,并专门针对多处理器系统应用程序的编程进行了优化,开发速度极快,可以与C或C++媲美,而且更加安全、支持并行
    发表于 03-22 15:04

    网易有道CEO周枫推荐Go语言并介绍Go语言的3个优点

    网易有道CEO周枫推荐Go语言。他认为Go很好地继承了C语言灵活、简单有效的思想;Go有很高的生产效率;
    的头像 发表于 01-31 14:11 5168次阅读

    Go和Python,Erlang的语言对比分析和Go编程示例概述

    本文对Go和Python、Erlang做了一些有趣的分析对比,相信大家能从中感受到Go语言的强大和与众不同。
    的头像 发表于 07-21 09:52 7690次阅读
    <b class='flag-5'>Go</b>和Python,Erlang的<b class='flag-5'>语言</b>对比分析和<b class='flag-5'>Go</b>编程示例概述

    Go语言在世界各地的使用情况如何?

    【导读】Go语言在世界各地的使用情况如何?数据说话,带你直观感受什么叫“酷小孩都用的语言”! JetBrains 官方博客发表了一篇题为"The state of Go"的文章,他们通
    的头像 发表于 02-26 14:10 4001次阅读
    <b class='flag-5'>Go</b><b class='flag-5'>语言</b>在世界各地的使用情况如何?

    详解GO语言的趋势与使用情况

    Go 语言简单易学、性能优良。JetBrains Blog 发布了Go 语言的调查报告,看看GO 语言
    的头像 发表于 03-17 11:05 3028次阅读

    Go语言凭借什么成为云原生第一语言的?

    偶然看到有人说, Go 语言目前的火爆可能就是昙花一现而已。这个观点我当然是不认同的。 近几年,关于 Go 与 Java 还有 C 的对比和讨论愈演愈烈,但不可否认的是,在十年多的时间里,Go
    的头像 发表于 04-22 10:15 3153次阅读
    <b class='flag-5'>Go</b><b class='flag-5'>语言</b>凭借什么成为云原生第一<b class='flag-5'>语言</b>的?

    Go编译器已默认启用-G=3支持泛型

    Go 项目代码仓库昨日提交和合并的一个 PR 显示,Go 语言已在 cmd/compile 中默认启用 -G=3。 根据描述,此 PR 将 cmd/compile 的 -G flag
    的头像 发表于 09-01 15:52 2812次阅读
    <b class='flag-5'>Go</b>编译器已<b class='flag-5'>默认</b>启用-G=3支持泛型

    go语言枚举类型怎么用

    go 语言枚举类型是这么用的?在什么场景下会用到枚举?本文对 go 语言枚举做了详细讲解。 枚举,是一种重要的数据类型,由一组键值对组成,通常用来在编程
    的头像 发表于 09-02 09:43 5145次阅读

    带你了解go语言中的闭包

      【 导读】什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式
    的头像 发表于 11-02 15:27 2406次阅读

    go语言中怎么使用HTTP代理

    go语言中怎么使用HTTP代理。
    的头像 发表于 09-01 14:41 2389次阅读