初探 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

「SF」子域名搜集工具开发小结

SF 是一个 Golang 开发的高性能的子域名搜集工具,支持字典爆破等搜集方式。项目地址:github.com/0x2E/sf 开发过程中学习了很多文章(见文末),感谢师傅们的分享,于是我也把遇到的几个有意思的点整理了出来。 字典爆破 简易版 net 库提供的 lookup 系列函数不能指定 DNS 服务器,所以用了 miekg/dns,调用起来很简单: func lookup(domain string, resolver string, retry int) string { m := new(dns.Msg) m.SetQuestion(domain, dns.TypeA) // 默认要求递归 var r *dns.Msg var err error for i := 0; i <= retry; i++ { r, err = dns.Exchange(m, resolver) // 默认2秒超时 if err == nil { break } } if err != nil { // 重试之后仍有错误 fmt.Print("lookup error: " + domain + " - " + err....

2021-03-11 · 2 分钟 · rook1e