I would say that there’s no such thing as “uncrackable” software, but there are a few software components (not entire programs) which could be described as uncrackable.
Specifically, I’m thinking about key generation (keygen) algorithms. Conventional software key protected software works like this. The programmer has a secret key generation algorithm that generates psuedo-random keys. The algorithm can be arbitrarily complex. The application contains a verification routine which, based on the programmer’s knowledge of the secret key generation algorithm, can validate whether or not an entered key is valid. The program refuses to run (or runs in a trial mode, etc.) if you don’t have a valid key.
Now, there are probably any number of ways that this entire validation routine can be ignored entirely. By modifying the program, you can simply skip these checks and allow the program to run without a valid key. Alternately, you could just modify the validation routine to accept any key. However, it is more challenging and less disruptive to the end user if you can create an alternate keygen of your own. By studying how the validation routine works and “reversing” it, you can come with an algorithm that makes keys which will be accepted by the program. Your keygen may or may not be identical to that of the original programmer’s, but as long as it generates keys which will be validated by the program, it doesn’t really matter.
So where’s the uncrackable part?
Well, modern keygen protection systems are increasingly taking a cue from public-key cryptography (asymmetrical crypto). Newer keygens typically consist of two steps: 1) A conventional key generation algorithm and 2) the result of part 1 is then signed by the private half of a key pair (ex. RSA, DSA, etc.). Now part 1 can still be reversed by a cracker. However, without access to a quantum computer, which so far as anyone knows is still a matter of science fiction, it is not possible for the cracker to reverse the programmer’s private key from the public key used to validate the signature. Well…technically, you can, but it would take longer than the age of the universe. So for all practical intents and purposes, it is not possible for a cracker to create a keygen program which will produce valid keys for the program.
Note, however, that it is still susceptible to the simpler forms of attack. The key check can be removed or modified so that it will accept other keys, but this requires patching the program. This is exactly the approach now employed by crackers for these types of programs. For example, they sometimes distribute a patch, which modifies the public key used in the validation routine, and a keygen program which makes keys that are valid for the modified routine.
There are several variations on this scheme, and implementation can be tricky. For example, The software keys for Windows XP and several other Microsoft packages are generated using something called Elliptic Curve Cryptography, which is a form of public key cryptography. Unfortunately for Microsoft, they made a few subtle mistakes in the way they implemented ECC. Subtle as they were, they were just enough to allow one brilliant mathematician to derive their private key without resorting to brute force. It was not long after this that Microsoft’s “Genuine Advantage” program was introduced which replaced the client-side key validation with server-side checks that compared keys to a database of the keys actually issued by Microsoft. I.e., with the right keygen, you can convince your own computer that the keys are valid, but you can’t fool Redmond. Of course, there are ways around this too, but that’s not the point.
The point is that server-side validation is becoming more common, and in a sense, this is also “uncrackable” (unless you can somehow gain access to the validation servers). All recent versions of Windows “call home”, as do applications like the Photoshop CS series, and game distribution systems like Steam. As long as the application code still runs client-side, these checks can be removed, bypassed, or emulated, but the validation itself is effectively beyond the reach of the cracker. These systems are not without disadvantage, however. You must have internet access to use the software, for example. This can definitely be a problem when traveling with a laptop, for instance.
I predict that in the future, more and more software will move totally online. The only way to make software uncrackable is to take it entirely out of the hands of the user. For example, you won’t find any cracks (in the true sense of the word) for World of Warcraft. The client software is useless without the server software. Unless someone manages to steal or leak the server code, it cannot be “cracked”. At most, someone can attempt to emulate the server software, which is never a perfect process. For some, this is the point - they don’t like the design decisions of the official game, so they play on emulated servers which may have slightly or wildly different rules.
For an entirely online application – for example, a web-based word processor – even this is not exactly possible. You could create an identical free version of the product, but that wouldn’t be cracking. Getting your hands on the actual code would be extremely risky, and even if you had it, what then? Deploying it would be difficult since it isn’t designed to be a client application. This software model has a lot of disadvantages for the end user (not the least of which are security and privacy concerns), but I suspect it’s what’s going to forced down our throats next.