初探 Golang 代码混淆

本文首发于 seebug paper:https://paper.seebug.org/1586/ 近年来 Golang 热度飙升,得益于其性能优异、开发效率高、跨平台等特性,被广泛应用在开发领域。在享受 Golang 带来便利的同时,如何保护代码、提高逆向破解难度也是开发者们需要思考的问题。 由于 Golang 的反射等机制,需要将文件路径、函数名等大量信息打包进二进制文件,这部分信息无法被 strip,所以考虑通过混淆代码的方式提高逆向难度。 本文主要通过分析 burrowers/garble 项目的实现来探索 Golang 代码混淆技术,因为相关资料较少,本文大部分内容是通过阅读源码来分析的,如有错误请师傅们在评论区或邮件指正。 前置知识 编译过程 Go 的编译过程可以抽象为: 词法分析:将字符序列转换为 token 序列 语法分析:解析 token 成 AST 类型检查 生成中间代码 生成机器码 本文不展开编译原理的内容,详细内容推荐阅读 Go 语言设计与实现 #编译原理 和 Introduction to the Go compiler。 下面我们从源码角度更直观的探索编译的过程。go build 的实现在 src/cmd/go/internal/work/build.go,忽略设置编译器类型、环境信息等处理,我们只关注最核心的部分: func runBuild(ctx context.Context, cmd *base.Command, args []string) { ... var b Builder ... pkgs := load.PackagesAndErrors(ctx, args) ... a := &Action{Mode: "go build"} for _, p := range pkgs { a....

2021-05-19 · 8 分钟 · rook1e