Assembly 自修改代码看到一个0xCC字节,但调试器没有';你没有表现出来吗?
我正在尝试编写自我修改的asm代码 在某个时候,我尝试以下方法:(NASM编译器) gdb在开始时显示以下值Assembly 自修改代码看到一个0xCC字节,但调试器没有';你没有表现出来吗?,assembly,gdb,x86-64,breakpoints,self-modifying,Assembly,Gdb,X86 64,Breakpoints,Self Modifying,我正在尝试编写自我修改的asm代码 在某个时候,我尝试以下方法:(NASM编译器) gdb在开始时显示以下值x/8xb$rax: 0x12 0x12 0x11 0x20 0x18 0xfe 0x83 0x9b 前两次迭代是正常的,0x12按照我的预期进行比较,没有发生跳转。但是,使用0x11时,cmp设置OF标志,而不是CF,并且执行jae 目前我有两种猜测,要么gdb没有首先报告正确的内存位置,要么0x9b实际上是正在比较的地址,要么是其他地方。这似乎不太可能,因为add似乎像我预期的那样工
x/8xb$rax
:
0x12 0x12 0x11 0x20 0x18 0xfe 0x83 0x9b
前两次迭代是正常的,0x12
按照我的预期进行比较,没有发生跳转。但是,使用0x11
时,cmp
设置OF
标志,而不是CF
,并且执行jae
目前我有两种猜测,要么gdb没有首先报告正确的内存位置,要么0x9b实际上是正在比较的地址,要么是其他地方。这似乎不太可能,因为add似乎像我预期的那样工作
或者这可能是一个对齐问题。在cmp之前添加NOP指令似乎确实在某种程度上影响了结果。我真的不知道为什么
编辑:
当我尝试
mov bl, byte [rax]
bl
获取0xcc
这对我来说毫无意义。gdb在
[rax]
0xcc
附近不报告任何0xcc
值,0xcc是作为软件断点中断的int3
的机器代码gdb
在断点处将其放入代码中,这样它就可以重新获得控制权。它不能很好地处理读取自身的代码。改用hbreak
命令设置一个不需要修改代码的硬件断点。WOW。我要花很长时间才能弄明白。谢谢!
mov bl, byte [rax]