96SEO 2026-02-19 18:43 20
。

我第一次接触是在三年前的一个内核驱动项目#xff0c;由于进行了IDT中键盘鼠标中断的Hook#xff0c;使用Softi…
Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明那么我会使用WinDbg来作为这一套调试工具的简称)。
我第一次接触是在三年前的一个内核驱动项目由于进行了IDT中键盘鼠标中断的Hook使用Softice调试时造成会造成影响只得使用WinDbg通过串口进行双机调试。
自此之后这个Windows平台下最为强大的调试工具一直是开发过程中的必备。
这里我毫不掩饰的说“最强”可能很多通过逆向工作而接触调试的朋友不会认同但是我相信随着对WinDbg了解的加深以及对这套工具在软件开发中应用的了解他们也会和我有一样的观点。
一直以来软件调试技术在软件开发者中都没有得到足够的普及和重视互联网上能找到的系统描述的资料也较少。
随着国内软件行业整体的发展和进步这些技术慢慢开始得到推广。
2008年出版的有关调试的数据比以往都要多。
我有幸拜读了Raymond的《软件调试》以及熊力的《Windows用户态程序高效排错》获益良多。
这几年的工作中也积累了一些关于Windows调试工具的知识希望能够将这些东西进行一些分享。
因此利用几个月空闲时间翻译了WinDbg文档中上半部调试器配置、使用和命令介绍的内容同时准备写一些关于WinDbg调试工具的初级文章。
希望能够为对调试技术感兴趣而又苦于没有资料的朋友提供一些帮助。
特别感谢我的前同事小喂。
虽然他第一条串口线还是我焊的但是他对于WinDbg的使用和了解程度很快就超过了我。
在相当长时间的共事和讨论中让我学到了很多。
3.1的工具发布的。
其后也一直跟随NT操作系统的发展而不断发展完善。
如果用一句话来概括可以说WinDbg是为了软件开发而存在的调试工具。
软件包中的调试器和小工具的各种功能都是为了配合软件的开发而设计的并且覆盖到了Windows平台下各种不同类型项目的调试(传统的SDK或MFC应用程序、.NET平台应用、COM应用、软硬件驱动程序等等)。
Windows调试工具包中的调试器包括WinDbg、KD、CDB和NTSD。
其中
KD用于内核调试CDB和NTSD用于用户态调试在功能和使用上几乎完全一致WinDbg是内核调试器和用户态调试器的综合体由于功能完善并且具有图形界面所以是最常用的工具。
它们能够在x86、Itanium和x64机器上的所有NT平台操作系统中运行。
KDbgCtrl用于控制和配置内核调试的一些参数。
例如是否只有当发生异常时才会启用内核调试、设置DbgPrint缓冲区大小、如何处理用户模式异常等等。
ADPlus这是一个VB脚本可以为一个或多个进程自动创建内存dump。
SymStore用于创建符号存储。
当需要创建自己的符号存储时就要用到它了。
SymProxy用于在网络中创建单独的HTTP符号服务器以供所有调试器使用。
该工具特别适合企业级应用的环境可以将多个符号存储通过单一的接入点提供使用。
6.10.3版本才加入到软件包中的工具可以查看当前连接到系统中的USB设备信息。
Verifier虽然没有包含在软件包中但是也是一个非常强大的工具。
可以对程序运行时的很多状态进行监控以发现一些普通调试难以找到的错误。
下面是Application
Verifier可以在这个页面下载http://go.microsoft.com/fwlink/?linkid108353
可能很多已经习惯使用SoftICE、OllyDbg、IDE调试器的朋友会提出这样的疑问在这么多调试器中为什么要选择WinDbg它究竟有什么特点
公司的软件针对企业级用户该客户在地球另一半的美国。
有一天客户抱怨了一个BUG但是从抓取的dump又没办法看出个所以然想进行动态调试查找原因。
公司预算有限不能让你过去出差顺便旅游、对方公司有防火墙不允许外部连接等等等等。
。
。
怎么办
项目规模很大涉及到的模块多版本也多并且是由不同部门开发的。
这些部门可能遍布五湖四海。
如何在调试其中某个模块时能够快速获得它的符号和源文件而不用每次都从一大堆不同版本的文件中辛苦找寻调试到某个阶段突然发现这不是自己的模块出现问题如何快速知道这个问题应该找谁解决项目某些重要模块有保密需要如何控制调试人员访问符号和源文件的权限
驱动程序怎么才能源码调试SoftICE不支持新系统我要在Vista上调试怎么办
软件中包含一个Windows服务组件但是每次还没有登陆到桌面之前就崩溃了怎么进行动态调试
我想调试Explorer调试IE调试CSRSS调试……但是调试器一附加上去系统就会出问题。
怎么办
公司发布的软件有用户反馈和XXX安全软件冲突老是造成系统崩溃但是搭建环境之后却又没有办法重现对方是个普通用户鼠标都抓得不太稳。
用户很火大闹着要抓个老虎到公司来找你上司做俯卧撑后果很严重怎么办
在现实环境中有很多复杂的调试场景我们需要专业级的调试器来解决这些问题。
而WinDbg恰恰提供了这种商业软件环境下的专业级软件调试功能它和其他很多我们熟知的调试器的区别也在于此。
我们将WinDbg和其他调试器分作内核调试器和用户态调试器两类来进行比较。
x86由于已停止更新新版本操作系统中支持不佳老系统中也常常遇到兼容性问题
通过和远程工具、转发器的配合实现各种灵活的远程调试方式以支持不同的网络环境
2.0接口的双机调试通过Pipe连接的虚拟机调试或者功能有诸多限制的本地内核调试
由于是双机调试调试器只是主控机上运行的一个普通软件。
拥有GUI界面可以同时进行其他应用。
由于SoftICE已经停止更新WinDbg可以说是现在Windows平台上唯一好用的进行内核调试的工具并且随着新版本的不断推出不断地添加对新版操作系统的支持以及完善功能。
强大的符号支持方便的源码调试使得内核级调试能够事半功倍。
新版本的VisualStudio不支持在9x系统下安装。
VC6之前可以在9x下调试
通过和远程工具、转发器的配合实现各种灵活的远程调试方式以支持不同的网络环境
由于WinDbg功能相当复杂有很多方面并不能一一比较例如非侵入式调试、通过WinDbg控制CDB和NTSD来调试系统服务、创建和分析Dump文件等等。
总体来说WinDbg更适合作为软件项目开发和维护过程中的调试工具使用而OllyDbg更适合逆向工程。
根据我个人对WinDbg的使用经验来说它更适合作为开发维护的辅助工具来使用。
如果要进行用户态的逆向工程推荐使用OllyDbg、IDA这些拥有强大汇编程序分析能力的工具。
使用WinDbg开始调试工作之前最重要的就是配置好各种环境了。
这使得调试器可以正确识别调试目标中的各种变量、函数等等使得我们能够进行符号化调试或者源码调试而不是只能在一堆汇编代码中转圈。
首先来看一下未设置环境之前的样子。
使用刚才说的TestDebug1项目为了对比更清晰用Release进行编译链接选项中选中生成map文件和调试信息如下
编译之后将Release下(如果没有这样做由于编译出来的程序中包含了符号文件路径调试器可以直接使用exe中的信息找到pdb文件而不需要设置路径)。
在map文件中可以看到像下面这样的内容
Executeable菜单打开TestDebug1.exe可以在调试器命令窗口中看到下面的内容
可以看到调试器自动中断下来的位置并不是程序入口点这是由WinDbg实现造成的这里先不管它。
调试器命令窗口中可以看到我们还没有设置符号路径所以WinDbg目前还找不到TestDebug1.exe的任何符号文件。
如果想在main函数下断这时就不能使用符号而只能直接使用main的地址。
00401000在main函数设置断点然后F5执行就可以中断到main的入口处了。
断点设置和基本操作我们将在后面介绍。
可以在反汇编窗口中看到这样的内容
由于没有加载任何符号所以我们看到的都是一堆反汇编代码和地址。
在上一篇中已经介绍过WinDbg不像OllyDbg这些调试器一样拥有强大的反汇编分析能力所以仅仅靠这些看起来一团乱麻的反汇编代码调试工作是很难开展下去的。
要想在WinDbg中看到程序中的符号必须通过命令或者WinDbg菜单设置符号路径。
如果还设置了Microsoft公共符号存储的话我们不但能够看到自己程序中的符号还能够看到Windows平台代码中的符号这对于调试会提供很好的帮助。
所谓符号路径就是包含了程序符号信息的符号文件所在的中找到它的符号文件TestDebug1.pdb。
Path…菜单或者命令.sympath设置符号路径为TestDebug1.pdb所在的可以修改成自己需要的路径。
再来打开符号路径窗口我们可以看到调试器自动添加了一些内容
自己在源码路径中加入这些新的内容也可以实现相同的效果。
详细的原理请参考WinDbg帮助文档关于符号服务器设置的部分内容。
接下来再次使用.reload命令重新加载符号第一次使用到的符号文件会从网上自动下载下来所以可能有时候会等待一会。
完成之后可以看到反汇编窗口中出现了新的符号内容
764e8cd8处指令中可以看到这是调用了kernel32导入的函数NtOpenProcess。
微软提供的Windows符号是我们研究Windows实现的必备利器。
首先符号化的名字有助于调试过程中的记忆和对各种信息的识别其次通过名字就常常可以猜测出来函数或变量的作用很大的方便调试。
在各种调试应用中都强烈建议添加微软公共符号的引用。
上面介绍的各种路径都可以通过环境变量来进行设置。
将一些常用的路径保存在环境变量中就可以避免每次在新的工作空间中进行调试时都要重新设置的麻烦。
另外Visual
2008也共享一些环境变量的设置这样在使用IDE调试的时候也能方便的查看到各种符号了。
常用的有下面几个
指定包含调试目标的源代码的路径。
Path可以包含后跟一个冒号(:)的驱动器符。
用分号分隔多个树的根(;)。
指定包含二进制可执行文件的路径。
Path可以包含后跟一个冒号(:)的驱动器符。
用分号分隔多个目录(;)。
指定调试器用来添加输出的日志文件。
新的内容每次会添加到这个文件末尾而不是覆盖整个文件。
2008调试MFC这样的有较多导入库的程序时会下载很多符号文件使得启动调试的速度变慢。
不过经过一段时间大部分需要的符号都缓存到本地之后速度就会快起来。
进行调试时有时候调试器命令窗口会变得很杂乱所以常常想用.cls命令清空它。
但是这样会无法再看到之前调试过程中输出的结果。
另外有时候想保存下整个调试过程的详细记录以备后面“回味”。
这时就需要用到日志文件了。
可以将调试器命令窗口中出现过的所有内容都自动记录到日志文件中。
启动调试器之前设置_NT_DEBUG_LOG_FILE_OPEN环境变量。
启动调试器之前设置_NT_DEBUG_LOG_FILE_APPEND环境变量。
工作空间(Workspace)是用来保存WinDbg中工作环境的工具。
例如习惯的窗口布局方式、符号路径、异常处理的设置等等都可以通过工作空间保存下来在下次调试的时候就不用再次设置了。
Workspace这里只能打开自己通过SaveAs保存的工作空间。
Workspace按默认的方式保存当前的工作空间。
下次再打开相同的调试目标时就会自动打开这个Workspace。
Workspace删除当前保存的工作空间。
这里可以查看到所有默认保存和另存为的工作空间用来进行清理是很方便的。
File将工作空间保存到文件或者从文件打开。
可以把自己的工作空间保存下来这样通过U盘之类的就能在多台机器之间方便的使用相同的设置了。
在没有调试目标的时候调整WinDbg的窗口布局等等设置的话会保存为默认的工作空间。
下一次打开新目标的时候就会使用这个设置。
通常我们可以设定一个默认的工作空间然后为各个单独的任务保存另外的设置。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback