[...]
That is a very good point about not being able to make it "impossible"
to reverse engineer IP and the need to put important IP on a server.
I just want to make it a bit more difficult for competitors to reverse
engineer.
Well, okay. If you really want to, that's your prerogative. But you're
still forgetting: if the IP has value, your competitors will be
sufficiently motivated to get around whatever barriers you try to put in.
Your IP already has legal protection in the form of copyright and, if you
play your cards right, patent protection as well (I'm not a big fan of the
software patent process, but it does exist and is a legitimate point in
this discussion). At the same time, copy protection techniques do not
work and are a waste of time and effort. As I said, if your IP has enough
value to make it worth protecting, it has enough value to make it worth
bypassing your copy protection.
It's interesting to me that you found that dotObfuscator causes your
program to crash. While I hadn't heard of this sort of problem before,
it's not surprising to me. Copy protection techniques invariably hurt the
legitimate consumer, even as they fail to actually prevent copying.
I would be very wary of taking a carefully constructed executable and
running it through a third-party program for modification before delivery
to the customer. At the very least, you are setting yourself up for a lot
of extra work, as _all_ of your testing will need to be done on the
obfuscated release of the program, and any anomalous behavior that occurs
will require that you not only debug your own code, but that of the
obfuscation system you're using.
And of course, no matter what you do, there's always a chance that some
serious bug will be induced by the obfuscation system that isn't noted
until the program's been released and is in use by the customer. The fact
is that, unlike bug-fixes in your own code where you can take steps,
especially near the end of the release cycle, to avoid making large
changes that could introduce serious problems into other areas of the
code, any obufscation technology will, since it's always applying some
algorithm to your entire application, run the risk of creating a new bug
for even the smallest change to the entire application.
To make things worse, there's no way to contain or restrict the potential
risk of that new bug; unlike with a directed, limited approach with your
own code, even the smallest change to your own code could result in an
arbitrarily disastrous bug caused by the obfuscation.
At the very least, you will probably want to consider minimizing to the
fullest extent possible _what_ code is obfuscated. If you must obfuscate,
do so only on the smallest portion of your code necessary, and make sure
that portion of code is _beyond_ thoroughly tested before release, with
_any_ change to the code justifying a completely new test pass through
that code, no matter how long that takes or how small the change.
Proceed at your own peril and wastefulness of your own resources.
Pete