[每周一更]-(第75期):Go相关粗浅的防破解方案

在这里插入图片描述

Go作为编译语言,天然存在跨平台的属性,我们在编译完成后,可以再不暴露源代码的情况下,运行在对应的平台中,但是
还是架不住有逆向工程师的反编译、反汇编的情形;(当然我们写的都不希望被别人偷了,以下内容简单做个攻防介绍,起个引导作用,不到之处,多多留言探讨)

  • 反编码(decompilation)是指将机器代码或二进制代码还原为高级语言源代码的过程。虽然一些工具可以进行反编码,但要注意的是,反编码是一个复杂的任务,成功与否取决于多种因素,包括编译器优化、代码混淆和使用的编程语言。
  • 在Go语言中,由于Go是一种静态编译语言,编译器会将Go代码编译为机器码,而不是保留高级语言结构。这使得从Go二进制文件中还原出与原始Go源代码一样的代码非常困难,甚至几乎是不可能的。

逆向工程(反汇编和反编译)

逆向工程(Reverse Engineering)是指将现有的二进制程序或者系统进行分析,还原出其设计或运行机制的一种技术手段

下面是一些逆向工程的常见技术:

  1. 反汇编技术:通过将二进制程序转化为汇编代码,以还原程序的运行过程和指令执行情况。Go语言提供了反汇编工具,可以通过命令行输入“go tool compile -S可执行文件名”来实现反汇编。
  2. 反编译技术:将已经编译好的程序进行还原,得到其源代码。Go语言的反编译工具是“go tool compile -S 源文件名”,生成的代码需要通过代码分析和修改才能重新编译成可执行程序。
  3. 动态调试技术:通过调试器对程序进行分析,观察程序的运行情况和变量值的变化。Go语言的调试器是“dlv”,可以使用命令行对程序进行单步调试。
  4. 内存分析技术:通过对程序运行时的内存进行分析,以了解程序的行为和数据结构。Go语言的内存分析工具是“pprof”,可以对程序进行CPU、内存和goroutine的分析。

1、破解方案

谈到防破解,首先得知道怎么破解,才能更好的防护;

将Go二进制文件转换为与原始源代码结构相同的高级语言源代码是一项非常困难且不可靠的任务。Go是一种静态编译语言,编译器将Go源代码转换为机器码,优化并去除高级语言结构。因此,反向转换机器码到原始源代码是一个复杂的问题。

虽然有一些工具可以进行反汇编和逆向工程,但这些工具通常无法提供与原始Go源代码结构完全相同的高级语言代码。
这是因为编译器进行了各种优化,同时丢失了一些高级语言结构的信息。

以下是一些可能用到的工具:

IDA Pro: IDA Pro是一款反汇编和逆向工程工具,但它通常只能提供汇编级别的代码,并不能还原为原始的高级语言源代码。

Ghidra: Ghidra是一款开源的逆向工程工具,它提供反汇编和分析二进制文件的功能。与IDA Pro类似,Ghidra也更倾向于提供汇编级别的代码。

汇编代码还原: 逆向工程师可能会尝试还原机器码为汇编代码,但这通常只是一个近似的过程,并不会得到原始的高级语言源代码。

2、防破解方式

防破解一直是个很常见的需求,特别是不能做成服务的、或者需要二进制私部署的场景,Go 的编译特性天然就比脚本类语言更好防逆向,脚本类代码是藏不住的。

当然防破解这个事情主要看投入产出比。Go 在这里的优势主要是省心,同时提高了破解的技术门槛。多数时候,写一个时间戳检查、或者 MAC 比对就很够用了。

举例:比如你可以分离功能逻辑和校验逻辑,校验失败并不会立即触发异常,而是会正常执行功能逻辑,但附加一个随机延迟的取消机制,使得功能完成之前就异常退出。

上述逻辑用 Go 代码写出来大概就是 contextWithCancel 几行代码的事情。这样产生的程序无论静态反编译还是静态调试都会很令人迷惑,静态方面难以定位校验逻辑,动态方面上下文切换缺少规律,实际运行表现又是难以稳定复现的,大幅增加了逆向难度。

除此之外还可以配合 burrowers/garble 之类的自动化混淆工具。

以下是常规的增加破解难度的方式:

  1. 删除调试符号

正常情况,我们go代码,部署完成,如果出现报错和日志等,会有暴露目录内容的风险;

go build -ldflags "-s -w" [<your/package] (go version > 1.7 )
  1. 删除trace文件信息

    放到自己的.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
    
  • https://github.com/golang/go/issues/13809
  1. 代码混淆:
  • 使用工具对Go代码进行混淆,使代码更难以理解。例如,可以使用诸如gobfuscate等工具。
  1. 静态编译: 使用静态编译将依赖项嵌入到二进制文件中,以减少对外部文件的依赖。这可以增加分析和替换的难度。

  2. 加密关键部分:

  • 使用加密算法:使用加密库对关键代码进行加密。运行时在解密后执行这些代码。
  • 例如,您可以使用Go的crypto包进行加密和解密操作。
  1. 代码分割:
  • 模块化代码:将代码组织成模块,然后使用Go的动态导入或插件系统进行加载。
  • 使用Go的plugin包可以实现动态加载。
  1. 使用硬编码密钥:
    将密钥硬编码:在代码中直接将密钥硬编码,而不是存储在配置文件或其他地方
package mainvar encryptionKey = []byte{0x01, 0x02, 0x03, 0x04, 0x05}
  1. 防调试技术:
    使用防调试技术,防止二进制文件在调试器中运行。这可以增加对抗性,使得破解变得更加困难。
    使用runtime/debug包:通过runtime/debug包的ReadBuildInfo函数检查二进制文件是否被构建,从而检测是否在调试模式下运行。
package mainimport ("fmt""runtime/debug"
)func main() {if info := debug.ReadBuildInfo(); info != nil {fmt.Println("Debug information found:", info)// Take appropriate action if running in debug mode}
}
  1. 使用代码签名: 对二进制文件进行数字签名,以确保它的完整性和来源。这可以防止恶意篡改和替换。

  2. 运行时检测: 在运行时检测二进制文件是否被修改。这可以通过计算文件哈希值等方式来实现。

  3. 虚拟化技术: 使用虚拟化技术将关键代码片段放在虚拟机中执行,增加攻击者分析的难度。

  4. 动态链接库: 将一些关键逻辑放入动态链接库,并在运行时动态加载。这可以减少整个二进制文件的复杂性。

参考

  • 分享一些 Go 在全栈开发中的经验

  • 想成为逆向工程师么?

  • 逆向工程介绍

  • 减小 Go 代码编译后的二进制体积-upx

  • Golang二进制文件混淆保护

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/238571.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oops-framework框架 之 创建项目(二)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 构建 本篇博客将使用oops-game-kit 构建一个新的开发项目&#xff0c; 关于 oops-framework 框架的了解&#xff0c;可参考上篇博客&#xff1a; oops-framework框架 之 初始了解(一) 大概…

『 Linux 』环境变量

文章目录 &#x1f680;什么是环境变量&#x1f680;&#x1f680;查看环境变量&#x1f680;&#x1f579;️和环境变量有关的命令&#x1f579;️ &#x1f680;PATH环境变量&#x1f680;&#x1f579;️设置PATH环境变量&#x1f579;️ &#x1f680;HOME环境变量&#x1…

redis主从复制模式和哨兵机制

目录 第一章、主从复制模式1.1&#xff09;Redis 主从复制模式介绍1.2&#xff09;Redis 主从复制实现、 第二章、哨兵机制2.1&#xff09;容灾处理之哨兵2.2&#xff09;Sentinel 配置 第一章、主从复制模式 1.1&#xff09;Redis 主从复制模式介绍 ①单点故障&#xff1a;数…

ASP.NET Core 使用IIS调试出现505.24错误

最近一直再学习asp.net 相关的东西&#xff0c;主要是为前端app提供一个webapi接口。在使用iis调试程序时出现HTTP Error 500.24 - Internal Server Error错误&#xff0c;搞了好久才最终解决。 1.在项目中增加web.config配置文件 2.将配置文件改为如下内容 <?xml version…

【蓝桥杯软件赛 零基础备赛20周】第6周——栈

文章目录 1. 基本数据结构概述1.1 数据结构和算法的关系1.2 线性数据结构概述1.3 二叉树简介 2. 栈2.1 手写栈2.2 CSTL栈2.3 Java 栈2.4 Python栈 3 习题 1. 基本数据结构概述 很多计算机教材提到&#xff1a;程序 数据结构 算法。 “以数据结构为弓&#xff0c;以算法为箭”…

Vue3 的 inject 和 provide (附源码)

一&#xff1a;前言 在前端项目中牵扯的最多的莫过于组件之间的传值了&#xff0c;除了最最常用的 props 和 emit&#xff0c;其实在 Vue 中还额外提供了另外几种方法。今天分享一种组件之间通信的方法&#xff1a;provide 和 inject。 二&#xff1a;使用 1、目录结构 以下是…

网页开发 JS基础

目录 JS概述 基本语法 数据类型内置方法 DOM对象 查找标签 绑定事件 操作标签 jQuery 查找标签 绑定事件 操作标签 Ajax请求 数据接口 前后端分离 ajax的使用 JS概述 一门弱类型的编程语言,属于基于对象和基于原型的脚本语言. 1 直接编写<script>console…

在 AlmaLinux9 上安装Oracle Database 23c

在 AlmaLinux9 上安装Oracle Database 23c 0. 下载 Oracle Database 23c 安装文件1. 安装 Oracle Database 23c3. 连接 Oracle Database 23c4. &#xff08;谨慎&#xff09;卸载 Oracle Database 23c 0. 下载 Oracle Database 23c 安装文件 版权问题&#xff0c;下载地址请等待…

怎么让百度快速收录,百度SEO收录工具

百度收录对于一个网站的重要性不言而喻。拥有良好的百度收录意味着网站能够更好地被搜索引擎收录&#xff0c;为用户提供更精准的搜索结果。而怎样实现百度快速收录成为了许多网站管理员关注的焦点。 百度收录的重要性 百度是国内最大的搜索引擎之一&#xff0c;拥有数以亿计的…

卷积神经网络(VGG-16)猫狗识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 再次检查数据3. 配置数据集4. 可视化数据 三、构建VG-16网络四、编译五、训练模型六、模型评估七、保存and加载模型八、预测…

[github全教程]github版本控制最全教学------- 大厂找工作面试必备!

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

8、内部FLASH模拟EEPROM实验(STM32F407)

STM32编程方式 在线编程&#xff08;ICP,In-Circuit Programming&#xff09;: 通过JTAG/SWD协议或者系统加载程序(Bootloader)下载用户应用程序到微控制器中。 在程序中编程(IAP,In Application Programming):通过任何一种通信接口(如IO端口,USB,CAN,UART,I2C,SPI等)下载程…