Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: MASM64, х64/long mode
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
ziqp
125 / 61 / 16
Регистрация: 03.09.2015
Сообщений: 818
1

Краш программы, регистры

07.06.2018, 19:23. Просмотров 905. Ответов 9
Метки нет (Все метки)

Существует программа, где из определенной точки мне нужно перебросить вызов в другое место.
Что я делаю:
1. затираю несколько команд
2. вместо этих команд пишу вызов на свою функцию таком образом:
movabs r13, 7FF78C0CB6F1 (это пример адреса
call r13.
3. внутри моей функции восстанавливаю затертые комманды
4. делаю свои делишки
5. вызываю оригинальную функцию

Пропускаем 4-й пункт, я его убрал. Ломается сама оригинальная функция, сам вообще не понимаю что не так.
DrawIndexed вызываемый из midfunc просто возвращает функцию которая изначально должна была запускаться.
Итог - краш
Наглядно все во вложении
Краш программы, регистры
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2018, 19:23
Ответы с готовыми решениями:

Что такое регистры микропроцессора? Перечислите регистры общего назначения
Помогите пожалуйста решить задания по TASM 1) Что такое регистры...

регистры
Если процессор 16 разрядный, то у него и 16 регистров? Я что то на схеме...

регистры AH AL
Регистр AX можно разделить на AH И AL (Hight и Low). Для чего так сделали?...

регистры
разбираю пример из Калашникова CSEG segment org 100h begin: mov...

Регистры асм
Привет всем)) заинтересовал такой вопрос. Регистры ax,bx,cx,dx используются...

9
Mikl___
Автор FAQ
11975 / 6245 / 593
Регистрация: 11.11.2010
Сообщений: 11,303
08.06.2018, 10:32 2
ziqp,
прежде чем вызывать call убедись, что содержимое rsp кратно 16. При возврате в оригинальную функцию убедись, что содержимое rsp кратно 16. Также перед возвратом восстанови значения в тех регистрах, которые тобою использовались...
1
ziqp
125 / 61 / 16
Регистрация: 03.09.2015
Сообщений: 818
09.06.2018, 15:55  [ТС] 3
Цитата Сообщение от Mikl___ Посмотреть сообщение
прежде чем вызывать call убедись, что содержимое rsp кратно 16. При возврате в оригинальную функцию убедись, что содержимое rsp кратно 16.
Можно узнать почему rsp должен быть кратен 16?
16 это в 10-ричной системе?
Цитата Сообщение от Mikl___ Посмотреть сообщение
Также перед возвратом восстанови значения в тех регистрах, которые тобою использовались...
Перед возвратом куда?

Или если это долго расписывать, можно ссылку на документацию с этим объяснением?

P.S. решение я уже нашел, сделав по-другому, но проблема все еще актуальна
0
Mikl___
Автор FAQ
11975 / 6245 / 593
Регистрация: 11.11.2010
Сообщений: 11,303
09.06.2018, 17:13 4
Лучший ответ Сообщение было отмечено R71MT как решение

Решение

16 это в десятеричной
Можно узнать почему rsp должен быть кратен 16?
Потому что будет крэш
Перед возвратом куда?
перед возвратом из твоей функции
можно ссылку на документацию с этим объяснением?
прочитай об особенностях вызова fastcall в x64

httрs://dосs.micrоsоft.соm/ru-ru/срр/build/оverview-of-x64-саlling-convеntiоns
httрs://docs.micrоsoft.com/ru-ru/срр/build/x64-sоftwаre-соnventions
в ссылках латинские буквы заменены на русские чтобы их не испортил местный форумный движок, поэтому набери ее вручную
1
ФедосеевПавел
09.06.2018, 20:06
  #5

Не по теме:

Почему портит?
https://docs.microsoft.com/ru-ru/cpp...ng-conventions
Внешне ссылка короче, но при наведении на неё мышкой в строке статуса браузера, или при переходе по ней - всё корректно.
Читал, что при подписке на тему, на почту приходит повреждённая ссылка.

0
Ethereal
4852 / 1874 / 243
Регистрация: 17.02.2013
Сообщений: 2,787
10.06.2018, 02:59 6
Да там даже без особенностей 64-разрядного режима начудачено.
В оригинальном коде r8d читалась из [esp+80], а после того как ты на стек и r13 поклал и подпрограмму вызвал (т.е. еще поклал на стек адрес возврата), ну неужели [esp+80] так и будет продолжать указывать на тот-же адрес ?
И как отработает последовательность исполненных инструкций push r13 call метка pop r13 ret ?
2
ziqp
125 / 61 / 16
Регистрация: 03.09.2015
Сообщений: 818
10.06.2018, 18:28  [ТС] 7
Цитата Сообщение от Ethereal Посмотреть сообщение
Да там даже без особенностей 64-разрядного режима начудачено.
Вроде бы понял.
Может можно использовать какие-нибудь регистры не меняющие esp? EAX например?
Все что я сделал это загуглил регистры ассемблера, прошелся по оригинальному коду и постарался найти тот который не будет использован и в следствии не будет испорчен.
ESP отвечает за место в стеке?
0
Ethereal
4852 / 1874 / 243
Регистрация: 17.02.2013
Сообщений: 2,787
11.06.2018, 01:52 8
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Может ты бы сначала учебник по ассемблеру почитал.
1
ziqp
125 / 61 / 16
Регистрация: 03.09.2015
Сообщений: 818
11.06.2018, 01:55  [ТС] 9
Прошу прощения. Пошел учить
0
ОС
327 / 80 / 2
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
28.07.2018, 21:55 10
Цитата Сообщение от Mikl___ Посмотреть сообщение
ziqp,
прежде чем вызывать call убедись, что содержимое rsp кратно 16. При возврате в оригинальную функцию убедись, что содержимое rsp кратно 16.
Всегда ли будет крэш, если оставлять достаточно места в стеке перед вызовом? Я думал, что функции просто пишут так, чтобы они сохраняли выравнивание, когда надо занимая лишние 8 байт в стеке.
0
28.07.2018, 21:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2018, 21:55

регистры SI и ESI
есть вопрос по одной функции (14 строка) вот кусочек кода: #include...

Умножение(регистры)
Добрый день выполнял лабу по асм и возникла проблемка с регистрами. Создать...

сегментные регистры
Добрый вечер! Возник вопрос по сегментным регистрам. Вроде бы когда мы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru