Loading... ## 编译EXE ```go 编译为Exe go build -ldflags="-s -w -H" main.go -s 省略符号表和调试信息 -w Omit the DWARF symbol table 省略DWARF符号表 -H windowsgui 不打印信息到console (On Windows, -H windowsgui writes a "GUI binary" instead of a "console binary."),就不会有cmd窗口了 ``` ## 编译DLL 会生成一个.h文件C++ 所需要的类型转换都有,无非就是wchar转换char ```go package main import "C" //export PrintBye func PrintBye() { println("From DLL: Bye!") } //export Sum func Sum(a int, b int) int { return a + b } func main() { // Need a main function to make CGO compile package as C shared library } ``` 编译 ```go 编译: go build -buildmode=c-shared -o exportgo.dll main.go 备注: 1、编译dll文件需要gcc,我这里安装的是:tdm64-gcc-10.3.0-2.exe 2、打印输出不能使用fmt.Println,须用println 3、之间无空格//export Sum,导出函数声明格式注意//与export 4、import "C" ,必须导入“C” 如果没有这个就不会有导出函数 5、必须要有main函数 ``` ## 编译扩展 ```go 这样会去除编译信息 主要是-trimpath 仍然获得模块文件的完整路径 go build -gcflags=-trimpath=$GOPATH -asmflags=-trimpath=$GOPATH -ldflags "-s -w -H=windowsgui" ``` -trimpath=$GOPATH -asmflags=-trimpath=$GOPATH 解决方法 将`-trimpath`参数用于`go build`(而不是`gcflags`或`asmflags`): 没有`-trimpath`: ```go $ go build . $ ./panic panic: bleh goroutine 1 [running]: main.example(0xc000046738,0x2,0x4,0x473f2b,0x5,0xa) /home/me/stuff/src/github.com/me/testing/panic/main.go:9 +0x39 main.main() /home/me/stuff/src/github.com/me/testing/panic/main.go:4 +0x72 ``` 使用`-trimpath`: ```go $ go build -trimpath . $ ./panic panic: bleh goroutine 1 [running]: main.example(0xc000046738,0xa) github.com/me/testing/panic/main.go:9 +0x39 main.main() github.com/me/testing/panic/main.go:4 +0x72 ``` ### 删除trace文件信息 在go中触发 panic 时,文件目录也是泄漏信息的一部分。比如上图就包括了小黑客用的操作系(Linux),小黑客的名字(nikos),如果你用homebrew版本的Go还会泄漏你的编译器版本。所以这些也要删掉! 这些信息的来源是编译器运行时所处环境的环境变量。 函数编译时,环境变量就是这样。 ```go GOROOT=/opt/go GOPATH=/home/nikos/projects/go GOROOT_FINAL=$GOROOT ``` 这几个都是可以改的。根据参考资料,编译时GO会从$GOPATH寻找我们自己的代码,从$GOROOT提取标准库,在打包时将GOROOT改写为GOROOT_FINAL并作为trace信息的一部分写入目标文件。改写$GOPATH的方式也很简单,在一个不起眼的目录里对真实的GOPATH创建一个软链接(快捷方式),编译器在寻找时就会把快捷方式的目录名写到最终文件里,从而达到我们隐藏自己的目的。 话不多说,上代码。放到自己的.bash_profile或.zshrc中即可 ```go 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 ``` 我个人把GOROOT_FINAL也写入为GOPATH,其实这个字符串可以是任意值,但写成一样的话,可以让逆向人员无法分辨,调用的库是我们自己写的还是go语言的标准库。非常猥琐哦~ 这样一来,生成的二进制文件就相当于其他语言编译时的Release版本了。再发散一下,自己写一个库,将关键的字符串做成外部资源并在调用时解密,代码中不保留明文,再破解就只能人肉跟踪函数了。满分! 个人建议使用010Edit对字符串搜索然后去替换 ## 添加icon 随便创建一个文档。 写上这个配置 IDI_ICON1 ICON "logo.ico" ![image.png](https://www.irohane.top/usr/uploads/2023/05/897533700.png) 之后在goland中输入,转换main.syso文件 windres -o main.syso man.rc ![image.png](https://www.irohane.top/usr/uploads/2023/05/1958309374.png) go 创建生成的时候一定要后面 . 不要指定,指定后试了同名也不会生效 go build -ldflags "-H=windowsui -s -w -extldflags=static" . ![image.png](https://www.irohane.top/usr/uploads/2023/05/3426132451.png) 最后修改:2023 年 05 月 26 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏
2 条评论
表评论6827
表评论1817