Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2017, 17:07   #21
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Кароче вот пробуйте ) - это работало давно на вин-32, щас может прийдется допилить под 64 бита.

Вас интересует TDllFuncInter
Вложения
Тип файла: 7z api_old.7z (7.5 Кб, 12 просмотров)
alexzk вне форума Ответить с цитированием
Старый 16.11.2017, 17:27   #22
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

У вас кстати битовость совпадает? И ваша, и исходная DLL должны быть одинаковой битовости (32/64). Убедитесь тулзами, что совпадает. А то "я уверен", может и не сработать.
alexzk вне форума Ответить с цитированием
Старый 16.11.2017, 17:53   #23
SuprSonic
Пользователь
 
Регистрация: 07.08.2016
Сообщений: 16
По умолчанию

Спасибо, буду ковырять. Да битность совпадает.
SuprSonic вне форума Ответить с цитированием
Старый 17.11.2017, 21:47   #24
SuprSonic
Пользователь
 
Регистрация: 07.08.2016
Сообщений: 16
По умолчанию

Доковырялся
Получилось перехватить, но не получается подменить.
В dxdiag инфа остается прежней.
Код:
typedef HRESULT(__stdcall *IWbemClassObject_Get)(void *__this, LPCWSTR, LONG, VARIANT*, CIMTYPE*, LONG*);
IWbemClassObject_Get True_Get;
 
__declspec(dllexport) HRESULT __stdcall Hooked_Get(void *__this, LPCWSTR wszName, LONG lFlags, VARIANT *pVal, CIMTYPE *pvtType, LONG *plFlavor)
{
    printf("wszName: %S\n", wszName);
    std::cout << "lFlags:" << lFlags << std::endl;
    std::cout << "pVal:" << pVal << std::endl;
    std::cout << "pvtType:" << pvtType << std::endl;
    std::cout << "plFlavor:" << plFlavor << std::endl;
    return True_Get(__this, wszName, lFlags, pVal, pvtType, plFlavor);
}
 
template<typename T>
void HookFunction(const char *module, char *signature, T &fn_real, PVOID fn_mine)
{
    HookFunction<T>(DetourFindFunction(module, signature), fn_real, fn_mine);
}
 
template<typename T>
void HookFunction(DWORD address, T &fn_real, PVOID fn_mine)
{
    HookFunction<T>(reinterpret_cast<PVOID>(address), fn_real, fn_mine);
}
 
template<typename T>
void HookFunction(PVOID target, T &fn_real, PVOID fn_mine)
{
    fn_real = reinterpret_cast<T>(target);
 
    HookFunction<T>(fn_real, fn_mine);
}
 
template<typename T>
void HookFunction(T &fn_real, PVOID fn_mine)
{
    DetourAttach(&(PVOID&)fn_real, fn_mine);
}
 
void ApplyHooks(LPVOID address) //Function address 0x6FD9B723
{
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    HookFunction<IWbemClassObject_Get>((FARPROC)address, True_Get, Hooked_Get);
    DetourTransactionCommit();
}
 
BOOL APIENTRY DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    AllocConsole();
    freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);
 
    HMODULE hLib = GetModuleHandle(L"fastprox.dll");
    if (hLib)
    {
        FARPROC hAdd = GetProcAddress(hLib, "?Get@CWbemObject@@UAGJPBGJPAUtagVARIANT@@PAJ2@Z");
        if (hAdd)
        {
            if (dwReason == DLL_THREAD_ATTACH)
            {
                std::cout << "DLL_THREAD_ATTACH" << std::endl;
                DisableThreadLibraryCalls(hinst); // Почему-то если его убрать, то через какой-то время dxdiag.exe выбрасывает ошибку
                CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ApplyHooks, hAdd, 0, 0);
            }
        }
    }
        return TRUE;
}
Код рабочий и все перехваченное пишет в консоль:
eBTqAyE.png

Есть правда пока не понятные для меня "особенности".
1). Если убрат из кода DisableThreadLibraryCalls(hinst); то dxdiag.exe выбрасывает ошибку через некоторое время работы(выбрасывает в тот момент когда софтина начинает подробно "копать" данные). При этом в консоль выводятся какие-то данные.
2). Есть некоторая мысль, что подменить данные не получается из-за DisableThreadLibraryCalls...

