• Объявления

    • Garik66

      Пользователям форума   05.11.2017

      Прошу обратить внимание на эту тему (чтобы увидеть ссылку, войдите в объявление - нажмите на заголовок):   
Korol2010

Смещение указателя

24 сообщения в этой теме

Здравствуйте, не могу понять как сосчитать смещение такого рода [esi+eax*4]. Прошу помощи)) Объясните новичку как такое считается. И если не трудно можно ещё какие-то другие смещения показать))

0

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


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

У регистра есть значение, которое можно посмотреть при снятии показания регистров.

Квадратные скобки обозначают обращение к адресу.

Инструкции ассемблера могут как читать адреса, так и записывать в них.

mov ebx, [esi+eax*4] // здесь происходит чтение адреса es+eax*4 (подставь значения регистров)

mov [esi+eax*4], eax // здесь запись

А в этом случае может быть проблема

mov eax, [esi+eax*4]

Здесь eax в квадратных скобках может быть не известен - eax будет уже результатом чтения адреса esi+eax*4. Чтобы узнать адрес eax есть два способа - изменить тип брейк поинта на не аппаратный или здесь просчитать через пошаговую отладку.

0

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


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

Подскажите более детально как мне рассчитать смещение 

EAX=1A9E6A78
EBX=1BEC6EA2
ECX=000068D2
EDX=1B7F0838
ESI=057B3008
EDI=139F3020
EBP=0012FC4C
ESP=0012FBBC
EIP=0049BB80

Probable base pointer =1B7F0838

0049BB78 - sub eax,01
0049BB7B - and eax,ecx
0049BB7D - mov eax,[edx+eax*4] - Данное смещение.
0049BB80 - test eax,eax
0049BB82 - je X3TC.exe+9BB8F
 

Мне нужно рассчитать этот офсет для установления указателя.

0

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


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

Мне нужно рассчитать этот офсет для установления указателя.

Смещение eax*4.

Чтобы узнать чему был равен eax. поставь бряк на инструкцию  

0049BB7D - mov eax,[edx+eax*4] // - Данное смещение.

получишь значение в регистре eax перед срабатыванием этой инструкции.

После срабатывания инструкции eax уже равен EAX=1A9E6A78.

0

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


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

Смещение eax*4.

Чтобы узнать чему был равен eax. поставь бряк на инструкцию  


0049BB7D - mov eax,[edx+eax*4] // - Данное смещение.

получишь значение в регистре eax перед срабатыванием этой инструкции.

После срабатывания инструкции eax уже равен EAX=1A9E6A78.

Брэйк поинт на Write?

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

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


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

Я просто не понял что мне нужно будет сделать с инструкцией.

0

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


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

Брэйк поинт на Write?

На саму инструкцию (не на адрес) в отладчике, там один вид бряка.

Посмотри вот это видео (2 мин 50 сек), я там другие регистры показываю как посмотреть, но это не важно, ты увидишь значение регистра eax перед срабатыванием твоей инструкции. 

0

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


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

ЗЫ: Хотя подожди, твоя инструкция работает не с одним адресом - бряк может сработать не там где нужно (нужен условный бряк, это уже нужно объяснять).

Короче давай сделаем проще:

A - адрес твоей характеристики, ты его не указал, было бы проще.

C - смещение, которое ты хочешь найти.

C = eax*4.= A - edx  (подставь вместо A свой адрес и edx)

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

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


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

ЗЫ: Хотя подожди, твоя инструкция работает не с одним адресом - бряк может сработать не там где нужно (нужен условный бряк, это уже нужно объяснять).

Короче давай сделаем проще:

A - адрес твоей характеристики, ты его не указал, было бы проще.

C - смещение, которое ты хочешь найти.

C = eax*4.= A - edx  (подставь вместо A свой адрес и edx)

Получилось так :

A = 06ABC019(адрес)

edx = 193CFC98(подпись в дополнительной информации)

C - получилось =FFFF FFFF ED63 C381

 

И вот он не принимает такое смещение.

Может что то делаю не так?,edx адрес или значение которое показывается в дополнительной информации?

Что видать с вычисление не то.

Изменено пользователем saiberpro
Дополнение
0

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


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

Может что то делаю не так?,

Скорее всего. 

 

В регистре edx, на момент срабатывания твоей инструкции (mov eax,[edx+eax*4]), лежит адрес начала структуры, в eax лежит (грубо говоря) ID твоей характеристики, т.е  попробую  нарисовать наглядный пример:

Инструкция отвечает за несколько структур (может быть много) 

 

                                струтура   ГГ (главный герой):

edx (начало структуры)  = адрес 1                             адрес 2                           Рассчитываем смещения

структура:                        инвентарь:                        характеристики :             

eax (ID =1)                       оружие в левой руке          сила                               1*4 -> [edx+04]

eax (ID =2)                       оружие в правой руке         восприятие                    2*4 -> [edx+08]

eax (ID =3)                       броня                                выносливость                 3*4 -> [edx+0C]

eax (ID =4)                       шлем (голова)                    ловкость                        4*4 -> [edx+10] 

 

И так далее. eax (или ID) конечно может меняться и по другому, это приблизительная схема.

 

Как видишь у А и edx не может быть такой разницы, как у тебя:

6 часов назад, saiberpro сказал:

A = 06ABC019(адрес)

edx = 193CFC98(подпись в дополнительной информации

Они должны быть близко друг к другу.

 

 

 

0

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


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

Ещё один способ посмотреть значение регистра для подобных

 mov eax,[edx+eax*4] 

инструкций (у себя в видео-уроках я часто использую его): 

 

1. Переходим на эту инструкцию в отладчике, соответственно она выделена.

2. ПКМ (правая кнопка мыши) по этой инструкции, в контекстном меню выбираем строчку "Найти адреса, к которым обращается эта инструкция."

3. Появится новое окно "Изменённые адреса".

4. В этом окне найди адрес, нужной тебе характеристики.

5. ПКМ по этому адресу, в контекстном меню выбираем строчку "Показать состояние регистров"

 

Вот здесь будет нужный тебе eax, из которого ты и рассчитаешь своё смещение.  

 

 

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

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


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

Ещё один способ посмотреть значение регистра для подобных


 mov eax,[edx+eax*4] 

инструкций (у себя в видео-уроках я часто использую его): 

 

1. Переходим на эту инструкцию в отладчике, соответственно она выделена.

2. ПКМ (правая кнопка мыши) по этой инструкции, в контекстном меню выбираем строчку "Найти адреса, к которым обращается эта инструкция."

3. Появится новое окно "Изменённые адреса".

4. В этом окне найди адрес, нужной тебе характеристики.

5. ПКМ по этому адресу, в контекстном меню выбираем строчку "Показать состояние регистров"

 

Вот здесь будет нужный тебе eax, из которого ты и рассчитаешь своё смещение.  

 

 

Уровень тупости у меня постепенно падает, но возникла проблема другого характера приложение после установки брейкпоинта(что бы посмотреть состояние регистров) застывает чёрным экраном, но данные собирает.Проблема в том что приложение мне не возвращает курсор для работы. Было такое ?, может есть способы лечения?

0

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


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

Уровень тупости у меня постепенно падает, но возникла проблема другого характера приложение после установки брейкпоинта(что бы посмотреть состояние регистров) застывает чёрным экраном, но данные собирает.Проблема в том что приложение мне не возвращает курсор для работы. Было такое ?, может есть способы лечения?

Что застывает? Какое приложение?

Если СЕ,. то не знаю что это.

Если игра, то так и должно быть - ты же поставил бряк - процесс игры остановлен.

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

Посмотри видео, на которое ранее давал ссылку.

 

ЗЫ: а нет я в том видео не показывал, как снять брейкпоинт. Но у меня в других видео, где-то это есть  Сейчас ломает искать, а на вскидку я не помню.

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

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


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

Что застывает? Какое приложение?

Если СЕ,. то не знаю что это.

Если игра, то так и должно быть - ты же поставил бряк - процесс игры остановлен.

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

Посмотри видео, на которое ранее давал ссылку.

Когда я переключил процесс на игру(ALT+TAB) все нормально,но после того как я переключаюсь обратно на CE у меня пропадает курсор с экрана и поэтому производить дальнейшие действия проблематично и неудобно без курсора. Спасает только закрытие приложения(Игры), после закрытия курсор вновь появляется.

Изменено пользователем saiberpro
Дополнение
0

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


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, saiberpro сказал:

Когда я переключил процесс за игру(ALT+TAB) все нормально,но после того как я переключаюсь обратно на CE у меня пропадает курсор с экрана и поэтому производить дальнейшие действия проблематично.

Это уже связано с драйверами и конфликтами СЕ с игрой, СЕ с дровами, Игры и СЕ. Я здесь ничем не помогу.

0

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


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

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

0

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


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

Это уже связано с драйверами и конфликтами СЕ с игрой, СЕ с дровами, Игры и СЕ. Я здесь ничем не помогу.

Протестирую с другими играми и посмотрю что изменится или нет.

0

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


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

Когда я переключил процесс на игру(ALT+TAB)

дк https://sourceforge.net/projects/dxwnd/

 

0

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


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

Что это?

Это он дал кому то из вас программу, для запуска игры в оконном режиме.

0

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


Ссылка на сообщение
Поделиться на других сайтах
17 минуту назад, saiberpro сказал:

Что это?

Это прога для запуска игр в оконном режиме, не знаю для чего gmz тебе это отправил.

0

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


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, Garik66 сказал:

Это прога для запуска игр в оконном режиме, не знаю для чего gmz тебе это отправил.

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

0

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


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, LIRW сказал:

Извиняюсь - Игорь не тебе он дал, а ему. 

offtopic.gif:D Извиняю.

0

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


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

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

Курсор пропадает в игре  в оконном режиме.

0

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас