MOVZX x86编码
MOVZX x86 encoding
查看一些反汇编,我看到以下行:
0f b7 8c 00 c4 99 86 movzx ecx,WORD PTR [eax+eax*1-0x3e79663c]
反汇编程序如何从该编码中获取值“0x3e79663c”?它似乎与指令地址无关。
查看原始字节,如果我们从 0 中减去 0x8699c4,我们得到 0xff79663c。该数字的最后 3 个字节是反汇编程序所拥有的,但我仍然看不到最高有效字节 (0x3e) 来自哪里。
更新
事实证明 objdump 以一种奇怪的方式打印出来。由于某种原因,它将丢失的字节打印为下一个操作码。
35: 83 c7 01 add edi,0x1
38: 0f b7 8c 00 c4 99 86 movzx ecx,WORD PTR [eax+eax*1-0x3e79663c]
3f: c1
40: 8d 81 30 96 86 c1 lea eax,[ecx-0x3e7969d0]
感谢 Jester 解决了这个问题。
指令末尾缺少一个字节。
它应该是0f b7 8c 00 c4 99 86 c1
,偏移量是0xc18699c4
,即-0x3e79663c
。
查看一些反汇编,我看到以下行:
0f b7 8c 00 c4 99 86 movzx ecx,WORD PTR [eax+eax*1-0x3e79663c]
反汇编程序如何从该编码中获取值“0x3e79663c”?它似乎与指令地址无关。
查看原始字节,如果我们从 0 中减去 0x8699c4,我们得到 0xff79663c。该数字的最后 3 个字节是反汇编程序所拥有的,但我仍然看不到最高有效字节 (0x3e) 来自哪里。
更新
事实证明 objdump 以一种奇怪的方式打印出来。由于某种原因,它将丢失的字节打印为下一个操作码。
35: 83 c7 01 add edi,0x1
38: 0f b7 8c 00 c4 99 86 movzx ecx,WORD PTR [eax+eax*1-0x3e79663c]
3f: c1
40: 8d 81 30 96 86 c1 lea eax,[ecx-0x3e7969d0]
感谢 Jester 解决了这个问题。
指令末尾缺少一个字节。
它应该是0f b7 8c 00 c4 99 86 c1
,偏移量是0xc18699c4
,即-0x3e79663c
。