Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
 
Estimable
13 / 13 / 1
Регистрация: 02.01.2017
Сообщений: 133
1

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

03.03.2018, 14:59. Просмотров 356. Ответов 7

Ни могу понять что за проблема, перед входом в процедуру в стеке два адреса возврата. Потом несколько dword'ов c координатами для функции MoveWindow. Всё идёт хорошо по началу, но как только прохожу функцию MoveWindow стек оказывается сильно задран(как будто он получается сильно выше) что я не могу возвратится по своим адресам.
Прилагаю снимки ollydebug. перед исполнением MoveWindow и после неё. Думал ошибка в самой виндовой функции - попробовал SetWindowPos эффект тот же.
0
Миниатюры
Как распознать переполнение стека в отладчике?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2018, 14:59
Ответы с готовыми решениями:

Машинный код в отладчике
.586 .model flat, stdcall _data segment a db 8,9,25,0,8,5 b db 15...

Не меняются данные в отладчике
CSEG segment org 100h _start: mov ah,9 mov dx, offset String int 21h...

В отладчике OllyDbg отображает не ту программу
В masm32 пишу код программы, ассемблирую его. Exe-файл запускаю в отладчике...

Программа работает только в отладчике
С чем может быть связано то, что программа правильно работает только в...

Вопрос загруженности процессора в отладчике
Здраствуйте форумчане!!! У меня возникал этот вопрос каждый раз как я загружал...

7
Estimable
13 / 13 / 1
Регистрация: 02.01.2017
Сообщений: 133
03.03.2018, 15:00  [ТС] 2
----
0
Миниатюры
Как распознать переполнение стека в отладчике?  
UnknownSoldier
592 / 112 / 48
Регистрация: 08.04.2015
Сообщений: 260
03.03.2018, 16:54 3
Переполнение стека - это немного другое, здесь не оно.

Информация скудная, самой программы нет, так что попробую угадать. В точке останова стек глубже + поменялись регистры, которые функция WinAPI в принципе менять не должна. Вы выловили точно не свой возврат и, скорее всего, вообще не возврат. Функция MoveWindow() посылает окну целую кучу сообщений, причём не Post, а Send, т. е. окно сначала обрабатывает каждое из посланных сообщений, и только потом программа идёт дальше. При одной из обработок срабатывает ваша точка останова. На адрес 401960 можно попасть, например, переходом с адреса 40190A при обработке совершенно другого сообщения.
2
ФедосеевПавел
Модератор
3854 / 2175 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
03.03.2018, 16:56 4
Наверное есть смысл опубликовать минимальную программу, воспроизводящую ошибку.
1
Estimable
13 / 13 / 1
Регистрация: 02.01.2017
Сообщений: 133
07.03.2018, 08:24  [ТС] 5
А можно устно? А то счас перелапачивать всё, чтобы отрезать лишнее - очень долго. Скажите как такое может быть, что функция вмешивается в состояние стека? По идее она же просто должна выбрать свои аргументы.
И путает стек функция именно в этом месте программы. Предназначение этой функции здесь переместить окно программы на рабочем столе. Там может быть два сомнительных аргумента, то что координаты не 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
UnknownSoldier
592 / 112 / 48
Регистрация: 08.04.2015
Сообщений: 260
07.03.2018, 10:43 6
Estimable, зачем задавать вопросы, если вы даже не пытаетесь понять ответы?

Ещё раз, другими словами. Оконная функция реентерабельна, на адрес 401960 (сразу после MoveWindow) вы попадаете не возвратом из MoveWindow, а условным переходом с адреса 40190A (или с какого-то ещё, который не вошёл на скрин) при другом обращении к функции. Поэтому не надо удивляться несовпадению ESP и других регистров.
0
Estimable
13 / 13 / 1
Регистрация: 02.01.2017
Сообщений: 133
07.03.2018, 16:35  [ТС] 7
Увидел там снизу пояснение: jump from 40190a. Попробую затереть эти строки. Это получается что ollydebug не выполняет step forward по f7? Мне как-то привычней было когда пошагово дебагился.
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,937
07.03.2018, 21:26 8
Цитата Сообщение от 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
07.03.2018, 21:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2018, 21:26

В отладчике ollydbg отображается не вся программа
Всем привет. Сразу к делу. Я новичок в программировании на асме. Пишу банально...

В отладчике DEBUG создать и выполнить ассемблерную программу
1. С помощью отладчика DEBUG создать и выполнить ассемблерную программу,...

Как описать содержимое стека?
Как описать изменение содержимого стека и регистра sp после выполнения каждой...


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

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

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