Я хочу подключить функцию-член класса (используя dll-инъекцию).на данный момент, перехват - это успех.но в функции перехвата я закодировал вызов этой исходной функции с помощью return.в результате оригинальная функция возвращает значение мусора.что не так с моей работой?
target.cpp
#include <iostream>
#include <windows.h>
class Target
{
private:
int _member;
public:
Target()
: _member(0)
{
}
Target(int i)
: _member(i)
{
}
virtual ~Target()
{
}
int getValue() // I want to hooking this function.
{
return _member;
}
};
int main(int argc, char **argv)
{
while(1){
Sleep(10000);
Target objA, objB(7);
std::cout << objA.getValue() << " " << objB.getValue() << std::endl;
}
return 0;
}
jection.dll
#include <windows.h>
#include <detours.h>
#include <iostream>
#include <sstream>
#pragma comment(lib, "detours.lib")
static const int ADDRESS = 0x2180;
int (__thiscall * original_func)(void *);
int hookedFunction(void *obj)
{
uintptr_t base = (uintptr_t)GetModuleHandle(0);
std::cout << obj << " Hooked Obj Address.\n";
int result = original_func(obj);
std::cout << "original function returns " << result << '\n';
return result;
}
DWORD WINAPI Attach(LPVOID param)
{
uintptr_t base = (uintptr_t)GetModuleHandle(0);
original_func = (decltype(original_func)) (base + ADDRESS);
OutputDebugString(TEXT("Attach approach!"));
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)original_func, hookedFunction);
LONG lError = DetourTransactionCommit();
if (lError != NO_ERROR) {
OutputDebugString(TEXT("Attach fail!"));
} else {
OutputDebugString(TEXT("Attach Sucess!!"));
}
return 0;
}
DWORD WINAPI Detach(LPVOID param)
{
OutputDebugString(TEXT("Detach approach!"));
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)original_func, hookedFunction);
LONG lError = DetourTransactionCommit();
if (lError != NO_ERROR) {
OutputDebugString(TEXT("Detach fail!"));
} else {
OutputDebugString(TEXT("Detach Sucess!!"));
}
return 0;
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
{
CreateThread(0, 0, Attach, hModule, 0, 0);
break;
}
case DLL_PROCESS_DETACH:
{
CreateThread(0, 0, Detach, hModule, 0, 0);
break;
}
}
return TRUE;
}
консольный вывод программы target.cpp.
0 7
0 7
0 7
0 7
0 7
0 7
0 7 <-- (DLL injection!)
000D1069 Hooked Obj Address.
original function returns 843966720 <-- why not 0 or 7?
000D8B30 Hooked Obj Address.
original function returns 890668
890668 843966720
000D1069 Hooked Obj Address.
original function returns 843966720
000D8B30 Hooked Obj Address.
original function returns 890668
как вы видите в выводе на консоль, оригинальная функция возвращает значение мусора.почему оригинальная функция возвращает значение мусора?