gpt4 book ai didi

c++ - 蹦床后 Hook 坠毁

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:51 26 4
gpt4 key购买 nike

我正在尝试创建一种我玩的游戏的叠​​加层,以便实时显示我的 ping,因为存在很多问题,人们指责 ping,所以我只想要一个简单的解决方案并添加实时 ping 显示在游戏中:)

无论如何,hooks 一直是我一直苦苦挣扎的东西,我知道它是如何工作的,但它对我来说永远都行不通,这是我在无数地方见过的代码,但在经历了蹦床之后它崩溃:

void* detour::Hook(BYTE* src, BYTE* dst, int len) {
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;

VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);

memcpy(jmp, src, len);
jmp += len;

jmp[0] = 0xE9;
*(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5;

src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;

VirtualProtect(src, len, dwback, &dwback);

return (src + 6);
}

我可以看到它真的很乱,它使用 malloc 而不是 VirtualAlloc 等。但出于某种原因,它工作了一半:S 无论如何,这只是我为了尝试获得更好的理解而使用的东西钩子(Hook),与此同时我正在编写我自己的一些代码:

DWORD detour::SetHook(DWORD src, DWORD dst, int len) {
BYTE* backup;
DWORD oldProtection;
DWORD trampolineAddr;

VirtualProtectEx(GetModuleHandle(NULL), (void*) dst, 5, PAGE_READWRITE, &oldProtection);

//Create trampoline backup
trampolineAddr = (DWORD) VirtualAllocEx(GetModuleHandle(NULL), NULL, 10, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy((void*) trampolineAddr, (void*) dst, 5);
memcpy((void*)(trampolineAddr + 5), (void*) 0xE9, 1);
memcpy((void*)(trampolineAddr + 6), (void*) dst, 4);

//set API hook
memcpy((void*)dst, (void*) 0xE9, 1);
memcpy((void*)(dst + 1), (void*)src, 4);

VirtualProtectEx(GetModuleHandle(NULL), (void*) dst, 5, oldProtection, &oldProtection);

return trampolineAddr;
}

它的作用是返回创建蹦床的地址,我只是在调用了替换 Hook 函数的函数后跳转到该地址,虽然这些都不起作用:/

所以我的问题本质上是,为什么第一个钩子(Hook)只工作一半?我的钩子(Hook)有什么问题?它创建了到该地址的跳转,备份被覆盖的字节并将它们保存在蹦床中,我在自定义函数之后跳转到该蹦床,但没有一个起作用:(

非常感谢一些建设性的反馈,因为这是我很长一段时间以来一直想掌握的东西:)提前致谢!

最佳答案

这段代码有很多问题:

DWORD detour::SetHook(DWORD src, DWORD dst, int len) {

DWORD 不是类型。您需要查找它,但如果它是实数类型(int、float double 是基础),通常它会变成蓝色。

BYTE* backup;

也不是真正的类型。如果它非常大,请使用 int 或最好使用 double。

memcpy((void*) trampolineAddr, (void*) dst, 5);
memcpy((void*)(trampolineAddr + 5), (void*) 0xE9, 1);
memcpy((void*)(trampolineAddr + 6), (void*) dst, 4);

//set API hook
memcpy((void*)dst, (void*) 0xE9, 1);
memcpy((void*)(dst + 1), (void*)src, 4);

这可能是您的问题所在,void * 是不好的做法,在您的代码中使用是非常糟糕的。祝你好运。

艾哈迈德

关于c++ - 蹦床后 Hook 坠毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26723601/

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