Each block of 4KB has 12 bytes at the end of it that you can identify it by:
0x0FF4 - byte - Block ID (0x00-0x0D)
0x0FF5 - byte - Unknown
0x0FF6 - word - Checksum (total value of first 3968bytes of block, Modulus 0xFFFF)
0x0FF8 - long word - validation code 0x08012025
0x0FFC - long word - save ID - (highest value is most recent save)
(this is stored in little endian so in a hex editor you'll see the bytes in reverse order - the validation code will show as 25 20 01 08 for example.)
You have to process the blocks and rebuild the whole file before you can really start looking at the data as certain structures, such as PC boxes, cross block boundaries. When you're rebuilding the file, you just take the first 3968bytes of each block and put them all together in order.
In the rebuilt file, party pokemon are at 0x11B8 in RSE and 0x0FB8 in FrLg and box pokemon are at 0x4D84 in all versions. I haven't taken the time to locate pokemon in the day care but they should be easy to find if you look up their names with the appropriate text table.
Does that cover everything? :3
I was going to do something like this for the DS, so you could extract stuff directly from the GBA pokemon cart and basically trade via the internet. It never happened though.