SweetAss1337 Опубликовано 18 декабря, 2019 Поделиться Опубликовано 18 декабря, 2019 (изменено) После установки хардверного бряка и вызывается исключение, я ловлю его и отправляю на свой код. Но я не могу получить доступ к регистрам, а следственно не могу получить параметры функции. Не удается туда ничего записать, мой код как будто изолирован от кода функции. Я не очень понимаю что означает размер брейкпоинта, написано что он может быть 1,2,4,8 байт. Это тот размер,внутри которого выполнятся инструкции,попавшие в него? Или это что-то другое? При этом если я трогаю регистр стека то он сохраняется, в отличие от остальных. То есть есть если после прыжка на свой код я напишу mov rdx,00000BB8 ret То не произойдет ничего, даже если в этом регистре лежит указатель на параметр функции, а если я напишу sub esp, FFF ret Произойдет краш. Не могу найти информации по этому поводу нигде Изменено 18 декабря, 2019 пользователем SweetAss1337 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 19 декабря, 2019 Поделиться Опубликовано 19 декабря, 2019 15 часов назад, SweetAss1337 сказал: Это тот размер,внутри которого выполнятся инструкции,попавшие в него? Или это что-то другое? Размер указывается для определенных типов брейкпоинта, чтобы зацепить изменения в адресе, только на запись и на чтение, если брейкпоинт на выполнение, то размер игнорируется. Получение значений регистров через асм вставки не должно было вызвать проблем, но правильнее было бы открыть поток, получить контекст, из контекста выбрать нужные регистры. auto threadID = GetCurrentThreadId(); auto hThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME | THREAD_QUERY_INFORMATION, FALSE, threadID); CONTEXT ctx = { 0 }; ctx.ContextFlags = CONTEXT_FULL; GetThreadContext(hThread , &ctx); 15 часов назад, SweetAss1337 сказал: Не могу найти информации по этому поводу нигде Удивительно, это ведь обычный mid hook. Ссылка на комментарий Поделиться на другие сайты Поделиться
SweetAss1337 Опубликовано 19 декабря, 2019 Автор Поделиться Опубликовано 19 декабря, 2019 (изменено) 13 часов назад, partoftheworlD сказал: Получение значений регистров через асм вставки не должно было вызвать проблем, но правильнее было бы открыть поток, получить контекст, из контекста выбрать нужные регистры. Так регистры не сохраняются ни в какую сторону. Пробовал разные параметры context.ContextFlags = CONTEXT_ALL CONTEXT_FULL. Я даже сделал тестовую консольку, которая раз в 3 сек выдает MessageBoxA. В ее регистре rdx хранится указатель на текст. Обычным хуком его можно поменять. Ставлю хук брейкпоинтом, код перенаправляется в мой коллбек, но регистры там уже не те что в начале оригинальной функции. И даже если я перезапишу их вручную, будь то просто ассемблером или через установку контекста, после возвращения назад в оригинальную функцию они не сохраняются. Да и прочитать таким образом регистры я могу только в момент когда я поймал текущий поток и провел все манипуляции, что само по себе довольной объемный код, которые эти же регистры трогает и перезаписывает. Я хочу поймать значение регистра как если бы перед началом функции я совершил обычный прыжок: 0x00000: mov rdx,FFFFFFFF 0x00001: jmp 0x00004 0x00002: 0x00003: jmp 0x00000 0x00004: начало оригинальной функции Вместо этого я прыгаю на изолированный кусок кода, внутри которого можно писать почти что угодно, но это не сохранится. Регистры в коллбеке: его код: CONTEXT context; //HANDLE Current = GetCurrentThread(); memset(&context, 0, sizeof(CONTEXT)); context.ContextFlags = CONTEXT_ALL; HANDLE hThread = OpenThread(THREAD_GET_CONTEXT | THREAD_SET_CONTEXT |THREAD_SUSPEND_RESUME | THREAD_QUERY_INFORMATION, FALSE, GetCurrentThreadId()); //SuspendThread(hThread); GetThreadContext(hThread, &context); printf("rdx: %p\n", context.Rdx); printf("rsi: %p\n", context.Rsi); printf("rcx: %p\n", context.Rcx); SetThreadContext(hThread, &context); Регистры в оригинальной функции в это время: Изменено 19 декабря, 2019 пользователем SweetAss1337 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 20 декабря, 2019 Поделиться Опубликовано 20 декабря, 2019 Нужно смотреть на код, как расставляешь и проверяешь доступность hwbp, а так же как отлавливаешь исключения Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения