I'd use SystemRescueCD. Actually I always carry a version on a bootable usb stick.
Grap a copy and either make a cd or usb boot stick and boot your machine with it.
There should be enough info on the site to get going.
After boot insert the SD card to you machine and type
You'll see lines like these. Identify you sdcard and the relevant part for later is the /dev/sdXX
It will most likely be /dev/sdb or /dev/sdb1
/dev/sde1: LABEL="SYSRESC" UUID="6FA4-437A" TYPE="vfat"
/dev/sde2: LABEL="KINGSTON" UUID="7590-DD1A" TYPE="vfat"
Then mount some drive with enough space to hold your full sdcard. See sysresc site for more info how to mount your drives as writable.
ddrescue /dev/sdXX /path/to/mountedDrive/filename.img
or (can't remember which I normally use.. both should work)
dd_rescue /dev/sdXX /path/to/mountedDrive/filename.img
replace /dev/sdXX with your drive (e.g. /dev/sdb1) and the latter with the path you mounted and a filename you want to giver your image-copy.
This might take some time and it will try to workaround bad block and io-errors.
To access your data you can do this:
mount -oloop,ro /path/to/mountedDrive/filename.img /tmp/loop
or if you have a new sd.card with the same capasity this will copy it to the new sd card
dd if=/path/to/mountedDrive/filename.img of=/dev/sdXX
Again the sdXX is from blkid command. PLEASE note that this command is dangerous if you happpen to typo the /dev/sdXX part, because it will erase the destination