Перейти к содержанию
Авторизация  
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, а так же как отлавливаешь исключения

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

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

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