You can get the list of ivars associated with a class from the Objective-C runtime -- see the class_copyIvarList function. Likewise, you can get the value of an ivar for a specific object using object_getIvar and set it with object_setIvar. These seem like the main tools you'd need to automatically encode an object's ivars.
One place you'll need to be careful is that you won't want to save both the value for a property and the value for the ivar that backs it. So you'll probably want to compare the list of ivars to the list of properties, and only encode/decode those ivars for which there doesn't seem to be a corresponding property.
Also, it's not always desirable to make every last bit of an object's state persistent, so you should consider providing a way to opt out for specific ivars (which might in the end be just as tedious as opting in). As well, you'll probably need to determine which ivars you even can encode, e.g. the usual value types and any types which themselves implement NSCoding.