Имеем код
mov r11, 1234567890abcdefh ; 49 BB EF CD AB ...
jmp r11
Detours копируют только первые 6 байт вместо всех 10-ти.
И создаёт неправильный трамплин.
Кто сталкивался с таким багом и починили ли его в 3.0 ?
Код с демонстрацией проблемы:
#include <windows.h>
#include <detours/detours.h>
typedef LPTOP_LEVEL_EXCEPTION_FILTER
(WINAPI*
SetUnhandledExceptionFilterType)(
_In_opt_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
SetUnhandledExceptionFilterType hookedSetUnhandledExceptionFilter;
LPTOP_LEVEL_EXCEPTION_FILTER
WINAPI
SetUnhandledExceptionFilterhook(
_In_opt_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
)
{
return hookedSetUnhandledExceptionFilterType(lpTopLevelExceptionFilter);
}
int main()
{
hookedSetUnhandledExceptionFilter = SetUnhandledExceptionFilter;
SetUnhandledExceptionFilter(0);
DWORD old;
VirtualProtect(SetUnhandledExceptionFilter, 4096, PAGE_EXECUTE_READWRITE, &old);
// mov r11, ....
// jmp r11
char data[] = { 0x49, 0xBB , 0x00 , 0x00 , 0xAB , 0x30 , 0xFD , 0x7F , 0x00 , 0x00, 0x41, 0xFF, 0xE3 };
SetUnhandledExceptionFilterType h = SetUnhandledExceptionFilterhook;
memcpy(&data[2], &h, 8); // Ставим нашу фукнцию
memcpy(SetUnhandledExceptionFilter, data, sizeof(data));
DetourTransactionBegin();
DetourAttach((void**)&hookedSetUnhandledExceptionFilter, SetUnhandledExceptionFilterhook);
DetourTransactionCommit();
hookedSetUnhandledExceptionFilter(0); // BOOM!
return 0;
}
P.S.
Не уверен сюда или в низкоуровневое писать.