Перейти к содержанию
Авторизация  
SweetAss1337

Доступ к регистрам hardware breakpoint

Рекомендуемые сообщения

После установки хардверного бряка и вызывается исключение, я ловлю его и отправляю на свой код. Но я не могу получить доступ к регистрам, а следственно не могу получить параметры функции. Не удается туда ничего записать, мой код как будто изолирован от кода функции. 
Я не очень понимаю что означает размер брейкпоинта, написано что он может быть 1,2,4,8 байт. Это тот размер,внутри которого выполнятся инструкции,попавшие в него? Или это что-то другое? 
При этом если я трогаю регистр стека то он сохраняется, в отличие от остальных. То есть есть если после прыжка на свой код я напишу 
 

mov rdx,00000BB8
ret

То не произойдет ничего, даже если в этом регистре лежит указатель на параметр функции, а если я напишу
 

sub esp, FFF
ret

Произойдет краш.

Не могу найти информации по этому поводу нигде

Изменено пользователем SweetAss1337

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
13 часов назад, partoftheworlD сказал:

Получение значений регистров через асм вставки не должно было вызвать проблем, но правильнее было бы открыть поток, получить контекст, из контекста выбрать нужные регистры.

 

Так регистры не сохраняются ни в какую сторону. Пробовал разные параметры context.ContextFlags = CONTEXT_ALL     CONTEXT_FULL.
Я даже сделал тестовую консольку, которая раз в 3 сек выдает MessageBoxA. В ее регистре rdx хранится указатель на текст. Обычным хуком его можно поменять.

Ставлю хук брейкпоинтом, код перенаправляется в мой коллбек, но регистры там уже не те что в начале оригинальной функции. И даже если я перезапишу их вручную, будь то просто ассемблером или через установку контекста, после возвращения назад в оригинальную функцию они не сохраняются.

Да и прочитать таким образом регистры я могу только в момент когда я поймал текущий поток и провел все манипуляции, что само по себе довольной объемный код, которые эти же регистры трогает и перезаписывает.
Я хочу поймать значение регистра как если бы перед началом функции я совершил обычный прыжок:
 

0x00000:  mov rdx,FFFFFFFF
0x00001:  jmp 0x00004
0x00002: 
0x00003:  jmp 0x00000
0x00004:  начало оригинальной функции


Вместо этого я прыгаю на изолированный кусок кода, внутри которого можно писать почти что угодно, но это не сохранится.

 

Регистры в коллбеке:

123u.1576796471.png

 

его код:
 

	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);

Регистры в оригинальной функции в это время:

Snimok123.1576796610.png

Изменено пользователем SweetAss1337

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно смотреть на код, как расставляешь и проверяешь доступность hwbp, а так же как отлавливаешь исключения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В данном топике никто не постил уже 4 месяца. Пости здесь только если твой вопрос точно совпадает с темой данного топика.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр
Авторизация  

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.