Microsoft Detours 2 bug
От: _NN_ www.nemerleweb.com
Дата: 13.02.17 14:30
Оценка:
Имеем код

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.
Не уверен сюда или в низкоуровневое писать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.