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.
garble/testdata/scripts
Daniel Martí 05d0dd1801
reimplement import path obfuscation without goobj2 (#242)
We used to rely on a parallel implementation of an object file parser
and writer to be able to obfuscate import paths. After compiling each
package, we would parse the object file, replace the import paths, and
write the updated object file in-place.

That worked well, in most cases. Unfortunately, it had some flaws:

* Complexity. Even when most of the code is maintained in a separate
  module, the import_obfuscation.go file was still close to a thousand
  lines of code.

* Go compatibility. The object file format changes between Go releases,
  so we were supporting Go 1.15, but not 1.16. Fixing the object file
  package to work with 1.16 would probably break 1.15 support.

* Bugs. For example, we recently had to add a workaround for #224, since
  import paths containing dots after the domain would end up escaped.
  Another example is #190, which seems to be caused by the object file
  parser or writer corrupting the compiled code and causing segfaults in
  some rare edge cases.

Instead, let's drop that method entirely, and force the compiler and
linker to do the work for us. The steps necessary when compiling a
package to obfuscate are:

1) Replace its "package foo" lines with the obfuscated package path. No
   need to separate the package path and name, since the obfuscated path
   does not contain slashes.

2) Replace the "-p pkg/foo" flag with the obfuscated path.

3) Replace the "import" spec lines with the obfuscated package paths,
   for those dependencies which were obfuscated.

4) Replace the "-importcfg [...]" file with a version that uses the
   obfuscated paths instead.

The linker also needs that last step, since it also uses an importcfg
file to find object files.

There are three noteworthy drawbacks to this new method:

1) Since we no longer write object files, we can't use them to store
   data to be cached. As such, the -debugdir flag goes back to using the
   "-a" build flag to always rebuild all packages. On the plus side,
   that caching didn't work very well; see #176.

2) The package name "main" remains in all declarations under it, not
   just "func main", since we can only rename entire packages. This
   seems fine, as it gives little information to the end user.

3) The -tiny mode no longer sets all lines to 0, since it did that by
   modifying object files. As a temporary measure, we instead set all
   top-level declarations to be on line 1. A TODO is added to hopefully
   improve this again in the near future.

The upside is that we get rid of all the issues mentioned before. Plus,
garble now nearly works with Go 1.16, with the exception of two very
minor bugs that look fixable. A follow-up PR will take care of that and
start testing on 1.16.

Fixes #176.
Fixes #190.
3 years ago
..
asm.txt testdata: don't let tests rely on rewriting mod files 4 years ago
basic.txt obfuscate unexported names like exported ones (#227) 3 years ago
cgo.txt testdata: don't let tests rely on rewriting mod files 4 years ago
debugdir.txt reimplement import path obfuscation without goobj2 (#242) 3 years ago
goprivate.txt support typechecking all of std (#236) 3 years ago
goversion.txt testdata: simplify goversion test (#232) 3 years ago
help.txt include a "garble version" test (#221) 3 years ago
implement.txt testdata: don't let tests rely on rewriting mod files 4 years ago
imports.txt reimplement import path obfuscation without goobj2 (#242) 3 years ago
init.txt testdata: add test case for init funcs in many files (#208) 4 years ago
ldflags.txt testdata: don't let tests rely on rewriting mod files 4 years ago
linkname.txt fixed some bugs related to additional linkname corner cases (#210) 3 years ago
literals.txt do not try to obfuscate huge literals (#204) 4 years ago
modinfo.txt testdata: don't let tests rely on rewriting mod files 4 years ago
plugin.txt testdata: don't let tests rely on rewriting mod files 4 years ago
position.txt simplify, improve, and test line obfuscation (#239) 3 years ago
reverse.txt reverse: support unexported names and package paths (#233) 3 years ago
seed.txt testdata: don't let tests rely on rewriting mod files 4 years ago
syntax.txt avoid panic on funcs that almost look like tests (#235) 3 years ago
test.txt reimplement import path obfuscation without goobj2 (#242) 3 years ago
tiny.txt reimplement import path obfuscation without goobj2 (#242) 3 years ago