Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Нарушение стека в RunDll32. Что плохого случится?

07.03.2016, 21:00. Показов 675. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Почитал статью от Raymond Chen What can go wrong when you mismatch the calling convention? .

Я ее немного переведу:
___________________________________

Точки входа Rundll32.exe

При вызове функции с помощью rundll32.exe необходимо, чтобы она имела особый прототип, задокументированный в этой MSKB. Но это не останавливает людей от использования rundll32 для вызова самых различных функций, которые не были разработаны для вызова через rundll32, подобно LockWorkStation или ExitWindowsEx из user32.

Давайте разберемся, что произойдет, если попробовать вызвать rundll32.exe для выполнения функции такой, как ExitWindowsEx:

rundll32 парсит свою командную строку и вызывает функцию ExitWindowsEx, предполагая, что она объявлена подобно этому:
C++
1
2
void CALLBACK ExitWindowsEx(HWND hwnd, HINSTANCE hinst,
       LPSTR pszCmdLine, int nCmdShow);
Но это не так. И на самом деле функция имеет такой прототип:

C++
1
BOOL WINAPI ExitWindowsEx(UINT uFlags, DWORD dwReserved);
Что же произойдет? Итак, на входе в ExitWindowsEx, стек выглядит примерно так:

Code
1
2
3
4
5
6
... остальная часть стека ...
nCmdShow    
pszCmdLine  
hinst   
hwnd    
return address  <- ESP
Однако, функция ожидает увидеть:

Code
1
2
3
4
... остальная часть стека ...
dwReserved  
uFlags  
return address  <- ESP
Что происходит? hwnd, который передается к rundll32.exe ошибочно воспринимается как uFlags, а hinst - как dwReserved. Поскольку хендлы окон псевдослучайны, Вы в конечном итоге передаете случайные флаги для ExitWindowsEx. Возможно, сегодня это EWX_LOGOFF, завтра - EWX_FORCE, а в следующий раз это может быть EWX_POWEROFF.

Теперь предположим, что собирается произойти возврат из функции. (Например, неудачный выход из системы).
Функция ExitWindowsEx очищает 2 параметра в стеке, не зная, что было передано 4. Результирующий стек будет таким:

Code
1
2
3
... остальная часть стека ...
nCmdShow    (не очищающийся мусор)
pszCmdLine  <- ESP (не очищающийся мусор)
Теперь стек нарушен и происходят действительно забавные вещи. Например, предположим, что на месте, где "... остальная часть стека ..." находится адрес возврата. Итак, оригинальный код собирается выполнить инструкцию "ret", чтобы вернуться по указанному адресу. Но с этим поврежденным стеком, инструкция "ret" вместо этого вернется к командной строке и попытается выполнить ее, как будто она является кодом.
__________________________________

Собственно, мне интересно всего лишь, чем это грозит для рядового приложения, которое вызывает rundll32. Ясно, что rundll32 может "упасть" от такой попытки вернуться по некорректному адресу. Есть ли другие опасности?
(это чисто академический интерес)

Добавлено через 23 минуты
GunSmoker оказывается уже перевел.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.03.2016, 21:00
Ответы с готовыми решениями:

Что случится если ManualReset пoменять на AutoReset?
что случится в программе, если manualReset пoменять на autoReset?

Что случится если функция is executed и precondition для этой функции is not met?
Доброго всем времени суток!!! Возник вопрос: Что случится если функция is executed и precondition для этой функции is not met? ...

Может так случится, что процесс приема новых сообщений и их прорисовки превратится в бесконечный цикл?
Допустим у меня есть приложение, которое добавляет в себя поступающие сообщения. А эти сообщения сыпят постоянно. Может так случится,что...

1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
08.03.2016, 12:27
Rundll32 может упасть. Она может "зациклиться" и тогда родительский процесс
никогда не дождется ее завершения. Она может вернуть "странный" код выхода.
Если Rundll32 вызвана с правами администратора, то, в теории, может произойти
вообще все что угодно, вплоть до форматирования системного диска
Хотя вероятность такого развития событий очень маленькая. Просто как звезды станут...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.03.2016, 12:27
Помогаю со студенческими работами здесь

Что плохого в явном написании условия в if?
Вы не погорячились? что такого плохого в if (a==0) или if (a==false) ?

Что плохого в 2 partial classes в одном файле?
Приложение запускается правильно, а Конструктор ругается Зачем namespace WindowsFormsApplication9 { public partial class...

Объясните мне, что же такого плохого в goto?
Виталян, открой спойлер! #include &lt;iostream&gt; #include &lt;ostream&gt; using namespace std; int matrix, i, j, a, b, dlin, vis,...

что плохого если я делаю ф-ю main типа void
привет всем, кто может объяснить, что плохого если я делаю ф-ю main типа void ?

При перекомпиляции сервера перекомпилируется клиент, а что, собственно в этом плохого?
Друзья! Начинаем цикл вопросов про COM- Объекты. Первый вопрос возник по статье Безверхова, вот здесь статья. Вот там такой пример: ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru