[每周一更]-(第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 main

var encryptionKey = []byte{0x01, 0x02, 0x03, 0x04, 0x05}

  1. 防调试技术:
    使用防调试技术,防止二进制文件在调试器中运行。这可以增加对抗性,使得破解变得更加困难。
    使用runtime/debug包:通过runtime/debug包的ReadBuildInfo函数检查二进制文件是否被构建,从而检测是否在调试模式下运行。
package main

import (
   "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.mfbz.cn/a/208339.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ringboot-cve_2021_21234:latestSpring Boot 目录遍历 (CVE-2021-21234)漏洞复现

Spring Boot 目录遍历 &#xff08;CVE-2021-21234&#xff09;漏洞复现 Spring-boot-actuator-logview 0.2.13之前版本存在路径遍历漏洞&#xff0c;攻击者可通过该缺陷读取系统任意文件。 名称: Spring Boot 目录遍历 &#xff08;CVE-2021-21234&#xff09; 描述: Sprin…

【Java 基础】13 异常

1.异常是什么 异常是指在程序运行过程中可能发生的、与正常执行流程不符的事件。这些事件可能包括错误、不合理的输入、资源不足等。在 Java 中&#xff0c;异常是通过 throw 语句抛出的&#xff0c;可以是 Java 内置的异常类&#xff0c;也可以是自定义的异常类。 2. 异常类…

12月01日,每日信息差//阿里国际发布3款AI设计生态工具//美团买菜升级为“小象超市”//外国人永居证换新、6国游客免签来华

_灵感 &#x1f396; 阿里国际发布3款AI设计生态工具 &#x1f384; AITO问界系列11月交付新车18827辆 &#x1f30d; 美团买菜升级为“小象超市” &#x1f30b; 全球首个金融风控大模型国际标准出炉&#xff0c;由腾讯牵头制定 &#x1f381; 支付宝&#xff1a;支持外国人…

【代码】基于算术优化算法(AOA)优化参数的随机森林(RF)六分类机器学习预测算法/matlab代码

代码名称&#xff1a;基于算术优化算法&#xff08;AOA&#xff09;优化参数的随机森林&#xff08;RF&#xff09;六分类机器学习预测算法/matlab代码 使用算术优化算法&#xff08;AOA&#xff09;优化分类预测模型的参数&#xff0c;收敛性好&#xff0c;准确率提升明显&am…

中职组网络安全-web-PYsystem003.img-(环境+解析)

​ web安全渗透 1.通过URL访问http://靶机IP/1&#xff0c;对该页面进行渗透测试&#xff0c;将完成后返回的结果内容作为flag值提交&#xff1b; 访问该网页后发现F12被禁用&#xff0c;使用ctrlshifti查看 ctrlshifti 等效于 F12 flag{fc35fdc70d5fc69d269883a822c7a53e}…

二叉树刷题Leetcode

文章目录 104.二叉树的最大深度100.相同的树965.单值二叉树 104.二叉树的最大深度 int maxDepth(struct TreeNode* root) {if(rootNULL)return 0; int left1maxDepth(root->left); int right1maxDepth(root->right); return left>right?left:right; }处理二叉树最大深…

分享88个清新唯美PPT,总有一款适合您

分享88个清新唯美PPT&#xff0c;总有一款适合您 88个清新唯美PPT下载链接&#xff1a;https://pan.baidu.com/s/1XUUjxjmWFw2fJKENjk6_Yg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

unicloud云函数url化后,客户端通过url地址向云函数发送数据流并传递到云存储中

在不久前录制过这样一门课程&#xff0c;使用uniapp生态开发API接口&#xff0c;通过这套课程&#xff0c;你不需要后后端Java、Python、PHP等后端语言&#xff0c;你只需要用前端的知识就可以构建这样一套API接口&#xff0c;而且使用uniapp生态开发接口更简单高效&#xff0c…

VMware17 下载、安装、成功安装效果、完整卸载

VMware17 下载、安装、卸载 下载 VMware17 安装 更改安装路径 去掉这两个复选框&#xff0c;点击安装。 安装结束&#xff0c;点击许可证。 输入序列号&#xff0c;点击【输入】 序列号&#xff1a;MC60H-DWHD5-H80U9-6V85M-8280D 点击完成 测试安装效果 永不过期&am…

跨模态图像翻译:使用具有感知监督的多生成网络合成MR脑图像的CT图像

Cross-modality image translation: CT image synthesis of MR brain images using multi generative network with perceptual supervision 跨模态图像翻译&#xff1a;使用具有感知监督的多生成网络合成MR脑图像的CT图像背景贡献实验方法损失函数Thinking 跨模态图像翻译&…

【已解决】Cannot find project Scala library 2.11.8 for module XXX

问题描述 在 flink 示例程序调试过程中&#xff0c;reload project 报错 Cannot find project Scala library 2.11.8 for module HbasePrint 报错如下图所示&#xff1a; 问题解决 经过搜索&#xff0c;初步判定是 pom 文件中 Scala 版本配置和项目中实际使用的版本不一致导…

java+springboot停车场小区车库租赁预订系统ssm+jsp

该平台为客户和业主提供等信息服务平台的运营方&#xff0c;管理方&#xff0c;如何通过车库平台建立实现优化管理的方法提供参考。能够实现在一个相对广阔的地域内&#xff08;例如一座城市)的多个停车场的随意停车。管理平台会统一调度车位资源&#xff0c;自动进行交易结算。…

【开源】基于JAVA的大病保险管理系统

项目编号&#xff1a; S 031 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S031&#xff0c;文末获取源码。} 项目编号&#xff1a;S031&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大…

Go语言 值传递

官方说法&#xff0c;Go中只有值传递&#xff0c;没有引用传递 而Go语言中的一些让你觉得它是引用传递的原因&#xff0c;是因为Go语言有值类型和引用类型&#xff0c;但是它们都是值传递。 值类型 有int、float、bool、string、array、sturct等 引用类型有slice&#xff0c…

掌握自动化测试必要的几种技能?

1.自动化测试员技能——编程语言 当我开始担任手动测试人员时&#xff0c;我不喜欢编码。但是&#xff0c;当我逐渐进入自动化领域时&#xff0c;对我来说很清楚&#xff0c;如果没有对编程语言的一些基本了解&#xff0c;就无法编写逻辑自动化测试脚本。 对编程有一点了解&a…

MinkowskiEngine安装

pip install torch ninjagit clone https://github.com/NVIDIA/MinkowskiEngine.git cd MinkowskiEngine安装之前先把并行安装的thread数降低&#xff0c;否则会导致进程卡死。 打开setup.py文件内位于142行的MAX_COMPILATION_THREADS变量值从12改成4。 export CXXg-7 python…

挖掘新兴市场:跨境电商中的战略机会

随着全球化进程的不断推进&#xff0c;跨境电商作为连接世界的桥梁&#xff0c;为企业提供了探索新兴市场的机遇。在这个充满活力和竞争的环境中&#xff0c;企业需要制定切实可行的战略&#xff0c;善于把握新兴市场的机会&#xff0c;实现可持续发展。 新兴市场的潜力与机遇 …

matlab基于线性二次调节器(LQR)法实现机器人路径规划可变轨迹跟踪

1、内容简介 略 可以交流、咨询、答疑 2、内容说明 基于线性二次调节器(LQR)法实现机器人路径规划可变轨迹跟踪 3、仿真分析 略 load path.mat %% 轨迹处理 % 定义参考轨迹 refPos_x path(:,1); refPos_y path(:,2); refPos [refPos_x, refPos_y];% 计算航向角和曲率 …

文字识别(OCR)专题——基于NCNN轻量级PaddleOCRv4模型C++推理

前言 PaddleOCR 提供了基于深度学习的文本检测、识别和方向检测等功能。其主要推荐的 PP-OCR 算法在国内外的企业开发者中得到广泛应用。在短短的几年时间里&#xff0c;PP-OCR 的累计 Star 数已经超过了32.2k&#xff0c;常常出现在 GitHub Trending 和 Paperswithcode 的日榜…

python简单进阶之web框架:fastapi使用教程

原文&#xff1a;python简单进阶之web框架&#xff1a;fastapi使用教程 - 知乎 这是简单进阶教程系列第四篇&#xff0c;本系列文章主要介绍那些可以很快上手的进阶库。 我其实学过一段时间Django框架&#xff0c;但是半途而废了&#xff0c;我觉得可能还是简单一点的框架比较适…