Skip to content

Last updated on August 18, 2020 — v0.1

Setup

The Windbg debugger plugin is an IDA Pro debugger plugin that uses Microsoft’s debugging engine (dbgeng) that is used by Windbg, Cdb or Kd.

To get started, you need to install the latest Debugging Tools from Microsoft website: Download the Windows Driver Kit (WDK) or from the Windows SDK / DDK package.

Please use ar.exe.idb from samples.zip to follow this tutorial.

After installing the debugging tools, make sure you select "Debugger > Switch Debugger" and select the WinDbg debugger.

Also make sure you specify the correct settings in the “Debugger specific options” dialog:

windbg specific options

User mode
Select this mode for user mode application debugging (default mode)

Kernel mode
Select this mode to attach to a live kernel.

Non Invasive debugging
Select this mode to attach to a process non-invasively

Output flags
These flags tell the debugging engine which kind of output messages to display and which to omit

Kernel mode debugging with reconnect and initial break
Select this option when debugging a kernel and when the connection string contains 'reconnect'. This option will assure that the debugger breaks as soon as possible after a reconnect.

To make these settings permanent, please edit the %IDA%\cfg\dbg_windbg.cfg file.

To specify the debugging tools folder you may add to the PATH environment variable the location of Windbg.exe or edit %IDA%\cfg\ida.cfg and change the value of the DBGTOOLS key.

After the debugger is properly configured, edit the process options and leave the connection string value empty because we intend to debug a local user-mode application.

windbg app setup

Starting the debugger

Now hit F9 to start debugging:

starting

The Windbg plugin is very similar to IDA Pro’s Win32 debugger plugin, nonetheless by using the former, one can benefit from the command line facilities and the extensions that ship with the debugging tools.

For example, one can type !chain to see the registered Windbg extensions:

windbg chain

!gle is another command to get the last error value of a given Win32 API call.

windbg gle

Use of symbolic information

Another benefit of using the Windbg debugger plugin is the use of symbolic information.

Normally, if the debugging symbols path is not set, then the module window will only show the exported names. For example kernel32.dll displays 1603 names:[^1]

kernel32 a

Let us configure a symbol source by adding this environment variable before running IDA:

set _NT_SYMBOL_PATH=srv*C:\temp\pdb*http://msdl.microsoft.com/download/symbols

It is also possible to set the symbol path directly while debugging typing .sympath srv*C:\temp\pdb*http://msdl.microsoft.com/download/symbols in the WINDBG console:

windbg sympath

and then typing .reload /f /v KERNEL32.DLL to reload the symbols:

windbg reload

Now we try again and notice that more symbol names are retrieved from kernel32.dll:

kernel32 b

Now we have 4852 symbols instead!

It is also possible to use the x *!*nt*continue [^2] command to quickly search for symbols:

windbg xntcontinue

Debugging a remote process

We have seen how to debug a local user mode program, now let us see how to debug a remote process. First let us assume that pcA is the target machine (where we will run the debugger server and the debugged program) and pcB is the machine where IDA Pro and the debugging tools are installed.

To start a remote process:

  • On pcA, type: dbgsrv -t tcp:port=5000 [^3]

  • On pcB, setup IDA Pro and Windbg debugger plugin:

  • Application/Input file: these should contain a path to the debuggee residing in pcA

  • Connection string: tcp:port=5000,server=pcA

Now run the program and debug it remotely.

To attach to a remote process, use the same steps to setup pcA and use the same connection string when attaching to the process.

More about connection strings and different protocols (other than TCP/IP) can be found in debugger.chm in the debugging tools folder.

[^1]: Double click at KERNEL32.DLL in Modules window to see this list.

[^2]: Looking for any symbol in any module that contains the word 'continue' after 'nt'

[^3]: change the port number as needed