Let's say I worked for Adobe and wanted to make YOUR (the "cracker's") life really hard. What I'd do then is put only some small but critical part of the software on Adobe servers. And then I'd update the software on the user's computers almost weekly and every week change the part that is done on the Adobe servers. The other think I'd do push lots of updates so that anything you have that is modified would get over written eventually.
The trouble is doing this would require the user have a full time Internet connection and some people do need to work off line.
I'm a big user of Apple's iWork and it's best feature is iCloud storage. This means my data files (paper's I'm writing, presentations and so on) are accessible for every computer I use and automatically backed up. I don't have to be passing the files between computers.
A somewhat sloppy fix for this would be to just NOP the entire update code. The program WOULD function without the "vital" update as obviously all the code has to be on the machine for it to work. So you get all the code, NOP the updater, patch license checkers and other things, and redistribute it.
If you don't know what NOP means, it's an Intel x86 assembly instruction that means No Operation. Basically, do nothing. So by replacing some code you don't like with this, you get rid of that code while keeping the program intact.
Of course, that doesn't account for the possibility that the updater has to flip a switch, so to speak, for the rest of the program to execute. In which case getting rid of the updater code will break the program. The neater and less sloppy fix for this is to reverse the proper conditional checks so that they return true if they should be false or false if they should be true.
Basically for those who don't know, this is tricking the program into thinking the right thing happened when in reality it didn't.
Furthermore, Adobe could even go to the length of encrypting their code and having it decrypt just before being loaded into memory and executed. Although, this technique of "code masking" by encryption is typically used by malware, and this of course would likely cause some, if not most, anti-virus programs to block it.
Even if they did do that, the code has to be plain, unencrypted assembly instructions in memory to be executed. Someone with enough time could do a memory dump and piece together the different parts until they have a full working program.
So ultimately, no matter what Adobe, or any software developer for that matter, decides to do to combat piracy, nothing is bulletproof. If code runs on your computer, you have the ability to modify that code. And as long as you have that ability, you can always patch checks and redistribute a cracked program.