使用dword值作为ASM jmp的操作数

时间:2011-09-17 21:12:26

标签: windows wdk endianness

我正在玩一些运行时函数补丁,但在编写内存地址值时我遇到了endiannes的问题。所以我有:

 char buf[] = \xE9\xDE\xAD\xBE\xEF

在运行时我必须修复0xDEADBEEF以指向实际地址 - 这是我执行此操作的函数:

void FixJMPAddress(BYTE *jump, BYTE *newRoutine) {

  DWORD address;
  DWORD *dwPtr;

  address = (DWORD)newRoutine;
  dwPtr = (DWORD *)&(jump[1]);
  *dwPtr = address;

}

它被调用:

  FixJMPAddress(buf, &Something);

不幸的是,在我最终结果的反汇编时,我得到了:

   E9 60 DA 47 93 

而不是

   E9 93 47 DA 60

所以这是因为x86是little-endian,但有一种方法可以自动处理,而不必编写一个基本上反转输入字节顺序的函数吗?

1 个答案:

答案 0 :(得分:0)

这与little-endian无关。您的代码假定操作数存储在与其运行的体系结构相同的字节序中。只要你的代码在x86上运行,这应该没问题。

真正的问题是jmp使用 relative 偏移,而不是绝对偏移。 要计算jmp目的地:

dest = address_of_jmp + operand + sizeof(jmp_instruction)

假设BYTE* jump指向将要执行的实际指令,它应该是:

LONG delta = address - (DWORD)jump - 5;
*(LONG*)(jump+1) = delta;