いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-378 (garble, 難読化ツール)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

garbleというGo向けの難読化ツールがあるのを知りました。

github.com

面白そうなので、ちょっと使ってみたメモを残しておきます。

試してみた

インストール

$ go install mvdan.cc/garble@latest
go: downloading mvdan.cc/garble v0.12.0
go: downloading github.com/rogpeppe/go-internal v1.12.0
go: downloading golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3
go: downloading github.com/bluekeyes/go-gitdiff v0.7.1

バージョン確認

$ garble version
mvdan.cc/garble v0.12.0

Build settings:
      -buildmode exe
       -compiler gc
  DefaultGODEBUG httplaxcontentlength=1,httpmuxgo121=1,tls10server=1,tlsrsakex=1,tlsunsafeekm=1
     CGO_ENABLED 1
          GOARCH amd64
            GOOS linux
         GOAMD64 v1

試すソースコードを用意

package main

import (
    "log"
    "sync"
)

func init() {
    log.SetFlags(0)
}

func main() {
    const (
        WORKERS = 5
    )

    var (
        ch = make(chan int)
        wg sync.WaitGroup
    )

    wg.Add(WORKERS)
    for i := range WORKERS {
        go func(i int) {
            defer wg.Done()
            ch <- i
        }(i)
    }

    go func() {
        defer close(ch)
        wg.Wait()
    }()

    for v := range ch {
        log.Println(v)
    }
}

ビルド

通常のビルドとgarbleでビルドしたものを用意

$ go build -o app-normal
$ garble build -o app-garble
$ ls -lh app-*
-rwxr-xr-x 1 gitpod gitpod 1.3M Feb 14 09:03 app-garble
-rwxr-xr-x 1 gitpod gitpod 2.0M Feb 14 09:02 app-normal

ファイルサイズが少し小さくなっている。

go versionで見てみる

$ go version ./app-normal 
./app-normal: go1.22.0

$ go version ./app-garble 
./app-garble: unknown

garbleでビルドした方は unknown になっていますね。

実行

$ ./app-normal 
0
2
1
3
4

$ ./app-garble 
2
1
0
3
4

実行は普通に出来ます。

バイナリをちょっと確認

全部見るのは大きいので、末尾の方だけ。

$ hexdump -C ./app-normal | tail -n 30
001e8200  78 63 65 65 64 65 64 45  72 72 6f 72 2c 65 72 72  |xceededError,err|
001e8210  6f 72 00 67 6f 3a 6d 61  69 6e 2e 69 6e 69 74 74  |or.go:main.initt|
001e8220  61 73 6b 73 00 67 6f 3a  72 75 6e 74 69 6d 65 2e  |asks.go:runtime.|
001e8230  69 6e 69 74 74 61 73 6b  73 00 72 75 6e 74 69 6d  |inittasks.runtim|
001e8240  65 2e 64 65 66 61 75 6c  74 47 4f 52 4f 4f 54 2e  |e.defaultGOROOT.|
001e8250  73 74 72 00 72 75 6e 74  69 6d 65 2e 62 75 69 6c  |str.runtime.buil|
001e8260  64 56 65 72 73 69 6f 6e  2e 73 74 72 00 72 75 6e  |dVersion.str.run|
001e8270  74 69 6d 65 2e 6d 6f 64  69 6e 66 6f 2e 73 74 72  |time.modinfo.str|
001e8280  00 67 6f 3a 62 75 69 6c  64 69 6e 66 6f 00 67 6f  |.go:buildinfo.go|
001e8290  3a 62 75 69 6c 64 69 6e  66 6f 2e 72 65 66 00 74  |:buildinfo.ref.t|
001e82a0  79 70 65 3a 2a 00 72 75  6e 74 69 6d 65 2e 74 65  |ype:*.runtime.te|
001e82b0  78 74 73 65 63 74 69 6f  6e 6d 61 70 00 00 2e 74  |xtsectionmap...t|
001e82c0  65 78 74 00 2e 6e 6f 70  74 72 64 61 74 61 00 2e  |ext..noptrdata..|
001e82d0  64 61 74 61 00 2e 62 73  73 00 2e 6e 6f 70 74 72  |data..bss..noptr|
001e82e0  62 73 73 00 2e 67 6f 2e  66 75 7a 7a 63 6e 74 72  |bss..go.fuzzcntr|
001e82f0  73 00 2e 67 6f 2e 62 75  69 6c 64 69 6e 66 6f 00  |s..go.buildinfo.|
001e8300  2e 6e 6f 74 65 2e 67 6f  2e 62 75 69 6c 64 69 64  |.note.go.buildid|
001e8310  00 2e 65 6c 66 64 61 74  61 00 2e 72 6f 64 61 74  |..elfdata..rodat|
001e8320  61 00 2e 74 79 70 65 6c  69 6e 6b 00 2e 69 74 61  |a..typelink..ita|
001e8330  62 6c 69 6e 6b 00 2e 67  6f 73 79 6d 74 61 62 00  |blink..gosymtab.|
001e8340  2e 67 6f 70 63 6c 6e 74  61 62 00 2e 73 79 6d 74  |.gopclntab..symt|
001e8350  61 62 00 2e 73 74 72 74  61 62 00 2e 64 65 62 75  |ab..strtab..debu|
001e8360  67 5f 61 62 62 72 65 76  00 2e 64 65 62 75 67 5f  |g_abbrev..debug_|
001e8370  66 72 61 6d 65 00 2e 64  65 62 75 67 5f 69 6e 66  |frame..debug_inf|
001e8380  6f 00 2e 64 65 62 75 67  5f 6c 6f 63 00 2e 64 65  |o..debug_loc..de|
001e8390  62 75 67 5f 6c 69 6e 65  00 2e 64 65 62 75 67 5f  |bug_line..debug_|
001e83a0  67 64 62 5f 73 63 72 69  70 74 73 00 2e 64 65 62  |gdb_scripts..deb|
001e83b0  75 67 5f 72 61 6e 67 65  73 00 2e 73 68 73 74 72  |ug_ranges..shstr|
001e83c0  74 61 62 00                                       |tab.|