Сейчас если поменять данные pVal и тут же вывести ее в консоль, то выведет то что надо, однако в dxdiag.exe изменений нет.
SuprSonic вне форума Ответить с цитированием
Старый 17.11.2017, 22:24   #25
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

1. не используйте С функции, они часто потоко не безопасны, пока у вас там printf("wszName: %S\n", wszName); и он вроде не опасен, но все же.
2. Попробуйте

Код:
static IWbemClassObject_Get True_Get;
У потоков каждый поток имеет свой стек. Т.о. ваш вариант предполагает, что новый поток должен иметь свою переменную.

Стоп...

Код:
if (dwReason == DLL_THREAD_ATTACH)
            {
                std::cout << "DLL_THREAD_ATTACH" << std::endl;
                DisableThreadLibraryCalls(hinst); // Почему-то если его убрать, то через какой-то время dxdiag.exe выбрасывает ошибку
                CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ApplyHooks, hAdd, 0, 0);
            }
Ну вот жеж, при создании нового потока (а dxdiag их может скажем 10 запустить) вы делаете 10 перехватов
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ApplyHooks, hAdd, 0, 0);

т.е. перехват перехвата перехвата перехвата....
а
DisableThreadLibraryCalls(hinst);

отключает просто 2й и дальше.

Собственно зачем вы вообще к этому привязались? Верните как было DLL_PROCESS_ATTACH и переменную static

Это все под ИФ тоже завернуть

Код:
 AllocConsole();
    freopen_s((FILE**)stdout, "CONOUT$", "w", stdout);
 
    HMODULE hLib = GetModuleHandle(L"fastprox.dll");
    if (hLib)
Цитата:
An optional entry point into a dynamic-link library (DLL). When the system starts or terminates a process or thread, it calls the entry-point function for each loaded DLL using the first thread of the process.
Функция DllMain вызывается МНОГО раз, поэтому у вас там все время чета другое выходит.

Последний раз редактировалось alexzk; 17.11.2017 в 22:37.
alexzk вне форума Ответить с цитированием
Старый 17.11.2017, 23:08   #26
SuprSonic
Пользователь
 
Регистрация: 07.08.2016
Сообщений: 16
По умолчанию

Если заверну все под IF DLL_PROCESS_ATTACH то все отработает только один раз, GetModuleHandle(L"fastprox.dll"); вернет NULL и на этом все закончится
SuprSonic вне форума Ответить с цитированием
Старый 18.11.2017, 08:27   #27
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от SuprSonic Посмотреть сообщение
Если заверну все под IF DLL_PROCESS_ATTACH то все отработает только один раз, GetModuleHandle(L"fastprox.dll"); вернет NULL и на этом все закончится
Ну так нада разобратся какого хрена он возвращает нуль, а не вертеть велики. Вот вы уже сами обозначили симптом проблемы, почему вы его игнорите?
Может быть разный порядок загрузки? Тогда нужно сделать так, чтобы эта длл уже была загружена до вашей. А вероятнее всего, не находится тупо она - пропишите полный путь к файлу, или переменную PATH в виндовс - добавте путь.
Цитата:
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
У вас походу происходит так

1. Ваша программа фейлится найти файл и вы там сделали костыль
2. dxdiag находит файл и запускает
3. Теперь и ваша программа его находит 10 раз подряд, тут у вас еще 1 костыль DisableThreadLibraryCalls(hinst);
4. Но вы уже опоздали с перехватом. dxdiag все сделал. Хотя в этом моменте не совсем уверен.

Перестаньте игнорить факты проблемы и лепить костыли. Сделайте, как должно и логически верно (первые варианты), а потом разберитесь, от чего проблема.

Последний раз редактировалось alexzk; 18.11.2017 в 08:39.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подмена url с помощью .htaccess Gorychev Общие вопросы Web 1 19.02.2014 01:39
в чем отличие gpu core clock и gpu clock почему значания разные? gpu0 Компьютерное железо 0 10.06.2012 05:17
DETOURS, Перехват API средствами Detours Micki1 Visual C++ 1 05.04.2012 04:45
подмена данных в программе linkod Фриланс 9 12.03.2009 11:12
Подмена данных Smip Microsoft Office Excel 2 13.01.2009 08:51