Hi Brill0,
"Is there a way to tell what a program has been packed with, and then unpack it, or do you have to look at it with softice?"
SoftICE is not especially needed to know what kind of Packer/Encrypter has been used

You can simply check the Section Names for some suspicious names, for example with UPXed files a Section Name looks like "UPX0"

To be more Version specific, that's tougher ;D
And to Unpack it, you can try to Manually Unpack it or otherwise find an Unpacker for this Packer/Encrypter
"how can a program detect if it has been modified. i change a jz to like a jmp or nop it out and it picks it up somehow?"
Then there's probably a CRC check

A CRC check makes an unique Checksum out of the file and Compares that created Checksum with another (Original) Checksum.
If they're not equal, the CRC fails and you get probably an Error box

Otherwise it continues the Program

So you need to find that "weak" spot where it Compares or replace the (Original) Checksum with the newly created Checksum

Hope this helps.
Cya...
CoDe_InSiDe