自修改代码看到 0xCC 字节但调试器不显示它?
Self-modifying code sees a 0xCC byte but the debugger doesn't show it?
我正在尝试编写自修改 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
如我所料进行了比较,没有发生跳转。然而,对于 0x11
,cmp
设置 OF
标志而不是 CF
并且 jae
被执行
我目前有 2 个猜测,要么 gdb 没有首先报告正确的内存位置,0x9b 实际上是正在比较的地址,要么是其他地方。这似乎不太可能,因为添加似乎像我预期的那样工作。
或者这可能是对齐问题。在 cmp 之前添加 NOP 指令似乎会以某种方式影响结果。我真的不知道为什么
编辑:
当我尝试
mov bl, byte [rax]
bl
得到 0xcc
这对我来说没有意义。 gdb 不会在 [rax]
附近的任何地方报告 0xcc
的任何值
0xcc
是int3
的机器码,也就是软件断点中断。 gdb
将其放入代码的断点处,以便它重新获得控制权。它不能很好地处理自己读取的代码。请改用 hbreak
命令来设置不需要修改代码的硬件断点。
我正在尝试编写自修改 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
如我所料进行了比较,没有发生跳转。然而,对于 0x11
,cmp
设置 OF
标志而不是 CF
并且 jae
被执行
我目前有 2 个猜测,要么 gdb 没有首先报告正确的内存位置,0x9b 实际上是正在比较的地址,要么是其他地方。这似乎不太可能,因为添加似乎像我预期的那样工作。
或者这可能是对齐问题。在 cmp 之前添加 NOP 指令似乎会以某种方式影响结果。我真的不知道为什么
编辑: 当我尝试
mov bl, byte [rax]
bl
得到 0xcc
这对我来说没有意义。 gdb 不会在 [rax]
0xcc
的任何值
0xcc
是int3
的机器码,也就是软件断点中断。 gdb
将其放入代码的断点处,以便它重新获得控制权。它不能很好地处理自己读取的代码。请改用 hbreak
命令来设置不需要修改代码的硬件断点。