Windows 使用dword值作为ASM jmp的操作数
我正在使用一些运行时函数修补程序,但在编写内存地址值时,endiannes有一个问题。所以我有: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 = (
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;