Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
1

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

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

Author24 — интернет-сервис помощи студентам
Читаю статью с хабра 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
Заблокирован
10.01.2020, 16:44 2
Цитата Сообщение от ReYalp Посмотреть сообщение
не сдвинет адрес на 1 байт , а просто уменьшит значение этого регистра на 1
В регистре находится адрес инструкции.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
10.01.2020, 16:49  [ТС] 3
Verevkin, нууу , и мы берем десятичное значение этого адреса и уменьшаем на 1 , насколько я понял

Добавлено через 1 минуту
как я это понял? создал указатель на
Цитата Сообщение от ReYalp Посмотреть сообщение
lcContext.Eip
C++
1
2
DWORD* pl = &lcContext.Eip;
      --pl; // Move back one byte
и уменьшил , все заработало

Добавлено через 2 минуты
и я только что глянул, там адрес хранится в 10чном виде и если применять к нему оператор -- то уменьшается его десятичное же значение, верно?
0
Заблокирован
10.01.2020, 16:57 4
Цитата Сообщение от ReYalp Посмотреть сообщение
и я только что глянул, там адрес хранится в 10чном виде и если применять к нему оператор -- то уменьшается его десятичное же значение, верно?
Тебе ещё рано заниматься такими вещами, патамушта ты не понимаешь, как компьютер хранит и обрабатывает информацию. Если б у нас в бригаде программист такое ляпнул, это был бы полнейший зашквар и переселение на парашу предание анафеме.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
10.01.2020, 17:03  [ТС] 5
Verevkin, до сих пор не могу понять твои глупые шутки, чем мне рано заниматься? смещением адресов на один байт?

Добавлено через 48 секунд
что такое
Цитата Сообщение от Verevkin Посмотреть сообщение
компьютер
? дисплей?

Добавлено через 1 минуту
Verevkin, если в регистре хранится адрес инструкции и
Цитата Сообщение от ReYalp Посмотреть сообщение
lcContext.Eip --;
работает прошу показать, а если не можешь объяснить нормально то лучше не пиши в следующий раз
0
Заблокирован
10.01.2020, 17:44 6
Цитата Сообщение от ReYalp Посмотреть сообщение
работает прошу показать
Отстань от меня. Вдруг это заразно и передаётся через интернет...
0
ReYalp
10.01.2020, 17:52  [ТС]
  #7

Не по теме:

Verevkin, тебе уже точно хуже не будет , нету куда хуже...

0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
10.01.2020, 21:37 8
Цитата Сообщение от ReYalp Посмотреть сообщение
чем мне рано заниматься?
Перевожу.
Verevkin намекает, что вот это:
Цитата Сообщение от ReYalp Посмотреть сообщение
и я только что глянул, там адрес хранится в 10чном виде
полная лажа, и предлагает пойти подучиться.
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
10.01.2020, 22:57 9
Цитата Сообщение от ReYalp Посмотреть сообщение
и я только что глянул, там адрес хранится в 10чном виде и если применять к нему оператор -- то уменьшается его десятичное же значение, верно?
Лично заплачу 1000 рублей, если объяснишь разницу декремента для HEX и для DEC
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
10.01.2020, 23:01 10
Цитата Сообщение от AndryS1 Посмотреть сообщение
Лично заплачу 1000 рублей, если объяснишь разницу декремента для HEX и для DEC
--DEC == DEB
--HEX == HEW
2
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
11.01.2020, 01:02 11
ReYalp,

Что такое адрес? Число.
В EIP храниться адрес следующей инструкции. Т.е. число.
Если уменьшим значения EIP, что произойдёт?
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
11.01.2020, 03:34 12
AlexVRud, этот человек полез строить ракету, не зная как она работает
Тут мало что поможет
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
11.01.2020, 07:31  [ТС] 13
AlexVRud, если мы уменьшим число которое там хранится на 1 то оно просто уменьшится на 1, давайте лучше не так, постройке приложение с той статьи да так чтобы адрес регистра сдвигался именно с помощью eip--

