Перейти к содержанию

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

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

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

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