2022-06-30极速赛车平台 曾经被程序员所忽视

极速赛车平台 曾经被程序员所忽视,但随着时间的推移,它已经发展成为一个非常强大和有用的代码挖掘工具。不要忘记它是由 Windows 开发团队使用的。为此,您可以通过可插入的 DLL 进行扩展。

从 Windows XP 开始,调试引擎直接包含在操作系统中。它由两个 DLL 组成:dbgeng.dll 和 dbghelp.dll。除了直接调试工具,包括极速赛车平台,Dr. Watson也使用调试引擎(drwtsn32.exe)。

有关该主题的更多信息:保护应用程序免于调试

Windows下调试

Windows 调试工具由四个使用 dbgeng.dll 的应用程序组成:

  • cdb 和 ntsd 是带有控制台界面的用户模式调试器。它们只有一件事不同:从现有的控制台窗口运行时,ntsd 会打开一个新的控制台窗口,而 cdb 则不会;
  • kd 是一个带有控制台界面的内核模式调试器;
  • 极速赛车平台 可以用作用户模式调试器或内核模式调试器,但不能同时用作两者。该实用程序提供了一个图形界面。

因此,极速赛车平台 本身只是一个用于与引擎进行调试的包装器。

第二个是帮助文件 dbghelp.dll,外部工具使用它来探索 Windows 内部。我们所说的外部工具是指,例如,OllyDbg,来自 Mark Russinovich 的 Sysinternals 的 Process Explorer。

极速赛车平台 有两个版本:classic 和 UWP。第一个安装了 Debugging Tools for Windows 集。该套件包含两个版本的 极速赛车平台,分别用于调试 32 位和 64 位应用程序。UWP 版本可以从 Windows 应用商店下载,并且只有 32 位。两个 32 位版本完全相同,只是 UWP 版本具有高级的 Tens 用户界面(顺便说一下,在大屏幕上工作时非常方便)。

对于我们的实验,我将使用后者。它们的使用几乎没有区别,只是用户界面中的命令可能略有不同(即界面元素上的铭文,而不是内置语言的命令 - 它们的逻辑负载不会改变)。

使用 极速赛车平台 进行调试

使用 极速赛车平台,我们将通过经典应用程序中的 Launch 可执行文件或 Open Executable 菜单项加载我们正在突破的 passCompare1.exe 文件。将来,我不会给出类似的命令 - 你会自己弄清楚。

打开可执行文件后,极速赛车平台 会立即加载应用程序,反汇编的命令会出现在调试器的 Disassembly 窗口中,它们的执行结果会显示在 Command 窗口中。

创建应用程序窗口后,在输出任何数据之前,执行被 int 3 指令中断——这是一个软件断点。许多初学者认为程序执行从 main 或 WinMain 函数开始。他们在学校被教过,或者他们自己从 C 的教科书中获取这些信息。当然,这不是真的。在进入特定应用程序的主要功能之前,处理器会深入到图像加载器的系统代码丛林中,执行大量指令以在 Windows 中初始化应用程序,连接各种库等等。因此,这样的中断并不意味着进入我们程序的main。如果我们查看反汇编窗口,我们可以看到中断发生在 ntdll 模块的 LdrpDoDebuggerBreak 系统函数中。

首先,让我们加载操作系统组件的调试信息。为此,请在命令行上输入

此命令指定参数中指定的文件夹,如果需要,调试器将在其中加载 Windows 子系统的调试符号。之后,您需要发送命令来下载或更新文件:

之后,极速赛车平台 将从 Microsoft 服务器下载必要的数据。

此外,您可以使用已经可用的调试信息,为此有一个命令 .sympath + <directory path>。如果调试符号文件与可执行文件位于同一文件夹中,它将被自动拾取。您也可以获取源代码文件,但在这种情况下,使用开发环境中包含的调试器会更容易。

因此,如果您在 passCompare1 的调试版本上设置调试器,并且当到达第一个断点时,在 main 函数上放置一个中断,编写

在 g 命令上,我们将继续执行,当调试器到达设置的断点(主函数的开头)时,我们会在反汇编窗口中看到列表被分成多个段,其中的头部有函数名称(尤其是主要的)。这不会在发布版本中。如果我们在模块开头的地址 + 入口点的地址设置断点,那么我们将不会到达 main 函数的开头,而是到系统加载器 - 编译器准备的 mainCRTStartup 函数。

除了微软,很少有人提供调试符号,所以我们不要习惯这种简单的生活。此外,极速赛车平台 专门用于在没有调试信息和源代码的情况下调试程序 - 我们将其用于预期目的。同时,如果你仔细观察反汇编窗口,你会发现,与我们在上一篇文章中使用的dumpbin反汇编不同,极速赛车平台可以识别系统函数的名称,这大大简化了分析。