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

问题描述 投票:4回答:1

我正在尝试编写自我修改的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

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

0x12 0x12 0x11 0x20 0x18 0xfe 0x83 0x9b

前两个迭代是可以的,按照我的预期比较了0x12,并且没有发生跳转。但是,对于0x11cmp设置OF标志而不是CF,并执行jae

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

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

编辑:当我尝试

mov bl, byte [rax]

[bl获得0xcc

这对我来说没有意义。 gdb在0xcc

附近的任何地方都不会报告[rax]的任何值
assembly gdb x86-64 breakpoints self-modifying
1个回答
5
投票

0xccint3的机器代码,它是软件断点中断。 gdb将此代码置于断点处,以便重新获得控制权。它不能与自己读取的代码配合使用。改为使用hbreak命令来设置不需要修改代码的硬件断点。

© www.soinside.com 2019 - 2024. All rights reserved.