![]() |
|
![]() ![]() ![]() |
|
SuprSonic |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 7.8.2016 Репутация: нет Всего: нет |
Привет всем,
Пытаюсь подменить информацию о видеокарте, но столкнулся с проблемой. Данные о видеокарте (GPU) в большинстве случаев тянутся посредством Win32_VideoController. То бишь это выглядит примерно так:
Т.е. вначале создается объект класса IWbemServices (допустим *services), а далее вызывается метод services->CreateInstanceEnum("Win32_VideoController"..., &instanceEnum); и данные записываются в заранее созданный объект IEnumWbemClassObject (здесь это instanceEnum). Используя MS Detours 3.0 пробовал перехватить IEnumWbemClassObject::CreateInstanceEnum следующим образом: Попытка получить указатель:
Функция для подмены:
Inject:
Компилируется в DLL, но ничего не перехватывается. ![]() Где я напортачил? Знающие, помогите плз... |
||||||||
|
|||||||||
_zorn_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 21.8.2007 Репутация: нет Всего: 12 |
ХОЧУ МАЙНИТЬ БАБЛА, но помогите бесплатно.
Как это знакомо даже не в разрезе "майнить"... |
|||
|
||||
SuprSonic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 7.8.2016 Репутация: нет Всего: нет |
ЧЗНХ?! Без флуда пожалуйста. Если с головой бобо - то посетите врача Это сообщение отредактировал(а) SuprSonic - 16.11.2017, 00:07 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Это C++ member pointer, а DetourAttach ожидает обычный указатель на функцию. Это две совершенно разных сущности. Более того, IWbemServices::CreateInstanceEnum вообще не существует в виде какого либо указателя - это просто индекс в таблице виртуальных методов. Еще более того - на момент загрузки вашей dll реализации IWbemServices::CreateInstanceEnum в памяти еще нет - она грузится динамически COM подсистемой в момент вызова первого CoCreateInstance. Вам надо перехватывать CoCreateInstance и ждать, пока не попытаются создать IWbemLocator, а потом патчить таблицы виртуальных методов возвращаемых объектов по цепочке, пока не дойдете до вашего IWbemServices::CreateInstanceEnum Может проще будет вмешаться в WMI и подменить провайдер, который выдает Win32_VideoController? Добавлено через 3 минуты и 39 секунд А если учесть, что ваши Win32_VideoController вообще могут запросить через IWbemServices::ExecQuery ("Select * from Win32_VideoController"), то затея с перехватом вообще становится практически неосуществимой Это сообщение отредактировал(а) xvr - 16.11.2017, 10:38 |
|||
|
||||
SuprSonic |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 7.8.2016 Репутация: нет Всего: нет |
Спасибо за ответ. Мне подсказали вешать хук на метод Get. В итоге появился такой код:
Я тестирую получившуюся DLL прикрепляя ее к dxdiag.exe с помощью withdll.exe. Но мне походу запуска dxdiag.exe выбрасывается вот такое - Window #1 Window #2 Window #3 ![]() Я уже даже не знаю что делать. Хотя если в функции Hooked_Get прописать например MessageBox, то он появится, а это уже хорошо. Значит что-то в итоге перехватывается, но всеравно ошибка.. Это сообщение отредактировал(а) SuprSonic - 16.11.2017, 17:31 |
||||
|
|||||
SuprSonic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 7.8.2016 Репутация: нет Всего: нет |
А можно поподробнее?) |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Функция Get - это метод класса, так что у нее есть еще 1 параметр - this
В двух словах это не объяснить, читайте в MSDN описание архитектуры WMI |
|||
|
||||
SuprSonic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 7.8.2016 Репутация: нет Всего: нет |
Впихнул первый параметр под this и....
ничего, все равно не работет ![]() Это сообщение отредактировал(а) SuprSonic - 17.11.2017, 12:59 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Для начала поставьте в хуке печать параметров (через MessageBox) и вызов оригинальной функции. Если заработает, будем резать дальше
![]() |
|||
|
||||
_zorn_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 21.8.2007 Репутация: нет Всего: 12 |
||||
|
||||
SuprSonic |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 7.8.2016 Репутация: нет Всего: нет |
Пришел к такому решению, оно наполовину рабочее... в общем вот код:
И он мне выдает вот такой списочек в консоли: ![]() Но есть два непонятных для меня момент - 1). Без DisableThreadLibraryCalls(hinst) в DllMain(...) через какое-то время dxdiag.exe выбивает ошибку, хотя какие-то данные в консоли отобразились. 2). Потерпел фиаско при попытке изменить какие-либо значения, в dxdiag.exe они не поменялись. Предполагаю, что это как-то связано с DisableThreadLibraryCalls... но см.п.1 Пример кода того как пытался поменять значения у строковых переменных. Причем если после изменения вывести в консоль pVal, то оно будет изменено на "NO_DATA", а в dxdiag.exe изменениями и не пахнет.
![]() Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
||||
|
|||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Без этого каждый новый thread для вызова ApplyHooks будет вызывать эту точку входа вновь и вновь. В результате в системе кончится либо стек либо очередь на вызов DllMain
Скорее всего это связано с тем, что dxdiag извлекает данные не через этот метод. Там очень и очень много способов эти данные извлечь. Ну и ясности ради - возвращать BSTR так (V_BSTR(pVal) = L"NO_DATA";) нельзя - см SysAllocString |
||||
|
|||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |