gpt4 book ai didi

c++ - 写跳转到内存

转载 作者:行者123 更新时间:2023-11-30 03:36:10 25 4
gpt4 key购买 nike

我正在尝试编写一个跳转至内存,但我似乎找不到任何地方可以解释它是如何工作的。

typedef UINT(WINAPI* tResetWriteWatch)(LPVOID lpBaseAddress, SIZE_T dwRegionSize);

UINT WINAPI ResetWriteWatchHook(LPVOID lpBaseAddress, SIZE_T dwRegionSize){
printf("Function called\n");
return 0;
}

void main(){
DWORD64 hookAddr = (DWORD64)&ResetWriteWatch;
WriteJump(hookAddr, ResetWriteWatchHook/*Let's say it's 0x7FE12345678*/);//Writes E9 XX XX XX XX to memory
}

我的主要问题是我不明白:如何将 asm JMP 0x7FE12345678 转换为 E9 XX XX XX XX,以便我可以将其写入 hookAddr。

进程是 64 位的。

最佳答案

这是在 32 位程序上常用的方法(不确定在 64 位程序上有多少不同),但这应该让您知道去哪里。由于 VirtualProtect,这特定于 Windows,但如果您在 Linux 上,则可以使用 mprotect

#include <stdio.h>
#include <windows.h>

void foo() {
printf("Foo!");
}

void my_foo() {
printf("My foo!");
}

int setJMP(void *from, void *to) {
DWORD protection;
if (!VirtualProtect(from, 5, PAGE_EXECUTE_READWRITE, &protection)) { // We must be able to write to it (don't necessarily need execute and read)
return 0;
}

*(char *)from = 0xE9; // jmp opcode
*(int *)(from + 1) = (int)(to - from - 5); // relative addr

return VirtualProtect(from, 5, protection, &protection); // Restore original protection
}

int main() {
setJMP(foo, my_foo);
foo(); // outputs "My foo!"

return 0;
}

关于c++ - 写跳转到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40814633/

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