eXeL@B —› Программирование —› Реверсинг диалога о завершении работы Windows |
Посл.ответ | Сообщение |
|
Создано: 14 июня 2012 15:52 · Личное сообщение · #1 Всем хай. Ситуация следующая, Windows XP SP3, в течении некоторого времени пытаюсь отреверсить и воспроизвести функционал меню Пуск -> Завершение работы. Т.е. хочу создать такой диалог программно. После определённого исследования (всего исследования я уж не помню, буду описывать то, что ещё помнится) удалось выяснить, что в explorer.exe подгружается msgina.dll, потом по ординалу ищется и вызывается функция под номером 16 (10h). Внутри этой функции CreateWindowExW создаёт окно, потом после ShowWindow моё приложение ведёт себя странно, а explorer.exe - адекватно. Т.е. эксплорер отображает окно, а мой софт, в случае, если пашет под Olly - вешает систему (выходом является нажатие Ctrl+Alt+Del и завершение процесса отладчика). Без отладчика софт просто не отображает окно, но система не вешается. В дебаггере решил ресёрчить причину. Т.к. перед созданием окно вызывается RegisterClassExW, отсюда можно определить lpfnWndProc, определил - это CDimmedWindow__WndProc. Поставил на него бряк, последний (перед зависанием) бряк показал, что обрабатывается сообщение WM_WINDOWPOSCHANGING. Вышел я из этой CDimmedWindow__WndProc, дотопал до XyCallbackReturn, а потом (собственно, как и описывается Пробовал зайти с другой стороны, запускал оконное приложение, через Spy++ отслеживал очередь сообщений, и смотрел, что произойдёт после отображения пресловутого окна. Так вот пока окно активно - очередь пуста (может, она не пуста, просто строки в эдите Spy++ появляются только после того, как отмену нажать), а как только нажимаю отмену, то множество сообщений сразу передаются оконной процедуре. Первым из них обрабатывается WM_SYNCPAINT. Так вот я в своём оконном софте сделал так, чтоб при обработке этого сообщения моя софтина просто входила бы в бесконечный цикл, но это не повесило систему, значит моя догадка о том, что при создании этого окна о завершении работы система рассылает некие сообщения топ-левел окнам, неверна. Да, рассылка происходит, но при выборе какого-то из пунктов (перезагрузка, завершение работы), но не при отрисовке окна выбора. А началось всё с того, что на одном из компов этот диалог завершения работы перестал отображаться. Причём эффект тот же, что и для моей самописной софтины - попытка завершения работы вешает систему. WTF? Натолкните на мысль, что бы ещё можно бы такое сделать/посмотреть/поресёрчить и как, а то уже идеи закончились. Проект на 2010 студии прикладываю, где моё приложение вызывает зависание под олькой, и завершается без неё, но не рисует диалог. 4098_14.06.2012_EXELAB.rU.tgz - GinaTest.rar ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 14 июня 2012 17:01 · Поправил: mdscorp · Личное сообщение · #2 |
|
Создано: 14 июня 2012 17:03 · Личное сообщение · #3 возможно, чуть не в тему из своих экспериментов я помню, что этот диалог открывается также, если послать WM_CLOSE окну с заголовком "Program Manager" и классом "Progman" btw. а в чём суть исследования? вернуть на поврежденный комп диалог завершения работы? или просто сымитировать функционал оригинального диалога? | Сообщение посчитали полезным: TLN |
|
Создано: 14 июня 2012 17:15 · Личное сообщение · #4 |
|
Создано: 14 июня 2012 20:11 · Личное сообщение · #5 Возможно, система не вешается, а пытается отобразить какой-то диалог и не может это сделать. Вообще подозреваю, что DimmedWindow берет текущую картинку десктопа, а потом в ней палитру крутит в сторону обесцвечивания. Соответственно, если это не десктоп, а статик картинка, то ничего программа отобразить не сможет. Тем более через ГУЙ, который остановлен в это время. |
|
Создано: 14 июня 2012 21:26 · Поправил: ARCHANGEL · Личное сообщение · #6 Ответы по порядку. mdscorp Написать софт, который бы также вызывал ExitWindowsEx - не проблема, и тут можно обойтись без rundll32.exe, тем более, что так как вы указали - работать не будет, ибо надо указать имя_либы имя_функи в качестве параметров, но я вас понял. Интерес именно знать, почему вдруг стандартный диалог перестал работать. -=AkaBOSS=- пишет: из своих экспериментов я помню, что этот диалог открывается также, если послать WM_CLOSE окну с заголовком "Program Manager" и классом "Progman" Да, но только потом произойдёт всё тоже самое - explorer подгрузит msgina.dll и начнётся та же канитель. Flint пишет: У Руссиновича почитайте главу 4 "Запуск и завершение работы системы" Читал, но там не то, ибо там описывается, что происходит при завершении работы системы, а мне нужно знать, что происходит при отрисовке предложения о завершении работы, т.е. если вывелось это окно, то я могу и не завершать работу - нажму "отмена" и дальше буду работать, и завершения не произойдёт. yagello Вот и я так подумал. Поэтому стал трейсить функцию с ординалом 16. В ней CreateWindowEx завершается норм, куда дальше смотреть - я не догадался пока. Но у вас так много идей, не подскажете, как оно может "крутить палитру в сторону обесцвечивания", а я попробую это проверить. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 14 июня 2012 22:12 · Личное сообщение · #7 |
|
Создано: 14 июня 2012 22:25 · Поправил: neomant · Личное сообщение · #8 |
|
Создано: 15 июня 2012 00:33 · Поправил: Hexxx · Личное сообщение · #9 Имхо надо курить И диалог не выводится скорее всего из-за того, что какие-то настройки джины накрылись. Или поставили какую-то хрень для аутентификации, которая мешает работе джины. Отладку джины надо делать установив специальные ключи в реестре, там не все так просто, иначе вешаться будет. ----- Реверсивная инженерия - написание кода идентичного натуральному |
|
Создано: 15 июня 2012 00:34 · Личное сообщение · #10 neomant пишет: Как то странно, что функа получает указатели на два нулевых дворда. На такую мысль натолкнули два вызова IsBadWritePtr в начале функции, где ucb был равен 4. Но ещё посмотрю - может, высмотрю что-то. ajax Пока не нашёл там ничего полезного. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 15 июня 2012 10:21 · Личное сообщение · #11 ARCHANGEL Большая часть функций есть в MSDN, есть исходники msgina, к чему реверс? В атаче сурсы, грузи dll в IDA, грузи PDB и сравнивай с исходниками ибо я никогда сам не интересовался вызовом этого диалога, ибо он мне не нужен, так что мне лень для тебя искать. 1c1c_15.06.2012_EXELAB.rU.tgz - gina.rar |
|
Создано: 15 июня 2012 11:32 · Поправил: ARCHANGEL · Личное сообщение · #12 F_a_u_s_t Такие сорцы я видел в составе пака сорцов Windows 2000, но, несмотря на то, что папка называется gina, сорцов самой джины там нет, есть только winlogon.exe и userenv.dll. Не знаю, правильно ли я понял содержимое MSDN, но, похоже, аналогичный диалог должен вызваться при обращении к WlxActivateUserShell. В описании меня смущают такие строки: Before calling WlxActivateUserShell, Winlogon sets the desktop state so that the current desktop is the Winlogon desktop and sets the workstation state so that the desktop is locked. Т.е. если этого не сделать, может ли происходить такое зависание? Hexxx Прочитал про отладку джины ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 15 июня 2012 11:51 · Поправил: F_a_u_s_t · Личное сообщение · #13 ARCHANGEL В исходниках есть часть wlx функций. Судя по написанному может виснуть, сам не сталкивался. Вот что ахтунги с microsoft советуют юзать, сам не пробовал. Add: Посмотрел твой семпл... ShellDimScreen эта функа дает только эффект затенения, она ничего не выключает. |
|
Создано: 15 июня 2012 12:21 · Личное сообщение · #14 |
|
Создано: 15 июня 2012 14:01 · Личное сообщение · #15 |
|
Создано: 15 июня 2012 14:20 · Поправил: F_a_u_s_t · Личное сообщение · #16 typedef HRESULT (__stdcall *ShellDimScreen) (IUnknown* *Unknown, HWND* hWindow); HMODULE _ShellDimScreen(HWND hWindow) { HMODULE Dll = LoadLibraryA("msgina.dll"); if (Dll != NULL) { IUnknown* Unknown; ShellDimScreen Func = (ShellDimScreen) GetProcAddress(Dll,(LPSTR) 16); Func(&Unknown, &hWindow); return Dll; } else return NULL; } Add: Надо было сразу уточнить. Ждемс новый винлокер. Скомпиленный семпл. 335e_15.06.2012_EXELAB.rU.tgz - GinaTest.rar | Сообщение посчитали полезным: ==DJ==[ZLO], ARCHANGEL, Flint |
|
Создано: 15 июня 2012 14:56 · Поправил: ARCHANGEL · Личное сообщение · #17 F_a_u_s_t Вау, какой эффект Блин, прав был neomant - надо было мне больше ресёрчить эту #16, и там действительно не указатели на два нулевых дворда. Ладно, буду разбираться. Но, что интересно, этот эффект серости возникает только если я не дебажу софт отладчиком (OllyDbg). Под дебаггером стабильно вешает все приложения. Но это уже что-то. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 15 июня 2012 15:02 · Личное сообщение · #18 |
|
Создано: 15 июня 2012 15:22 · Личное сообщение · #19 F_a_u_s_t пишет: Ждемс новый винлокер. Code:
)) ----- Nulla aetas ad discendum sera |
|
Создано: 15 июня 2012 18:56 · Поправил: F_a_u_s_t · Личное сообщение · #20 Flint Зачет. ARCHANGEL Тут знакомый семпл подкинул (где то подобрал на просторах интронета) там этот эффект реализован без зависимости от msgin, будет работать и на XP и на Seven. Код на Delphi но WinApi так что с переводом проблем не будет. Даешь винлокеры с поддержкой скинов пролетариату. Add: Атач забыл. 4e18_15.06.2012_EXELAB.rU.tgz - Attach.rar |
|
Создано: 15 июня 2012 19:04 · Личное сообщение · #21 |
|
Создано: 15 июня 2012 19:14 · Личное сообщение · #22 |
|
Создано: 18 июня 2012 13:00 · Поправил: ARCHANGEL · Личное сообщение · #23 F_a_u_s_t Смотрел я на ваш пример, сделал свой, вроде бы, один в один, а не работает. Не подскажете, что не так? А к локерам мои изыскания никаких отношений не имеют, ибо я не пытаюсь его (локер) написать, и не пытаюсь после него восстанавливать систему. Добавлено Уже и так делал: Code:
----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 18 июня 2012 13:26 · Личное сообщение · #24 ARCHANGEL Code:
Мой семпл, в написании использовался самопальный класс типа mfc ну думаю суть поймешь. Code:
У тебя просто нет задержки, оно срабатывает и сразу закрывается, делай или в цикле обработки сообщений или перед ним. | Сообщение посчитали полезным: ARCHANGEL |
|
Создано: 18 июня 2012 13:47 · Личное сообщение · #25 |
|
Создано: 18 июня 2012 14:01 · Личное сообщение · #26 |
|
Создано: 20 июня 2012 11:29 · Личное сообщение · #27 В ходе изучения проблемы выяснилась следующая, весьма интересная, ситуация. При выключении компьютера диалог Завершения работы не то, чтоб не создавался, а создавался очень долго - появления этого диалога можно ожидать минутами. В ходе поиска в гугле, ресёрча с дизассемблером и активной помощи F_a_u_s_t была проведена аналогия с диалогом ShellShutdownDialog, и ситуация - идентичная. Проблема оказалась в функции WUCheckForUpdatesAtShutdown, знаете, иногда возникает такая ситуация, что перед выключением система предлагает установить обновления, и уже только потом выключить комп, либо же не устанавливать апдейты и выйти. Вот эта функа и проверяет, есть ли такие апдейты, которые следует установить. Внутри неё торможение происходит при вызове CoCreateInstance, и вообще жутко тормозит любая работа с COM - объектами. Что самое интереное, так это то, что всё неизменно тормозит на ZwRequestWaitReplyPort, и тут возникает вопрос - возможна ли такая ситуация, что проблема кроется ни в COM-интерфейсах и объектах, а в RPC или же LPC? И что по этому поводу можно почитать? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 20 июня 2012 11:35 · Личное сообщение · #28 |
|
Создано: 20 июня 2012 13:34 · Личное сообщение · #29 А решение проблемы было (и есть) ----- Stuck to the plan, always think that we would stand up, never ran. |
eXeL@B —› Программирование —› Реверсинг диалога о завершении работы Windows |