【发布时间】:2018-04-17 05:32:51
【问题描述】:
我在 x86 中做了一个汇编程序,这个程序有一个我不理解的行为。我想找出使用 _start 和 $_start 之间的区别。当 $_start 被视为立即数(即地址)时,_start 被视为要到达的地址。 但是,当我想用 gdb 检查 _start 的位置时:
x _start
我没有得到正确的号码,它位于 _start 的地址。如图所示,0xFFFFFFB8在内存中_start的地址,但0xFFFFFFFCC被移到了%ebx寄存器。当我复制地址 (_start - 4) 和 (_start + 4) 处的值时,这项工作非常完美。
你知道这可能来自哪里吗?
【问题讨论】:
-
恭喜,你已经编写了调试器检测代码:)
CC是int3的操作码,由gdb 插入用于软件断点。使用硬件断点,它就会工作。 -
图片完全不可读,使您的问题不清楚。请在您的问题中输入缩进文本
-
@Jester,说到我如何检测硬件断点?
-
@Trey 如果它们实现良好(硬件方面),调试器可能会以不可观察的方式监督您的代码。尽管通常至少实时/性能计数器时钟差异会泄漏一些可疑的事情正在“外部”发生。在某些平台上,您可能会尝试自己声明调试监督,其中只有一个调试器可能同时监督代码,因此如果您已经在调试,那将失败。如果允许两个调试器,则硬件断点设置可能仍是共享的,即在某些平台上从两个调试器都可见。
标签: assembly x86 gdb cpu-registers