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

Windows 使用dword值作为ASM jmp的操作数,windows,wdk,endianness,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 = (

我正在使用一些运行时函数修补程序,但在编写内存地址值时,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,但有没有一种方法可以让我自动处理它,而不必编写一个函数来反转输入的字节顺序?

这与little endian无关。您的代码假定操作数存储在与其运行的体系结构相同的endianess中。只要代码在x86上运行就可以了

真正的问题是jmp使用的是相对偏移量,而不是绝对偏移量。 要计算jmp目的地,请执行以下操作:

dest = address_of_jmp + operand + sizeof(jmp_instruction)
假设
BYTE*jump
指向将要执行的实际指令,它应该是:

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