You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
3.2 KiB
Plaintext
186 lines
3.2 KiB
Plaintext
env GOPRIVATE='test/main,private.source/*'
|
|
|
|
garble build -tags directives
|
|
exec ./main$exe
|
|
cmp stderr main.stderr
|
|
|
|
! binsubstr main$exe 'localName' 'globalConst' 'globalVar' 'globalType' 'valuable information' 'private.source' 'remoteIntReturn' 'intReturn'
|
|
binsubstr main$exe 'magicFunc'
|
|
|
|
[short] stop # no need to verify this with -short
|
|
|
|
# Check that the program works as expected without garble.
|
|
go build -tags directives
|
|
exec ./main$exe
|
|
cmp stderr main.stderr
|
|
|
|
binsubstr main$exe 'globalVar' # 'globalType' only matches on go < 1.15
|
|
! binsubstr main$exe 'localName' 'globalConst' 'remoteIntReturn' 'intReturn'
|
|
|
|
-- extra/go.mod --
|
|
module "private.source/extra"
|
|
|
|
go 1.15
|
|
-- extra/extra.go --
|
|
package extra
|
|
|
|
func Func() string {
|
|
return "This is a separate module to obfuscate."
|
|
}
|
|
-- go.mod --
|
|
module test/main
|
|
|
|
go 1.15
|
|
|
|
// We include an extra module to obfuscate, included in the same original source
|
|
// code via a replace directive.
|
|
require private.source/extra v0.0.0-00010101000000-000000000000
|
|
|
|
replace private.source/extra => ./extra
|
|
-- main.go --
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"go/ast"
|
|
"reflect"
|
|
|
|
"private.source/extra"
|
|
"test/main/sub"
|
|
)
|
|
|
|
// This comment contains valuable information. Ensure it's not in the final binary.
|
|
var V interface{}
|
|
|
|
type T struct {
|
|
ast.Node
|
|
*ast.Ident
|
|
}
|
|
|
|
type EncodingT struct {
|
|
Foo int
|
|
}
|
|
|
|
type Embedded int
|
|
|
|
type Embedding struct {
|
|
Embedded
|
|
}
|
|
|
|
type embedded int
|
|
|
|
type embedding struct {
|
|
embedded
|
|
}
|
|
|
|
// embedded fields whose type is in the universe scope used to crash garble
|
|
type EmbeddingUniverseScope struct {
|
|
error
|
|
int
|
|
string
|
|
}
|
|
|
|
func main() {
|
|
switch V := V.(type) {
|
|
case int:
|
|
var _ int = V
|
|
case nil:
|
|
println("nil case")
|
|
}
|
|
|
|
var _ = reflect.TypeOf(EncodingT{})
|
|
enc, _ := json.Marshal(EncodingT{Foo: 3})
|
|
println(string(enc))
|
|
scopesTest()
|
|
println(extra.Func())
|
|
sub.Test()
|
|
sub.TestDirectives()
|
|
}
|
|
|
|
-- scopes.go --
|
|
package main
|
|
|
|
const globalConst = 1
|
|
|
|
type globalType int
|
|
|
|
var (
|
|
globalVar = 1
|
|
globalVarTyped globalType = 1
|
|
)
|
|
|
|
func scopesTest() {
|
|
println(globalVar, globalConst, globalVarTyped)
|
|
const localNameConst = 1
|
|
|
|
localNameShort := 4
|
|
|
|
type localNameType int
|
|
|
|
var (
|
|
localNameVar = 5
|
|
localNameTypeVar localNameType = 1
|
|
)
|
|
|
|
println(localNameConst, localNameShort, localNameVar, localNameTypeVar, input("input"))
|
|
}
|
|
|
|
func input(localNameParam string) (localNameReturn string) { return localNameParam }
|
|
|
|
-- sub/names.go --
|
|
package sub
|
|
|
|
var someGlobalVar0 = "0"
|
|
var someGlobalVar1 = "1"
|
|
var someGlobalVar2 = "2"
|
|
|
|
func Test() {
|
|
var A, B, C, D, E string
|
|
noop(A, B, C, D, E)
|
|
if someGlobalVar0 != "0" || someGlobalVar1 != "1" || someGlobalVar2 != "2"{
|
|
panic("name collision detected")
|
|
}
|
|
}
|
|
|
|
func noop(...interface{}) {}
|
|
|
|
-- sub/directives.go --
|
|
// +build directives
|
|
|
|
package sub
|
|
|
|
import (
|
|
_ "unsafe"
|
|
_ "test/main/sub/a"
|
|
)
|
|
|
|
//go:linkname remoteIntReturn a.magicFunc
|
|
|
|
func remoteIntReturn() int
|
|
|
|
//go:noinline
|
|
func TestDirectives() {
|
|
if remoteIntReturn() != 42 {
|
|
panic("invalid result")
|
|
}
|
|
}
|
|
-- sub/a/directives.go --
|
|
// +build directives
|
|
|
|
package a
|
|
|
|
import _ "unsafe"
|
|
|
|
//go:linkname intReturn a.magicFunc
|
|
|
|
//go:noinline
|
|
func intReturn() int {
|
|
return 42
|
|
}
|
|
-- main.stderr --
|
|
nil case
|
|
{"Foo":3}
|
|
1 1 1
|
|
1 4 5 1 input
|
|
This is a separate module to obfuscate.
|