49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
1

Сместить адрес регистра

10.01.2020, 16:27. Показов 1800. Ответов 28
Метки нет (Все метки)

Читаю статью с хабра https://habr.com/en/post/190800/
и там сказано :
CONTEXT lcContext;
lcContext.ContextFlags = CONTEXT_ALL;
GetThreadContext(m_cProcessInfo.hThread, &lcContext);
Окей, мы получили его. Что теперь?
В регистре EIP содержится адрес следующей инструкции для выполнения. Он представлен членом Eip структуры CONTEXT. Как я уже упоминал раннее, EIP продвинулся вперёд и мы должны вернуть его обратно. К счастью для нас, нам надо всего лишь переместить его ровно на один байт, так как инструкция точки останова равна по длине одному байту. Именно это и делает код ниже:
lcContext.Eip --; // Move back one byte
SetThreadContext(m_cProcessInfo.hThread, &lcContext);
так вот тут ошибка же ,
C++
1
lcContext.Eip --;
не сдвинет адрес на 1 байт , а просто уменьшит значение этого регистра на 1, как правильно сдвинуть адрес на 1 байт? Создать указатель на этот регистр и его уменьшить?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.01.2020, 16:27
Ответы с готовыми решениями:

Создание регистра сведений Адрес
Здравствуйте! Как посоветуете создать Адрес в конфигурации (только улица, город и страна)? Чтобы...

Поместить адрес регистра в память
Есть кусочек кода mov ,al mov eax, mov ,eax test rcx,rcx

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

Частный адрес, динамический адрес, статический адрес - какой у меня?
Привет. Открываем рубрику глупых вопросов. Я сижу с компьютера который подключен к интернету по...

28
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
11.01.2020, 16:05 21
Цитата Сообщение от ReYalp Посмотреть сообщение
я понимаю что я смещаю адрес самого регистра, а не адрес в регистре, меня больше смущает почему это работает, во-вторых вы шлете какую-то непонятную дичь, хранится предположим там число 20 в том регистре, когда автор делает регистр-- то он уменьшает 20 на 1, это же не сдвиг адреса, хелоо
Рекомендую попробовать Cheat Engine, пройди туториал и ты почувствуешь что такое адрес, что такое регистр, что такое смещение

Ты реально делаешь ракету, при этом не зная как она работает и в добавок не пытаешься понять
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
11.01.2020, 17:05  [ТС] 22
zayats80888, окей, хорошо, если eip-- смещает на 1 байт то почему это тогда не работает?
0
5230 / 2885 / 1207
Регистрация: 07.02.2019
Сообщений: 7,277
11.01.2020, 17:12 23
Цитата Сообщение от ReYalp Посмотреть сообщение
почему это тогда не работает?
что это?
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
11.01.2020, 17:19 24
Цитата Сообщение от ReYalp Посмотреть сообщение
окей, хорошо, если eip-- смещает на 1 байт то почему это тогда не работает?
Я не понимаю, что у вас не работает?

Регистр это условно ячейка СОЗУ, которая хранит некоторую информацию (подобно обычным переменным), в данном случае
EIP - Extended Instruction Pointer тоесть указатель на инструкцию
Такие указатели - просто адреса, адреса ничем не отличаются от обычного числа!
Чтобы сдвинуть на 1 байт нужно отнять 1, если у вас что то не работает - скорее всего ошибка не тут
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
12.01.2020, 00:48  [ТС] 25
AndryS1, так а как же не отличаются если адреса хранятся же в шестнадцатиричном виде? zayats80888, я понял что я фигню писал, но почему не работает уменьшение адреса в регистре на 1? А если я делаю так как писал выше то все окей?
0
5230 / 2885 / 1207
Регистрация: 07.02.2019
Сообщений: 7,277
12.01.2020, 01:00 26
Цитата Сообщение от ReYalp Посмотреть сообщение
А если я делаю так как писал выше то все окей?
Если ты про
Цитата Сообщение от ReYalp Посмотреть сообщение
C++
1
2
DWORD* pl = &lcContext.Eip;
--pl; // Move back one byte
то ты тут просто объявляешь локальную переменную pl указывающую на поле Eip, потом "смещаешь" этот локальный указатель. После этого он возможно указывает на другое поле lcContext(на другой регистр может). Что после этого ты делаешь с этим указателем и что там у тебя "работает" мне не видно.
1
Don't worry, be happy
17752 / 10522 / 2028
Регистрация: 27.09.2012
Сообщений: 26,496
Записей в блоге: 1
12.01.2020, 01:21 27
Цитата Сообщение от ReYalp Посмотреть сообщение
Создать указатель на этот регистр и его уменьшить?
Начнем с того, то нельзя создать указатель на регистр.
Цитата Сообщение от ReYalp Посмотреть сообщение
как правильно сдвинуть адрес на 1 байт?
Адрес чего? Адрес, находящийся в eip?
Процессор сам его меняет выполняя программу.
Этот адрес программисту можно изменить с помощью инструкций call, jmp, и т.д.
В CONTEXT содержатся значения флагов и состояние регистров в определенный момент, но это всё уже лежит в памяти, которую Вы предоставили под CONTEXT. Туда просто скопируются нужные значения. Их изменение не есть изменение значений в регистрах.

Если бы Вы могли так менять регистр eip, чтобы Вам это дало? Чего Вы хотите добиться изменением eip?
1
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
12.01.2020, 02:21 28
Цитата Сообщение от ReYalp Посмотреть сообщение
так а как же не отличаются если адреса хранятся же в шестнадцатиричном виде?
иди почитай про виды
FF - 255
--FF = 254
255 = FF
--255 = FE

РАЗНИЦЫ НЕТ, ЭТО ПРОСТО ПРЕДСТАВЛЕНИЕ ДЛЯ УДОБСТВА

Добавлено через 45 секунд
И ВСЕ данные для компа вообще хранятся в bin
0
Croessmah
12.01.2020, 02:23     Сместить адрес регистра
  #29

Не по теме:

Цитата Сообщение от AndryS1 Посмотреть сообщение
ЭТО ПРОСТО ПРЕДСТАВЛЕНИЕ ДЛЯ УДОБСТВА
Запись числа.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2020, 02:23

Как реализовать в LPT взаимосвязь статус регистра и регистра данных
Как реализовать в LPT взаимосвязь статус регистра и регистра данных. Чтобы при изменении сигнала...

Как записать информацию из 16 битного регистра в два регистра по 8 бит
Как записать информацию из 16 битного регистра в два регистра по 8 бит. (То есть каждый раз может...

Строки: все буквы малого регистра заменить большими, а большого регистра малыми
введенной строке все буквы малого регистра заменить большими,а большого регистра малыми

Преобразовать буквы от k до х нижнего регистра в соответствующие верхнего регистра
Написать программу, выполняющую действия со строкой символов . Для модификации символов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru