What
is Snob? ( Contents)
If you distribute
the source code of the whole or part of your project
distribution and want to protect your intellectual
property embodied in the code, Snob is an inexpensive
and versatile tool for you to achieve this goal.
Even if you are
distributing a pre-compiled library, you may want to
obfuscate the names that are not part of your API
because relocation tables in the library (and/or its
modules) do contain names from your source code.
"Snob"
sntands for "simple (or stupid, if you
like it better) name obfuscator".
Snob removes comments and replaces meaningful names
(identifiers) in your source code with meaningless and
similarly looking ones. This makes the code very hard to
read for a human being (but not a computer). As a usual
practice, a name obfuscator is used when the source code
containing proprietary knowledge needs to be
distributed. When a reader encounters your obfuscated
code, at the very least he understands that you wanted
to protect it and that it is not really for human eyes.
If he still wants to figure out how the code works, the
task is much harder if the names are meaningless.
Snob is freely
configurable to your project's programming languages and
to your needs in removing unwanted comments and
obfuscating names in an unrecoverable way.
This
flexibility is achieved by wide use of regular
expressions in Snob configuration. Among the many
choices in third-party regular expressions support
Snob uses arguably the best: PCRE library package,
which is open source software, written by Philip
Hazel, and
copyright the University of Cambridge, England. See
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
What
is in Snob for me? (
Contents)
Here are a few cases
where you may favor name obfuscation and comments
removal:
Code in a script language ( Contents)
If
your deliverable is, say, in JavaScript, everyone
can see client-side code by looking at the source of
the Web page. Even with the server-side scripts, you
do not necessarily want your customer to understand
the inner workings of the code.
Sometimes, a piece
of your project is just handy to write in Perl or a
shell script language. When the delivery time comes,
you may regret that you need to expose your code.
(Granted, those things are cryptic enough in
themselves but there are quite a few fluent speakers
of those languages.)
Same goes for
Python, Basic, and pretty much any interpreted
language.
Compiled code: Library
deliverables ( Contents)
In a way, the only
case where none of your names are exposed is a
standalone executable (OK, maybe with calls to standard
or third-party shared libraries/DLLs).
If your deliverable contains a library, the latter is
going to have some of the original code's names in its
relocation table. And, of course, your shared library
(or DLL, as the case may be) exposes names of exported
interfaces. If you deliver a static (linkable) library,
it has names internal to the library in relocation
table(s).
Mixed source and compiled code
( Contents)
A typical middleware
deliverable contains a pre-built library (or source code
to build it) and accompanying "glue" or API layer such
as necessary header files, sample application in source
code format and source code helping to integrate your
product into your customer's.
In this scenario,
you want to be selective and decide what comments to
keep and what comments to remove from your source code,
which names should stay intact and which should be
obfuscated.
How does Snob work? (
Contents)
Snob makes a copy
of your project directory tree structure and populates
it with processed versions of files it recognizes in the
project directory tree.
Language configuration
( Contents)
For Snob to
recognize a file, its filename's extension (implying the
programming language) must be known to Snob. For a file
filename.foo ,
Snob looks for the language-specific configuration file
dotfoo.snob .
Snob has natural rules for inheriting and overriding the
configurations in the project directory tree; it gives
you an additional freedom to configure the same language
differently in different subdirectories.
Language-specific
configuration provides for complete flexibility by using
the syntax of regular expressions. You can, for
instance, decide to keep or remove certain comments
selectively (such as explanatory comments vs. PC-Lint
or other tool-oriented comments, such as, e.g., Doxygen).
Project configuration
( Contents)
Snob allows you to
designate certain files as API files; the names there
will not be obfuscated and,depending how exactly they
are designated, they will or will not have their
comments stripped.
You can also
describe to Snob a set of words that should not be
obfuscated. This is handy to prevent erroneous
obfuscation of names coming from any third-party code,
and Snob itself can be empoyed as a tool for fishing for
those names.
Is it hard to configure Snob? ( Contents)
If you have basic
configuration for your programming language(s)
pre-configured, configuring Snob for your project (or,
it may be said, configuring your project for Snob) is
really simple.
The harder part is
to get the language-specific configurations right.
First, check whether your programming language support
is posted on the download
page. We hope to post donated language configurations
there for all to use.
If you are out of
luck and need to create the basic configuration
yourself, you have the following options:
- Do it, maybe, using an
existing configuration as a template, and keep the
configuration all to yourself
- Do it, maybe, using an
existing configuration as a template, and share the
configuration with everyone by sending it to snob@macroexpressions.com
- Ask MacroExpressions to
make a configuration by writing to snob@macroexpressions.com
- Stop using Snob
With options (1) and
(2), you would have to wade through some regular
expressions, which may be even fun.
With
options (2) and (3), the resulting basic
configuration will be posted online, free to any
Snob user. One day you give, another day you
receive...
Any debugging aids? (
Contents)
Your best debugging
aid is your build environment. If the obfuscated project
doesn't build, there must be a problem with project or
language configuration.
Your second best aid
is your regression test: Make sure the obfuscated
project works the same way as the original.
And if you do your
language-specific configuration yourself, do it on a
toy-size project first.
How about a convincing example? ( Contents)
The source code included in
the downloadable C-SLang
distribution is obfuscated with Snob. By
intention (and by configuration) only private header
files in the distribution are obfuscated, except
published interfaces. See if you find non-API header
files there readable.
How do I include Snob in my toolchain? ( Contents)
You probably don't
want to run Snob every time you build your project (such
as a post-link phase).
For your release candidate, all you need to do is to run
Snob on your project directory. And it is handy to have
the snob.exe in the PATH in your system.
It would be wise to
build the obfuscated version of the project (if it needs
compilation) and run the same regression tests on it as
you do on the original project. If the results differ,
there is a problem with Snob configuration, which you've
got to fix (or there is a bug in Snob itself). Normally,
you need to configure Snob only once for your project
and then use the same configuration as long as you don't
add new languages to the project.
If
you have any difficulties configuring or integrating
Snob, please, contact us
and we will be happy to help.
|