- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一种我玩的游戏的叠加层,以便实时显示我的 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/
假设我正在尝试通过一个操作来实现一种非常简单的领域特定语言: printLine(line) 然后我想写一个接受整数 n 的程序作为输入,如果 n 打印一些东西可被 10k 整除,然后用 n + 1
我的目标是拦截来 self 没有源代码的定制应用程序的出站 TCP 数据包。我需要调整出站数据中的几个参数。这是一个较旧的应用程序,原来的公司不再销售并且开发人员不再可用。 所以我计划在 send()
我是一名优秀的程序员,十分优秀!