To pull this off you'll need iUnlock + nor + the .fls file, which is available in ZIPs all over. We've got the app here, but this package doesn't include all of the files necessary. Good list of links here, or try here, here, here, here, and here.
For the how-to, just hit up one of those guides down below. Naturally, we offer zero guarantees that any of this will work. (Read: don't whine to us if your iPhone gets bricked.) Big ups to the iphone.unlock crew, Draken, and, of course, the iPhone Dev Team. Let us know in comments if this technique works for you.
Update: We've confirmed the hack! Yes, it's fully restore-resistant, too, which is great news. We'll get you all the juicy proof in a few, but we have indeed managed to software unlock an iPhone with iUnlock. Also, HaRRo says the app should be out "very soon" to make this easier on the noobs.
Update 2: Depending on activation method, YouTube might not be working after the unlock -- ours isn't. This is, of course, expected behavior. There's a Windows script here that should hopefully fix you up (again, we don't make any guarantees), but Mac users will have to look elsewhere. Also, alongside the Mac GUI iUnlock app in the works, the iPhone Dev Team is prepping a Windows version, a simple bash script and an iPhone app -- and eventually an all-in-one app that can do everything from the Jailbreak to the unlock.
Update 3: We've posted our terminal output from using the hack after the break. Go ahead. Nerd out. Also, the graphical version isn't out quiet yet, but we've got the first image of it above. Check it out.
Update 5: Ok, the graphical unlock app still isn't yet out, but we've tested an early build, and it definitely works! Check it out here.
Read - Official unlock guide
Read - Unofficial unlock guide
Terminal session for iUnlock
-sh-3.2# cd /usr/bin
-sh-3.2# chmod +x iUnlock
-sh-3.2# chmod +x minicom
-sh-3.2# launchctl unload -w /System/Library/LaunchDaemons/com.apple.CommCenter.plist
-sh-3.2# iUnlock ICE03.14.08_G.fls nor
iUnlock v42.PROPER -- Copyright 2007 The dev team
Credits: Daeken, Darkmen, guest184, gray, iZsh, pytey, roxfan, Sam, uns, Zappaz, Zf
* Leet Hax not for commercial uses
Punishment: Monkeys coming out of your ass Bruce Almighty style.
Sending Begin Secpack command
Sending Erase command
Waiting For Erase Completion...
Sending Write command
Sending End Secpack command
Validating the write command
FW are equal!
-sh-3.2# bbupdater -v
pinging the baseband...
eep version: EEP_VERSION:207
eep revision: EEP_REVISION:7
"", line 2331, terminal 'hpansi': exit_am_mode but no enter_am_mode
"", line 2385, terminal 'iris-ansi': save_cursor but no restore_cursor
"", line 2403, terminal 'iris-ansi-ap': save_cursor but no restore_cursor
"", line 4359, terminal 'vi603': enter_insert_mode but no exit_insert_mode
"", line 8138, terminal 'dg+ccc': set_color_pair but no initialize_pair
"", line 8508, terminal 'd430c-dg-ccc': set_color_pair but no initialize_pair
"", line 9587, terminal 'hp+color': set_color_pair but no initialize_pair
"", line 9595, terminal 'hp2397a': set_color_pair but no initialize_pair
Welcome to minicom 2.2
Compiled on Jul 21 2007, 05:09:51.
Press CTRL-A Z for help on special keys
AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0
launchctl load -w /System/Library/LaunchDaemons/com.apple.CommCenter.plist
Put in the SIM and voila!