Linux?
Seriously. A Linux LiveCD would do the job, provided it has USB support. It has this lovely little command called 'dd' which raw copies stuff from one file to another. And on Linux, devices like hard disks are treated as files.
Something like 'dd if=/dev/hdX of=/dev/hdY bs=40M' would do the job, where hdX is the source disk (likely hda if it's the IDE Primary Master) and hdY is the destination disk (hdb, hdc, or hdd depending on how many drives your machine has).
Leave it for a couple of hours and it'll make a perfect copy of the hard disk, provided the USB disk is at least as big.
Failing that, try 'gzip -c9 /dev/hdX > /dev/hdY', which will compress the disk image first. The reverse command is 'gunzip -c /dev/hdY > /dev/hdX', but you might want to test it on a scratch disk first.