如果映像位于只读内存中,调试器如何设置断点?我知道有硬件断点,但在我使用的调试器(OllyDbg)中,必须使用与普通断点不同的对话框专门设置这些断点。
解释:
下面是调试器中的一个例程,它将自身与自身的副本进行比较。EDX指向正在运行的图像,EBX指向图像的已知良好副本。如果存在不匹配,则仅到达4010CE上的断点。被比较的字符在AL寄存器中。如您所见,调试器显示10CE的EB F6,但这是假的。10CE实际上包含CC,您可以通过查看AL寄存器看到这一点。这是因为调试器已经秘密地插入了CC来执行断点。

发布于 2013-05-07 18:28:24
调试器首先必须更改它要写入的页的内存保护。这可以使用VirtualProtectEx来完成。之后,它可以使用WriteProcessMemory进行写入,然后将保护设置回原始值。
发布于 2013-05-22 06:01:06
让我先声明一下,我不熟悉您的特定工具集。
如果您尚未启用硬件断点,则唯一剩余的断点类型是软件断点。只有当您用陷阱指令替换指令的第一个字节时,它们才会被命中(在x86上,因为这是我最熟悉的),并且只有当您的操作系统使用正确的陷阱指令,并且调试器已经将自己注册为此进程的调试器时,它们才会通过操作系统的断点机制被路由到调试器。为了使软件断点在正确的时刻发生,必须在正确指令的第一个字节上将陷阱指令写入代码段。
这里首先得到的两个答案解释了可能会让你来到这里的两个场景(至少,我能想到的唯一两个):
就我个人而言,我猜第一件事正在发生。段权限的存在只是为了保护目标进程不受自身的影响,而不是为了防止调试器进程或内核的影响。操作系统中的调试机制经常违反“正常”权限,允许调试器对目标进程执行它想做的任何事情。当然,这就是为什么有些操作系统要求您输入密码,然后才允许您在某些场景中使用调试器。
但是,您可以在设置断点之后,通过尝试从目标进程内部写入代码段来测试它是否是第二个断点。如果写入成功,您知道操作系统已经降低了权限(以允许调试进程)。对于操作系统来说,需要调试器跳过这个环将是非常尴尬的,因为它已经可以将任意代码插入到内存的可写部分,然后通过生成堆栈帧溢出来强制跳转到它。
发布于 2013-04-17 03:28:51
调试器利用WriteProcessMemory()函数来就地更改指令。它会保存一份指令的副本。当bp命中时,它将重置旧字节值,并将EIP设置回前一条指令,以便可以执行真正的指令。
https://stackoverflow.com/questions/16002899
复制相似问题