【问题标题】:Detours - jmp 00000000绕道 - jmp 00000000
【发布时间】:2015-03-20 00:09:53
【问题描述】:

这是我正在使用的代码:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <detours.h>
#include <fstream>

#define real_sendto 0x152942C6
void(__cdecl* originalFunction)();

void tompa_sendto() {
    printf("Hellooo");
    return originalFunction();
}

void hook() {
    originalFunction = (void(__cdecl*)())DetourFunction((PBYTE)real_sendto, (PBYTE)tompa_sendto);
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call) {
        case DLL_PROCESS_ATTACH: hook(); break;
        case DLL_PROCESS_DETACH: return FALSE; break;
    }
    return TRUE;
}

这段代码没有问题,它把钩子放在0x152942C6,我可以看到它正在跳转到我的tompa_sendto()并再次返回。

当我将此代码用作挂钩时,它没有正确设置挂钩,
在我可以在 0x152942C6 看到的内存中:jmp 00000000

void tompa_sendto() {
    char buffer[] = {'x', 'y', 'z'};
    return originalFunction();
}

无论我在 tompa_sendto() 中放置什么代码都会使程序崩溃(因为 jmp 错误),我设法放置的仅有 2 个代码是 printf 和 messageBoxA。

【问题讨论】:

  • 可能是因为DetourFunction 失败并返回了NULL 指针?
  • 你确定originalFunction之前tompa_sendto被调用之前被正确初始化了吗?
  • @barakmanos 是一个全局变量,应该是零初始化的。
  • @JoachimPileborg:但这不是static 全球。你确定标准说这些默认初始化为 0 吗?
  • @barakmanos 未初始化的全局变量初始化为零。参见例如this old answer,其中包括来自标准的引用。

标签: c++ assembly reverse-engineering detours


【解决方案1】:

我能够重现这个问题(虽然只有 detours 1.5),所以我做了一些挖掘。看来问题只是你的 detour 函数是空的。

当您通过从另一个调用返回来结束调用时,编译器会进行特定的优化:它不调用函数,而是直接延迟控制,通过跳转而不是调用。这不会推送返回地址,因此,当下一个函数返回时,它会使用前一个函数的返回地址,并同时从两者返回。长话短说,函数以jmp func 结尾,而不是call func; ret

现在,当你的函数为空时,这个跳转是函数中唯一的指令。另一个事实是您通过变量调用原始函数,这转化为间接跳转。问题是,Detours 1.5 专门检查您的函数是否以间接跳转开始,如果是,它会根据找到的间接跳转将目标函数与直接跳转挂钩。为什么 ?因为很多函数,比如 DLL 调用,都是通过间接跳转表调用的,如果找到的话,Detours 会尝试使用快捷方式。

在您的情况下,目标函数与跳转到originalFunction 挂钩,但是当您安装挂钩时此变量为0,因此jmp 0。尝试在钩子之前将originalFunction设置为3,你会看到。如果你的函数不为空,这个问题就不会发生,所以不用担心。在返回之前一个简单的__nop(); 将使它工作,即使它是空的。

【讨论】:

  • 是的!你说得对。我向函数添加了一些参数并将函数留空(只是调用),但这次它起作用了。我没有尝试 __nop,但我相信它也会起作用!
猜你喜欢
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 2016-11-27
  • 2023-04-04
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多