Добавлено через 1 минуту
Croessmah, так с чем лажа я не пойму? Адрес имеет тип DWORD, не DWORD * то что я неправильно написал?
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
11.01.2020, 07:58 14
ReYalp,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int main()
{
    char code[] = "123";
    const size_t instruction_size = 1;
 
    int reg = (int)&code[1];
 
    (std::cout << "current instruction: ").write((char*)reg, instruction_size) << std::endl;
 
    reg -= instruction_size;
 
    (std::cout << "current instruction: ").write((char*)reg, instruction_size) << std::endl;
}
0
Заблокирован
11.01.2020, 09:42 15
Цитата Сообщение от Croessmah Посмотреть сообщение
--DEC == DEB
--HEX == HEW
Ахахаха!!! Зачот!
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
11.01.2020, 10:59 16
ReYalp, уже почувствуй разницу между "адрес В регистре" и "адрес регистра".

вот тебе модель
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <stdint.h>
 
struct State {
  uint64_t eip;
};
 
class Computer {
public:
  Computer(char *program) : eip(program) {}
 
  static constexpr char kStop = 0;
  static constexpr char kBreak = 'B';
 
  void run() {
    while (true) {
      switch (*eip) {
      case kStop:
        std::cout << "STOP\n";
        return;
      case kBreak:
        std::cout << "BREAK\n";
        ++eip;
        return;
      default:
        std::cout << "Exec: " << *eip << "\n";
        ++eip;
      }
    }
  }
 
  void getState(State *state) { state->eip = (uint64_t)eip; }
 
  void setState(const State *state) { eip = (char *)(state->eip); }
 
private:
  char *eip;
};
 
int main() {
  char program[] = "12345B6789abcdefBxyz";
  Computer computer(program);
  computer.run();
 
  State state;
  computer.getState(&state); //< Получить состояние
  state.eip += 4;            //< Изменить EIP
  computer.setState(&state); //< Установить новое состояние
 
  computer.run();
}


В которой важны следующие 4 строки:

C++
1
2
3
4
  State state;
  computer.getState(&state); //< Получить состояние
  state.eip += 4;            //< Изменить EIP
  computer.setState(&state); //< Установить новое состояние
Ничего не напоминают?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
11.01.2020, 11:25  [ТС] 17
zayats80888, AlexVRud, Во-первых я понимаю что я смещаю адрес самого регистра, а не адрес в регистре, меня больше смущает почему это работает, во-вторых вы шлете какую-то непонятную дичь, хранится предположим там число 20 в том регистре, когда автор делает регистр-- то он уменьшает 20 на 1, это же не сдвиг адреса, хелоо
0
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
11.01.2020, 11:54 18
ReYalp, надо говорить так:
я понимаю что я смещаю адрес
в регистре
хранится предположим там
адрес
, когда автор делает регистр-- то он уменьшает
адрес
на 1
, это
сдвиг адреса, хелоо
0
Заблокирован
11.01.2020, 12:05 19
Цитата Сообщение от nalbe666 Посмотреть сообщение
ReYalp, надо говорить так:
я понимаю что я смещаю адрес
в регистре
хранится предположим там
адрес
, когда автор делает регистр-- то он уменьшает
адрес
на 1
, это
сдвиг адреса, хелоо
Это рэпчик!
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
11.01.2020, 12:08 20
ReYalp,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// пущай у нас в памяти лежит некий объект
T obj;
 
// определим указатель на этот объект
// значение этого указателя - адрес объекта
T* ptr = &obj;
 
ptr--; // это выражение эквивалентно ptr = ptr - 1, т.е. смещение не на  1 байт, а на sizeof(T) байт
 
// указатель в С++ может быть явно конвертирован в любой целочисленный тип, достаточно большой,
// что бы хранить значение этого указателя. Например на X86 подойдет size_t
size_t ptr_value = reinterpret_cast<size_t>(ptr);
 
ptr_value++; // это выражение эквивалентно  ptr_value = ptr_value + 1, т.е. "смещение" на 1 байт
 
// Следуещее преобразование валидное в свете предыдущих,
// однако another_ptr указывает совсем не на obj
// доступ к значению (*another_ptr) - UB
T* another_ptr = reinterpret_cast<T*>(ptr_value);
0
11.01.2020, 12:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2020, 12:08
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru