Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Estimable
195 / 14 / 1
Регистрация: 02.01.2017
Сообщений: 208

Как распознать переполнение стека в отладчике?

03.03.2018, 14:59. Показов 1268. Ответов 7

Студворк — интернет-сервис помощи студентам
Ни могу понять что за проблема, перед входом в процедуру в стеке два адреса возврата. Потом несколько dword'ов c координатами для функции MoveWindow. Всё идёт хорошо по началу, но как только прохожу функцию MoveWindow стек оказывается сильно задран(как будто он получается сильно выше) что я не могу возвратится по своим адресам.
Прилагаю снимки ollydebug. перед исполнением MoveWindow и после неё. Думал ошибка в самой виндовой функции - попробовал SetWindowPos эффект тот же.
Миниатюры
Как распознать переполнение стека в отладчике?  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2018, 14:59
Ответы с готовыми решениями:

Как можно сделать переполнение стека
Всем привет, ребята, есть у меня код с микрософта, как переполнить стек. Но беда, не понимаю кое что, напишу в комментариях. void...

Как считать много битов из файла, чтобы не было переполнение стека?
Проблема заключается в том, что при использовании стандартных функций read, происходит переполнение стека, а мне очень нужно считать всё и...

Переполнение стека
#include <iostream> using namespace std; int main() { const int n=10; const int m=10; int a, b, i, k; for(i=0; i<n; i++) ...

7
 Аватар для Estimable
195 / 14 / 1
Регистрация: 02.01.2017
Сообщений: 208
03.03.2018, 15:00  [ТС]
----
Миниатюры
Как распознать переполнение стека в отладчике?  
0
653 / 161 / 64
Регистрация: 08.04.2015
Сообщений: 410
03.03.2018, 16:54
Переполнение стека - это немного другое, здесь не оно.

Информация скудная, самой программы нет, так что попробую угадать. В точке останова стек глубже + поменялись регистры, которые функция WinAPI в принципе менять не должна. Вы выловили точно не свой возврат и, скорее всего, вообще не возврат. Функция MoveWindow() посылает окну целую кучу сообщений, причём не Post, а Send, т. е. окно сначала обрабатывает каждое из посланных сообщений, и только потом программа идёт дальше. При одной из обработок срабатывает ваша точка останова. На адрес 401960 можно попасть, например, переходом с адреса 40190A при обработке совершенно другого сообщения.
2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
03.03.2018, 16:56
Наверное есть смысл опубликовать минимальную программу, воспроизводящую ошибку.
1
 Аватар для Estimable
195 / 14 / 1
Регистрация: 02.01.2017
Сообщений: 208
07.03.2018, 08:24  [ТС]
А можно устно? А то счас перелапачивать всё, чтобы отрезать лишнее - очень долго. Скажите как такое может быть, что функция вмешивается в состояние стека? По идее она же просто должна выбрать свои аргументы.
И путает стек функция именно в этом месте программы. Предназначение этой функции здесь переместить окно программы на рабочем столе. Там может быть два сомнительных аргумента, то что координаты не client а screen. И то что некоторые из них отрицательные. Но почему она просто не завершится нулём в eax, если ей не нравятся параметры?
Можно ли это скорректировать отрезав лишнюю часть стека, которая остаётся после MoveWindow?

Добавлено через 5 часов 53 минуты
Короче я туда заплатку поставил:
Assembler
1
2
3
4
5
mov eax,esp;
add eax,24 ;отрезать аргументы функции
mov esp_last,eax;сохранить правильный адрес стека
call MoveWindow@24;сама функция
mov esp,esp_last;восстановить правильный адрес стека
Штука вообще не понятная. Причём в отладчике функция начинает правильно восстанавливать стек ещё не доходя до строки:
Assembler
1
mov esp,esp_last
Добавлено через 51 секунду
Видать всё уходит вглубь этой функции.(
0
653 / 161 / 64
Регистрация: 08.04.2015
Сообщений: 410
07.03.2018, 10:43
Estimable, зачем задавать вопросы, если вы даже не пытаетесь понять ответы?

Ещё раз, другими словами. Оконная функция реентерабельна, на адрес 401960 (сразу после MoveWindow) вы попадаете не возвратом из MoveWindow, а условным переходом с адреса 40190A (или с какого-то ещё, который не вошёл на скрин) при другом обращении к функции. Поэтому не надо удивляться несовпадению ESP и других регистров.
0
 Аватар для Estimable
195 / 14 / 1
Регистрация: 02.01.2017
Сообщений: 208
07.03.2018, 16:35  [ТС]
Увидел там снизу пояснение: jump from 40190a. Попробую затереть эти строки. Это получается что ollydebug не выполняет step forward по f7? Мне как-то привычней было когда пошагово дебагился.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
07.03.2018, 21:26
Цитата Сообщение от Estimable Посмотреть сообщение
Assembler
1
2
3
4
5
mov eax,esp;
add eax,24 ;отрезать аргументы функции
mov esp_last,eax;сохранить правильный адрес стека
call MoveWindow@24;сама функция
mov esp,esp_last;восстановить правильный адрес стека
судя по всему программа на Си написана. в сишных программах стек вызывающая функция чистит, в отличии от паскалевских где чисткой стека занимается вызываемая функция
да еще и оптимизатор поработал
найди книги Криса Касперски: "искусство дизасемблирования", "Фундаментальные основы хакерства"

Добавлено через 2 минуты
Цитата Сообщение от Estimable Посмотреть сообщение
Это получается что ollydebug не выполняет step forward по f7?
может там F10
я уже не помню в разных дебагах мне встречались и F7\F8 и F10\F11
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2018, 21:26
Помогаю со студенческими работами здесь

Переполнение стека
Всем привет. Помогите, пожалуйста с решением одной проблемы. Мне нужно в программе обрабатывать большие объемы текста. 10 000 000 символов....

Переполнение стека
Всем добрый вечер. Я создаю вектор, который имеет большой размер: порядка 256000000. Этот вектор имеет тип float, т.к. функция, куда я...

переполнение стека
Помогите довести программу до ума. Все, что я могла с ней сделать - я уже сотворила. В пятницу сдавать диплом - а программы,...

Переполнение стека
Добрый день! Программа компилируется, работает нормально, но при закрытии выдает ошибку EAccessViolation (скрин во вложении). ...

Переполнение стека
public string XORLP4(string _lpart, string _newextentedbinarytempP4) { int xorlp4 = 0; xorlp4 =...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru