Перехват и обход метода 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;

Есть идеи, почему это произошло и как это решить?

0 ответов

Другие вопросы по тегам