蹦床后钩子撞坏了

时间:2014-11-03 21:31:27

标签: c++ hook reverse-engineering

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

无论如何,钩子一直都是我一直在玩的东西,我知道它是如何工作的,但它对我来说永远不会有效,这是我在无数地方看到的代码但经过蹦床之后它崩溃:

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等。但由于某种原因,它的工作方式有一半:不管怎样,这只是我用来试图获得更好理解的东西钩子,在此期间我正在研究我自己的一些代码:

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;
}

这样做是因为它返回了创建trampoline的地址,我只是在替换了被挂钩函数的函数被调用之后跳转到该地址,所有这一切都没有用:/ < / p>

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

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

1 个答案:

答案 0 :(得分:-2)

此代码存在许多问题:

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 *是不好的做法,在你的代码中非常糟糕。祝你好运。

艾哈迈德