Alright, this took me a while to figure out, but one source recommended using ddrescue. First get ddrescue on Ubuntu via :
sudo apt-get install gddrescue
Then, suppose you have two hard drives, one smaller one with Ubuntu and Windows installed (e.g. /dev/sda), and a second one, unformatted (e.g. /dev/sdb).
In a terminal, enter:
sudo ddrescue -v /dev/sda /dev/sdb
This copies everything from the original hard drive to the new one.
Wait until that finishes, and then physically disconnect your original hard drive from your motherboard. I’m not sure if it’s necessary, but I actually physically switched the cables going to the original/smaller hard drive to the new/bigger one and completely disconnected the old hard drive from the motherboard. Then I booted as usual, and everything worked normally (Grub loaded fine and both OSes booted fine). When loading Ubuntu, it did a filesystem check which turned out fine.
The reason I wanted to do this was to make my Windows partition bigger w/o making my Ubuntu partition smaller. So, I booted a Gparted Live cd and changed my Ubuntu partition by adding free space before it so that the Windows partition could be extended into the free space. After that was finished, I rebooted and everything booted normally. I went into Windows 7 and extended my Windows partition while in Windows.