If the software is in the client machine, all you can do is delay the inevitable.
Obfuscation and encryption only makes the task of disassembling harder. If you are going that path, you probably want to reach a point were the they will decide "ok, screw this, I'll implement from scratch because it will take less time". Although, in practice it is very hard (if possible) to reach that point... as others has pointed out most mayor companies don't reach that point.
On the other hand, maybe attackers don't want to create an alternative product! (If what they wanted was to compete with you, then all that there is to it is to stay ahead of the competition and stop worrying.)
In practice there has been an actual arms race is in techniques to mod and prevent modding of software. This happens when you decide to add protection from unwanted copies by adding restriction to your software. If you do that, then all of the sudden you will have a bunch of people willing to modify your product to remove those restrictions without paying. This is even more common than a third party replicating your software, you see it from games (for example the "No CD" patches) to illegal activation of Operating Systems (cough Windows cough), antivirus software, and others.
As said, this is an arms race. You say: Anti-A, and they invent A+1, you say Anti-A+Infinity and they say B. It's like a game of whack-a-mole: they will always find a way to keep popping up until you get tired. You can also think of it as a game of Tetris, you are trying to build a perfect wall without holes... but we all know that there is only a way to finish the game of Tetris (At least the original Tetris): you lose.
So, since they want to mod you software the make patches or patchers software that we call "cracks".
Things may start to look scary when you they start to make cracks. It is common for antivirus companies to add those fake versions of programs to their database. As countermeasure the those who distribute those pieces of software will suggest to disable antivirus... result: a bunch of people running software with the antivirus disabled. You will never know when will they take that opportunity to put actual malicious software in there...
And yes, it affects you. It means less sells for you. On one hand because people use the cracks and on the other because the cracks damages your image.
Since all this problem comes from running code in the client, a common approach is to drive the activation of copies through a server. But the client needs to remember if it is activated...
From the attacker standpoint most of the cases look like an "if" branch that says:
If (Software is Activated) do this Else do that.
All they have to do to unlock your application is to inject some code to negate the verification. So, things like testing the hash of your files to see if they are the originals wont work.
Of course this can be mitigated, take a look to Hash-And-Decrypt, and similar techniques that may actually give some headache to the attacker.
So... ¿Do you want a definitive solution? ¿Something 100% secure?
There are two options:
Never run your software in the client's machine. Run only on your own servers.
Give the software as free and open source. You can add a good legal license, and it will be easy to show that any other software there is a copy. Drive money from something else, like:
2.1. Selling installation and support.
2.2. Additional products.
2.3. Remote "Cloud"
execution computing services.
It all point to Hardware and Cloud. it is not rare that all mayor companies are "moving to the cloud".