首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果映像位于只读内存中,调试器如何设置断点?

如果映像位于只读内存中,调试器如何设置断点?
EN

Stack Overflow用户
提问于 2013-04-15 02:43:26
回答 3查看 1K关注 0票数 4

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

解释:

下面是调试器中的一个例程,它将自身与自身的副本进行比较。EDX指向正在运行的图像,EBX指向图像的已知良好副本。如果存在不匹配,则仅到达4010CE上的断点。被比较的字符在AL寄存器中。如您所见,调试器显示10CE的EB F6,但这是假的。10CE实际上包含CC,您可以通过查看AL寄存器看到这一点。这是因为调试器已经秘密地插入了CC来执行断点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-07 18:28:24

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

票数 3
EN

Stack Overflow用户

发布于 2013-05-22 06:01:06

让我先声明一下,我不熟悉您的特定工具集。

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

这里首先得到的两个答案解释了可能会让你来到这里的两个场景(至少,我能想到的唯一两个):

  • 内核总是在任何地方都有写访问权限,除了硬件保护的页面(即在某种只读存储器上),而你的进程内存几乎肯定不是这样的。它能够写入断点指令,而不考虑向正在调试的用户进程公开的权限。
  • 在插入断点之前,调试器必须使用某些syscall来更改目标进程内存上的访问权限。

就我个人而言,我猜第一件事正在发生。段权限的存在只是为了保护目标进程不受自身的影响,而不是为了防止调试器进程或内核的影响。操作系统中的调试机制经常违反“正常”权限,允许调试器对目标进程执行它想做的任何事情。当然,这就是为什么有些操作系统要求您输入密码,然后才允许您在某些场景中使用调试器。

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

票数 3
EN

Stack Overflow用户

发布于 2013-04-17 03:28:51

调试器利用WriteProcessMemory()函数来就地更改指令。它会保存一份指令的副本。当bp命中时,它将重置旧字节值,并将EIP设置回前一条指令,以便可以执行真正的指令。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16002899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档