2023年1月

假设有一种情况,您从客户那里得到一个内存转储,需要模块(DLL、EXE、OCX等)来进一步调试。。(.NET模块可用于通过反向工程查看源代码。)
我们可以使用windbg目录中的clr10\sos.dll保存所有模块(在获取内存转储时由目标进程加载)。有趣的是,sos.dll不仅可以提取托管模块,还可以保存所有本机/非托管模块!

先加载sos模块

 

然后用!sam <path> OR !SaveAllModule <path> 提取特定磁盘位置上的模块。

 

如果您想查看任何windbg扩展所支持的命令,可以采用各种方法。

  • 你可以用!<ext_name>.help命令查看该扩展支持的所有命令。用扩展模块名替换<ext_name>。(注意:只有特定扩展支持help命令时,此操作才有效。)
  • 您可以在Dependency Walker中打开扩展DLL,它将在导出的功能面板中显示所有命令!command它背后没有任何魔力,它只是一个事实,WinDbg有非常简单的扩展模型,在这里您需要为每个命令实现导出的函数。当我们在Windbg中使用调试器扩展命令时,Windbg只是为那个函数执行GetProcAddress并调用它。依赖性walker具有显示模块导出函数的功能。

 

很多时候,在调试会话中,我们需要加载/重新加载特定模块的符号(在WinDbg的上下文中)。例如,我们开始调试,在调试时设置正常的符号路径并下载,发现我们需要特定模块的符号。我们修改符号文件路径。如果我们这样做了,
.reload /f
它从同一个位置再次加载所有符号,这可能需要时间。
所以,只找到了加载一个特定模块符号的命令,
.reload /f @“mydll.dll”
这将使用最新的符号路径加载mydll.dll的符号。

问题是,我们要调试由其他应用程序运行的应用程序的启动代码!例如,我将打开一个控制台(cmd.exe),然后打开calc.exe,我想调试初始的calc.exe代码。。
Windbg已经解决了这个问题!当您选择“打开可执行文件”时,您有一个小的复选框,上面写着“同时调试子进程”,它实际上确保所有由父EXE生成的进程(您在这个对话框中选择了它!)也由调试器附加。

 

如果您对命令行选项感兴趣,可以使用“-o”选项。

 

只有在使用“|”命令时才会出现这种情况(至少在用户模式下)!因为当我们附加到任何子进程时,它会在windbg命令行的剩余空间中显示正在调试的当前进程,如下所示!

 

如果您执行命令|您将能够看到列表中所有可以调试的进程(一次只能调试一个进程!)。您将得到与下面所示类似的输出。

 

我们还可以使用|<number>s命令在不同进程之间移动。例如,在上面的例子中,如果我们想回到debug cmd.exe,我们必须给出命令| 0s。
注意:只有在打开(生成)父可执行文件时,此操作才有效“附加到进程”没有调试所有子进程的选项!