【发布时间】: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