gpt4 book ai didi

c++ - 计算 trampoline hook 的 JMP 指令地址

转载 作者:行者123 更新时间:2023-12-04 03:22:32 25 4
gpt4 key购买 nike

我正在尝试计算从一条指令到另一条指令的相对地址偏移量。

我了解基本计算,以及为什么我必须 -5(以适应 jmp 的大小和指令大小)(Calculating JMP instruction's address)

问题是,如果我不想跳到代码的开头而是跳到代码后面的一些特定指令怎么办?

例如:

original function

我想跳转到高亮指令OPENGL32.dll+48195,而我只有OPENGL32.wglSwapBu的起始地址。

从我的代码中,我明白我能做到

uintptr_t gatewayRelativeAddr = src - gateway - 5;

其中 src 是 OPENGL32.wglSwapBu 的地址,gateway 是我的代码的起始地址。

// len is 5

BYTE* gateway = (BYTE*)VirtualAlloc(NULL, len+5, MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
memcpy_s(gateway, len, src, len);

// Jump back to original function, but at the highlighted instruction
uintptr_t gatewayRelativeAddr = src - gateway - 5;

// add the jmp opcode to end of gateway

*(gateway + len) = 0xE9;

*(uintptr_t*)(gateway + len + 1) = gatewayRelativeAddr;

到目前为止,我了解代码的作用:计算从gateway 的起始地址到src(原始函数)的起始地址的相对地址/字节。我也-5 来迎合跳跃的大小。

然而,当我在内存中查看它时,它最终出现在我想要的位置。但是我在代码的任何地方都没有指定它跳转到突出显示的指令。

最佳答案

这是有效的,因为 len 恰好等于所需指令之前的指令 (5) 的字节数,我认为这就是重点(你想复制将被跳过的指令,也许以后再修改它们?)。

跳转指令从gateway+len开始,因此跳转处的EIP将为gateway+len+5。另一方面,你要跳转到的地址是src+len。所以相对地址是(src+len)-(gateway+len+5)len抵消了,所以你的公式是正确的。

如果你想跳转到一个不是你复制的指令之后的下一个指令,你需要通过反汇编计算出它与 src 的偏移量(称之为 ofs),然后将gatewayRelativeAddr设置为(src+ofs)-(gateway+len+5)

关于c++ - 计算 trampoline hook 的 JMP 指令地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68219389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com