最近在用Gin框架+Gorm来写接口查数据库
想实现混淆打包的二进制文件, 避免被轻易反编译, 就发现了Garble
安装Garble教程
确保Go环境已经装好
运行下面的命令
go install mvdan.cc/garble@latest
如果你配了GoPath的话, Garble的可执行文件会在你的$GOPATH/bin目录下, 之后把这个文件剪切到你的Go环境安装目录下的bin目录下, 此时如果你已经给Go配置了环境变量, 打开cmd输入
garble version
可以看到以下, 代表安装并配置全局可用
Garble的使用
常用命令
garble build
用于混淆和构建 Go 程序
示例
garble build main.go
garble test
混淆并运行测试文件
示例
garble test main.go
garble version
检查当前安装的 garble 版本
示例
garble version
常用参数
-literals
混淆文字常量(如字符串、数字等)
示例
garble -literals build main.go
-seed=
指定混淆使用的种子
默认值:固定种子,生成的混淆结果可重复
示例
使用随机种子:
garble -seed=random build main.go
指定固定种子:
garble -seed=12345 build main.go
-debugdir=
将混淆前的源码或文件输出到指定路径,用于调试
示例
garble -debugdir=./debug build main.go
-tiny
进一步缩短混淆后的名称
示例
garble -tiny build main.go
-debug
打印调试信息,用于查看混淆的过程
示例
garble -debug build main.go
-ldflags
传递给 Go 构建器的 ldflags 参数,用于优化二进制文件大小
-s
: 去除符号表 -w
: 去除 DWARF 调试信息
示例
garble build -ldflags "-s -w" main.go
遇到的问题
打包后, 运行二进制文件, 发现Gorm的AutoMigrate不好用了, 我要用这个方法检查数据库结构和代码里面的结构是否相同并修正
通过查询Github的文章, 发现是要给那个结构体加上一行代码, 避免Garble将它混淆
在你的实体类里面加上这一行( Category要改成你的结构体 )
// 忽略garble混淆, 确保 GORM 的反射机制能够正常工作
var _ = reflect.TypeOf(Category{})
加上了之后, Gorm的反射就可以正常工作了
这段代码通过引用类型信息,告诉 Garble 需要保留特定结构体的字段和元信息,以免在运行时出现问题(例如,GORM 中动态解析表结构时的错误), 如果其他的库用到了反射, 涉及到某个结构体, 只需要加上上面这一行代码就可以了
参考文章: