Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > [Help] Подмена данных GPU при помощи MS Detours 3 |
Автор: SuprSonic 15.11.2017, 19:36 | ||||||||
Привет всем, Пытаюсь подменить информацию о видеокарте, но столкнулся с проблемой. Данные о видеокарте (GPU) в большинстве случаев тянутся посредством Win32_VideoController. То бишь это выглядит примерно так:
Т.е. вначале создается объект класса IWbemServices (допустим *services), а далее вызывается метод services->CreateInstanceEnum("Win32_VideoController"..., &instanceEnum); и данные записываются в заранее созданный объект IEnumWbemClassObject (здесь это instanceEnum). Используя MS Detours 3.0 пробовал перехватить IEnumWbemClassObject::CreateInstanceEnum следующим образом: Попытка получить указатель:
Функция для подмены:
Inject:
Компилируется в DLL, но ничего не перехватывается. ![]() Где я напортачил? Знающие, помогите плз... |
Автор: _zorn_ 15.11.2017, 20:00 |
ХОЧУ МАЙНИТЬ БАБЛА, но помогите бесплатно. Как это знакомо даже не в разрезе "майнить"... |
Автор: SuprSonic 15.11.2017, 20:02 | ||
ЧЗНХ?! Без флуда пожалуйста. Если с головой бобо - то посетите врача |
Автор: SuprSonic 16.11.2017, 17:21 | ||||
Спасибо за ответ. Мне подсказали вешать хук на метод Get. В итоге появился такой код:
Я тестирую получившуюся DLL прикрепляя ее к dxdiag.exe с помощью withdll.exe. Но мне походу запуска dxdiag.exe выбрасывается вот такое - https://i.imgur.com/jwy8Ffr.png https://i.imgur.com/AoiMxZY.png https://i.imgur.com/M9FLgqL.png ![]() Я уже даже не знаю что делать. Хотя если в функции Hooked_Get прописать например MessageBox, то он появится, а это уже хорошо. Значит что-то в итоге перехватывается, но всеравно ошибка.. |
Автор: SuprSonic 16.11.2017, 18:08 | ||
А можно поподробнее?) |
Автор: xvr 17.11.2017, 10:48 |
Функция Get - это метод класса, так что у нее есть еще 1 параметр - this В двух словах это не объяснить, читайте в MSDN описание архитектуры https://msdn.microsoft.com/library/windows/desktop/aa384642(v=vs.85).aspx |
Автор: SuprSonic 17.11.2017, 12:58 | ||
Впихнул первый параметр под this и....
ничего, все равно не работет ![]() |
Автор: xvr 17.11.2017, 15:51 |
Для начала поставьте в хуке печать параметров (через MessageBox) и вызов оригинальной функции. Если заработает, будем резать дальше ![]() |
Автор: _zorn_ 17.11.2017, 18:40 | ||
Может стоит быть честным ? Не могу придумать задачу, где нужно подменять что нибудь, а тем более видеокарту... |
Автор: SuprSonic 17.11.2017, 20:52 | ||||
Пришел к такому решению, оно наполовину рабочее... в общем вот код:
И он мне выдает вот такой списочек в консоли: ![]() Но есть два непонятных для меня момент - 1). Без DisableThreadLibraryCalls(hinst) в DllMain(...) через какое-то время dxdiag.exe выбивает ошибку, хотя какие-то данные в консоли отобразились. 2). Потерпел фиаско при попытке изменить какие-либо значения, в dxdiag.exe они не поменялись. Предполагаю, что это как-то связано с DisableThreadLibraryCalls... но см.п.1 Пример кода того как пытался поменять значения у строковых переменных. Причем если после изменения вывести в консоль pVal, то оно будет изменено на "NO_DATA", а в dxdiag.exe изменениями и не пахнет.
![]() |
Автор: xvr 20.11.2017, 15:44 | ||||
Без этого каждый новый thread для вызова ApplyHooks будет вызывать эту точку входа вновь и вновь. В результате в системе кончится либо стек либо очередь на вызов DllMain
Скорее всего это связано с тем, что dxdiag извлекает данные не через этот метод. Там очень и очень много способов эти данные извлечь. Ну и ясности ради - возвращать BSTR так (V_BSTR(pVal) = L"NO_DATA";) нельзя - см SysAllocString |