自修改代码看到一个 0xCC 字节但调试器不显示它?

Eri*_*ric 5 assembly gdb breakpoints x86-64 self-modifying

我正在尝试编写自我修改的 asm 代码。

在某些时候,我尝试以下操作:(NASM 编译器)

start_of_code:
; ... snip ...

cmp byte [rax], 0x66
jae above_label
  add byte[rax], 0x20
; ... snip ...

above_label:
inc rax
loop start_of_code
Run Code Online (Sandbox Code Playgroud)

gdb 在开始时显示以下值x/8xb $rax

0x12 0x12 0x11 0x20 0x18 0xfe 0x83 0x9b
Run Code Online (Sandbox Code Playgroud)

前两次迭代没问题,0x12按照我的预期进行比较,没有发生跳转。随着0x11然而,cmp设置OF代替标志CFjae执行

目前我有 2 个猜测,要么 gdb 没有首先报告正确的内存位置,0x9b 实际上是被比较的地址,或者其他地方。这似乎不太可能,因为添加似乎像我期望的那样工作。

或者这可能是对齐问题。在 cmp 之前添加 NOP 指令似乎会以某种方式影响结果。我真的不知道为什么

编辑:当我尝试

mov bl, byte [rax]
Run Code Online (Sandbox Code Playgroud)

bl 得到 0xcc

这对我来说没有意义。gdb 不报告任何0xcc附近的任何值[rax]

Jes*_*ter 6

0xccint3软件断点中断的机器代码。gdb将其置于断点处的代码中,以便它重新获得控制权。它不适用于读取自身的代码。请改用该hbreak命令来设置不需要修改代码的硬件断点。