Spore Registration Code Generator 154
Nils's post deals with key generators. For cracks, usually you find a branch point and invert (or remove the condition) the logic. For example, you'll test to see if the software is registered, and the test may return zero if so, and then jump accordingly. You can change the \"jump if equals zero (je)\" to \"jump if not-equals zero (jne)\" by modifying a single byte. Or you can write no-operations over various portions of the code that do things that you don't want to do.
A would-be cracker disassembles the program and looks for the \"copy protection\" bits, specifically for the algorithm that determines if a serial number is valid. From that code, you can often see what pattern of bits is required to unlock the functionality, and then write a generator to create numbers with those patterns.