Перехват и обход метода Get из fastprox.dll (C++)
Я пытаюсь перехватить метод Get, и теперь я получил этот код:
#include "stdafx.h"
#pragma comment (lib, "detours.lib")
typedef HRESULT (WINAPI * True_GetFn)(LPCWSTR wszName, LONG lFlags, VARIANT *pVal, CIMTYPE *pvtType, LONG *plFlavor);
True_GetFn p_Get = nullptr;
__declspec(dllexport) HRESULT WINAPI Hooked_Get(LPCWSTR wszName, LONG lFlags, VARIANT *pVal, CIMTYPE *pvtType, LONG *plFlavor)
{
if (wcsstr(wszName, L"VideoProcessor") != NULL || wcsstr(wszName, L"Name") != NULL || wcsstr(wszName, L"AdapterCompatibility") != NULL || wcsstr(wszName, L"SystemName") != NULL)
{
pVal->vt = VT_BSTR;
V_BSTR(pVal) = L"NO_DATA";
}
else if (wcsstr(wszName, L"AdapterRAM") != NULL)
{
pVal->vt = VT_UI4;
V_BSTR(pVal) = L"0";
}
return p_Get(wszName, lFlags, pVal, pvtType, plFlavor);
}
PVOID SetDetour(PVOID* ppTarget, PVOID pHandler)
{
if (DetourTransactionBegin() != NO_ERROR)
return FALSE;
if (DetourUpdateThread(GetCurrentThread()) != NO_ERROR)
{
DetourTransactionCommit();
return NULL;
}
PDETOUR_TRAMPOLINE pTrampoline = NULL;
if (DetourAttachEx(ppTarget, pHandler, &pTrampoline, NULL, NULL) != NO_ERROR)
{
DetourTransactionCommit();
return NULL;
}
if (DetourTransactionCommit() != NO_ERROR)
{
DetourTransactionAbort();
return NULL;
}
return pTrampoline;
}
BOOL APIENTRY DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
HMODULE hLib = LoadLibraryA("fastprox.dll");
if (hLib)
{
p_Get = (True_GetFn)GetProcAddress(hLib, "?Get@CWbemObject@@UAGJPBGJPAUtagVARIANT@@PAJ2@Z");
if (p_Get)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
SetDetour((PVOID*)&p_Get, Hooked_Get);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((PVOID*)&p_Get, Hooked_Get);
DetourTransactionCommit();
}
}
}
return TRUE;
}
Он компилируется нормально, но... возникает ошибка, когда я присоединяю скомпилированную DLL к файлу EXE с помощью WITHDLL.EXE (который входит в пакет MS Detours) и пытаюсь запустить программу.
Например, я запустил dxdiag.exea и получил следующие окна: Window # 1 и Window # 2;
Есть идеи, почему это произошло и как это решить?