pen, paper, text editor, mail and as much face to face with the client as I can.
always try to do a high-level (abstract) design session with the client where you give him papers so he can draw windows, bubbles, lines, schema, whatever... then come back home and immediately (this is important) redraw or assess them using whatever tool you know, which can just be a new and clean sheet of paper.
rewriting the spec when you head will have cleared helps you find parts of the spec which aren't clear, seem redundant or illogical. From that point on, your questions to the client should start being very specific and improve.
When possible, I also try to prototype in this early design session(s), using the REBOL language for its capability to build interface and object prototypes right in front of the client. I can usually pop up an interface mock-up, just as he's finished talking to me (I can type REBOL code with my eyes closed ;-).
Its a very succinct language and its use of DSLs and almost natural language syntax and file format are very effective at describing things and data which the client will actually be able to read right of your text editor!
Here is a complete gui mock-up application which opens a user creation window and a simple confirm dialogue, example:
rebol []
user: make object! [
first-name: "John"
last-name: "Doe"
]
view gui: layout [
text "first name"
field user/first-name
text "last name"
field user/last-name
btn "create" [view layout [text "User was added" btn "close" [unview]]]
]
no need for abysmal XML syntax and complex IDEs which just make the screen look like a total science lab to your client..
for each little topic, you then build one of these little tiny apps and they become an implementation reference. (you can even save any gui to disk as a png using one line of code!:
save/png %user-creation.png to-image gui
which you can easily send to your client for reference and approval too.
hope this helps.