$ hexdump -C ./app-garble | tail -n 30
00148810  3a 8c 4a 00 00 00 00 00  18 00 00 00 00 00 00 00  |:.J.............|
00148820  2f 96 4a 00 00 00 00 00  1b 00 00 00 00 00 00 00  |/.J.............|
00148830  d6 9c 4a 00 00 00 00 00  1d 00 00 00 00 00 00 00  |..J.............|
00148840  8e 7f 4a 00 00 00 00 00  14 00 00 00 00 00 00 00  |..J.............|
00148850  79 72 4a 00 00 00 00 00  10 00 00 00 00 00 00 00  |yrJ.............|
00148860  72 7c 4a 00 00 00 00 00  13 00 00 00 00 00 00 00  |r|J.............|
00148870  ab 6f 4a 00 00 00 00 00  0f 00 00 00 00 00 00 00  |.oJ.............|
00148880  c9 75 4a 00 00 00 00 00  11 00 00 00 00 00 00 00  |.uJ.............|
00148890  98 78 4a 00 00 00 00 00  12 00 00 00 00 00 00 00  |.xJ.............|
001488a0  49 92 4a 00 00 00 00 00  1a 00 00 00 00 00 00 00  |I.J.............|
001488b0  ba 6f 4a 00 00 00 00 00  0f 00 00 00 00 00 00 00  |.oJ.............|
001488c0  a2 7f 4a 00 00 00 00 00  14 00 00 00 00 00 00 00  |..J.............|
001488d0  4a 96 4a 00 00 00 00 00  1b 00 00 00 00 00 00 00  |J.J.............|
001488e0  0b 63 4a 00 00 00 00 00  0a 00 00 00 00 00 00 00  |.cJ.............|
001488f0  80 82 4a 00 00 00 00 00  15 00 00 00 00 00 00 00  |..J.............|
00148900  7d b5 4a 00 00 00 00 00  25 00 00 00 00 00 00 00  |}.J.....%.......|
00148910  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00148920  00 02 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00148930  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0014a000  00 2e 74 65 78 74 00 2e  6e 6f 70 74 72 64 61 74  |..text..noptrdat|
0014a010  61 00 2e 64 61 74 61 00  2e 62 73 73 00 2e 6e 6f  |a..data..bss..no|
0014a020  70 74 72 62 73 73 00 2e  67 6f 2e 66 75 7a 7a 63  |ptrbss..go.fuzzc|
0014a030  6e 74 72 73 00 2e 67 6f  2e 62 75 69 6c 64 69 6e  |ntrs..go.buildin|
0014a040  66 6f 00 2e 65 6c 66 64  61 74 61 00 2e 72 6f 64  |fo..elfdata..rod|
0014a050  61 74 61 00 2e 74 79 70  65 6c 69 6e 6b 00 2e 69  |ata..typelink..i|
0014a060  74 61 62 6c 69 6e 6b 00  2e 67 6f 73 79 6d 74 61  |tablink..gosymta|
0014a070  62 00 2e 67 6f 70 63 6c  6e 74 61 62 00 2e 73 68  |b..gopclntab..sh|
0014a080  73 74 72 74 61 62 00                              |strtab.|

変わってますね。

参考情報

Goのおすすめ書籍

上の書籍の日本語版が下です。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。