MrNewbie
@MrNewbie
Мешаю водку с пивом

Как подменить данные о GPU с помощью MS Detours 3.0?

Хай пипл,
Пытаюсь подменить информацию о видеокарте, но столкнулся с проблемой. Данные о видеокарте (GPU) в большинстве случаев тянутся посредством Win32_VideoController. То бишь это выглядит как-то так:
IWbemServices* services = NULL;
...
IEnumWbemClassObject* instanceEnum = NULL;
services->CreateInstanceEnum(
                            _bstr_t("Win32_VideoController"),
                            WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
                            NULL, 
                            &instanceEnum);


Т.е. вначале создается объект класса IWbemServices (допустим *services), а далее вызывается метод services->CreateInstanceEnum("Win32_VideoController"..., &instanceEnum); и данные записываются в заранее созданный объект IEnumWbemClassObject (в данном случаем это instanceEnum).

Используя MS Detours 3.0 пробовал перехватить IEnumWbemClassObject::CreateInstanceEnum следующим образом:

Попытка получить указатель:
typedef HRESULT(WINAPI IWbemServices::*tm_CreateInstanceEnum) (const BSTR strClass, LONG lFlags, IWbemContext *pCtx, IEnumWbemClassObject **ppEnum);
tm_CreateInstanceEnum True_CreateInstanceEnum = &IWbemServices::CreateInstanceEnum;


Моя функция:
__declspec(dllexport) HRESULT WINAPI Hooked_CreateInstanceEnum(const BSTR strClass, LONG lFlags, IWbemContext *pCtx, IEnumWbemClassObject **ppEnum)
{
       MessageBox(0, L" Hooked!!!", L"Oh yeah, you did it !", MB_OK);
       //return True_CreateInstanceEnum(strClass, lFlags, pCtx, ppEnum); // я честно хз почему так, но это не верно
       return 0;
}


Inject:
BOOL APIENTRY DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
                DetourRestoreAfterWith();
                DetourTransactionBegin();
                DetourAttach((PVOID*)&True_CreateInstanceEnum, Hooked_CreateInstanceEnum);
                DetourTransactionCommit();
        }
        else if (dwReason == DLL_PROCESS_DETACH)
        {
                DetourTransactionBegin();
                DetourUpdateThread(GetCurrentThread());
                DetourDetach((PVOID*)&True_CreateInstanceEnum, Hooked_CreateInstanceEnum);
                DetourTransactionCommit();
        }
{


Все это прекрасно компилируется в DLL, но ничего не перехватывается. Хотя по идее это все должно было работать так, что при хуке CreateInstanceEnum у меня бы появлялся MessageBox. Но увы этого не происходит.
Как быть?
  • Вопрос задан
  • 297 просмотров
Пригласить эксперта
Ответы на вопрос 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Попробуйте еще https://github.com/TsudaKageyu/minhook
хотя вряд ли поможет
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы