burrowers / garble

Obfuscate Go builds
BSD 3-Clause "New" or "Revised" License
3.93k stars 248 forks source link

Gob encoding #764

Closed tandem97 closed 1 year ago

tandem97 commented 1 year ago

What version of Garble and Go are you using?

mvdan.cc/garble v0.10.0

Build settings:
      -buildmode exe
       -compiler gc
     CGO_ENABLED 1
          GOARCH amd64
            GOOS windows
         GOAMD64 v1

go version go1.20.4 windows/amd64

What environment are you running Garble on?

go env Output
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Admin\AppData\Local\go-build
set GOENV=C:\Users\Admin\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\go\pkg\mod
set GONOPROXY=nuke.team/*
set GONOSUMDB=nuke.team/*
set GOOS=windows
set GOPATH=C:\go
set GOPRIVATE=nuke.team/*
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.20.4
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\go\src\С2_payloads\go.mod
set GOWORK=
set CGO_CFLAGS=-O2 -g
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-O2 -g
set CGO_FFLAGS=-O2 -g
set CGO_LDFLAGS=-O2 -g
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=C:\Users\Admin\AppData\Local\Temp\go-build1184724407=/tmp/go-build -gno-record-gcc-switches

What did you do?

i have client and server which use gob to encode their messages. I have problems with decoding because encoded data contains struct fields names which garble modify. I made some experiments and found strange thing. Here is main.go code:

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "test/internal"
)

type Message struct {
    ClientId string
    Data     []byte
}

func main() {
    var buf bytes.Buffer
    gob.NewEncoder(&buf).Encode(internal.Message{ClientId: "some client", Data: []byte{1}})
    fmt.Println(buf.String())

    var buf2 bytes.Buffer
    gob.NewEncoder(&buf2).Encode(Message{ClientId: "some client", Data: []byte{1}})
    fmt.Println(buf2.String())
}

here is internal package code:

package internal

type Message struct {
    ClientId string
    Data     []byte
}

garble.exe -seed=random run .\test.go

What did you expect to see?

the same print of two buffers

What did you see instead?

3��♥☺☺  HOJir8bDv☺��☺☻☺ RVCvdUj5N☺♀☺    JzYNwJvir☺
‼��☺♂some client☺☺☺
+��♥☺☺Message☺��☺☻ClientId☺♀☺♦Data☺
‼��☺♂some client☺☺☺

What is the right way to use garble with gob encoding? How can i save struct field's name from garble? Thanks for help!

lu4p commented 1 year ago

gob uses reflection to get field names, garble will skip types which are reflected.

However this only works for types which are reflected in the same package, you can add a hint for garble to your internal package

 var _ = reflect.TypeOf(Message{})