Как заменить (подключить) функцию Windows на пользовательскую, используя MS Detours? - PullRequest
0 голосов
/ 01 октября 2019

Я студент и только что узнал о подключении к MS Detours.

ОПИСАНИЕ: Я хотел заменить некоторые функции Windows для написания и изменения текста внутри окон, заголовков и т. Д., Напримерa TextOutW() функция

Функция TextOut() записывает строку символов в указанное место, используя текущий выбранный шрифт, цвет фона и цвет текста.

ЦЕЛЬ: Моя цель - подключить новые функции (например, NewTextOutW()), которые будут делать то же самое, но они переведут текст на другой язык. Новые функции имеют те же параметры, что и исходные.

ПОЧЕМУ MS DETOURS?

Я должен использовать MS Detours, потому что традиционный перехват с asm и перезапись горячих-patch header оригинальной функции работает только для версии приложения для X86, но не для X64, поэтому, поскольку MS Detours совместим с 32-битными и 64-битными приложениями, я хочу использовать MS Detorus.

Я хочувыполните перехват с адресами функций, потому что у меня есть исходный код, и у меня есть адреса оригинала и новой функции, сохраненные в переменной типа BYTE*.

ИНФОРМАЦИЯ О КОДЕ: Это мой код, который собирается присоединить новую функцию к исходной, используя 2 адреса (BYTE* m_pOrigFunc и BYTE* m_pDetourFunc).

m_pOrigFunc является адресом исходной функции, а m_pDetourFunc является адресом функции, которая будет присоединена к исходной функции. Чтобы отделить две функции, я использую один и тот же код, но за исключением использования DetourAttach((PVOID*)&m_pOrigFunc, m_pDetourFunc) я использую оператор DetourDetach((PVOID*)&m_pOrigFunc, m_pDetourFunc).

CODE:

LONG err_cd = DetourTransactionBegin();

   if (err_cd == NO_ERROR)
   {
      //err_cd = DetourUpdateThread(GetCurrentThread());
      if (err_cd == NO_ERROR)
      {
         err_cd = DetourAttach((PVOID*)&m_pOrigFunc, m_pDetourFunc);
         if (err_cd == NO_ERROR)
         {
            err_cd = DetourTransactionCommit();
            if (err_cd == NO_ERROR)
               ::Trace(2, _T("MSDetours::DetourTransactionCommit: Detour erfolgreich."));
            else
               AbortAndTraceMSDetours("DetourTransactionCommit", err_cd);}
         else
            AbortAndTraceMSDetours("DetourAttach", err_cd);}
      else
         AbortAndTraceMSDetours("DetourUpdateThread", err_cd);}
   else
      AbortAndTraceMSDetours("DetourTransactionBegin", err_cd);

ПРОБЛЕМА: После реализации этого кода я получил ошибку в какой-то другой функции Windows (я хочу создать кадр, но я не уверен), которую вы можете увидеть здесь . Для людей, которые не говорят по-немецки , вот перевод текста:

Необработанное исключение в 0x6D0A00C8 в Konfig32.exe: 0xC000041D: во время обратного вызова пользователя возникло необработанное исключение.

Ошибка возникает с или без комментирования строки с оператором err_cd = DetourUpdateThread(GetCurrentThread());.

Может ли кто-нибудь помочь мне найти решение этой проблемы?

...