Я студент и только что узнал о подключении к 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());
.
Может ли кто-нибудь помочь мне найти решение этой проблемы?