我正在玩一些运行时函数补丁,但在编写内存地址值时我遇到了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,但有一种方法可以自动处理,而不必编写一个基本上反转输入字节顺序的函数吗?
答案 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;