4

如果图像在只读内存中,调试器如何设置断点?我知道有硬件断点,但在我使用的调试器 (OllyDbg) 中,必须使用与普通断点不同的对话框专门设置这些断点。

解释:

这是调试器中的一个例程,它将自身与自身的副本进行比较。EDX 指向正在运行的镜像,EBX 指向镜像的已知良好副本。只有在不匹配的情况下才会到达 4010CE 上的断点。被比较的字符在 AL 寄存器中。如您所见,调试器在 10CE 显示 EB F6,但这是错误的。正如您通过查看 AL 寄存器可以看到的那样,10CE 实际上有 CC。这是因为调试器已经偷偷插入了CC来执行断点。

在此处输入图像描述

4

3 回答 3

3

调试器首先必须更改它要写入的页面的内存保护。这可以通过 VirtualProtectEx 来完成。之后,它可以使用 WriteProcessMemory 进行写入,然后将保护设置回原始值。

于 2013-05-07T10:28:24.320 回答
3

让我以我不熟悉您的特定工具集的免责声明作为开头。

如果您尚未启用硬件断点,则唯一剩下的断点类型是软件断点。当您用陷阱指令替换指令的第一个字节时,这些只会被命中(在 x86 上,因为这是我最熟悉的),并且只有在正确的陷阱时才会通过操作系统的断点机制路由到调试器使用了您的操作系统的指令,并且调试器已经向操作系统注册了自己作为此过程的调试器。为了使软件断点在正确的时刻发生,必须在正确指令的第一个字节上将陷阱指令写入代码段。

首先得到的两个答案解释了可以让你来到这里的两种情况(至少,我能想到的只有两个):

  • 内核总是在任何地方都有写访问权限,除了受硬件保护的页面(即在某种 ROM 上),您的进程的内存几乎肯定没有。它具有编写断点指令的能力,而不管暴露给正在调试的用户进程的权限如何。

  • 在插入断点之前,调试器必须使用一些系统调用来更改目标进程内存的访问权限。

就个人而言,我猜第一件事正在发生。段权限仅用于保护您的目标进程不受其自身的影响,而不是来自调试器进程或内核的保护。操作系统中的调试机制经常违反“正常”权限,以允许调试器对目标进程执行任何它想做的事情。当然,这就是为什么某些操作系统在某些情况下允许您使用调试器之前要求您输入密码的原因。

但是,您可以通过在设置断点后尝试从目标进程内部写入代码段来测试它是否是第二个。如果写入成功,您就知道操作系统已经降低了权限(以允许调试进程)。对于操作系统来说,要求调试器跳过这个循环会很尴尬,因为它已经可以将任意代码插入内存的可写部分,然后通过生成堆栈帧溢出来强制跳转到它。

于 2013-05-21T22:01:05.753 回答
2

调试器利用 WriteProcessMemory() 函数来更改指令。它将保留一份说明。当 bp 被击中时,它将重置旧字节值并将 EIP 设置回上一条指令,以便真正的指令可以执行。

于 2013-04-16T19:28:50.770 回答