ExRaiseHardError и Windows 7

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 30 апр 2009.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Почему ты так решил?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это ведь GUI. Оно не юзабельно, глючит постоянно и пр. Я не реверсил есчо тот ядерный сервис, но думаю это всеголишь простой запрос на порт, судя по сурцам(там иначе как в XP).
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. MAXIMUM_HARDERROR_PARAMETERS    equ 7
    2.  
    3. HARDERROR_MSG struct
    4. Header              PORT_MESSAGE <>
    5. Status              NTSTATUS ?
    6. ErrorTime           LARGE_INTEGER <>
    7. ValidResponseOptions        ULONG ?
    8. Response            ULONG ?
    9. NumberOfParameters      ULONG ?
    10. UnicodeStringParameterMask  ULONG ?
    11. Parameters          ULONG MAXIMUM_HARDERROR_PARAMETERS DUP (?)
    12. HARDERROR_MSG ends
    13. PHARDERROR_MSG typedef ptr HARDERROR_MSG
    14.  
    15. HARDERROR_MSG_OVERHEAD  equ (sizeof(HARDERROR_MSG) - sizeof(PORT_MESSAGE))
    16. HARDERROR_API_MSG_LENGTH        equ (sizeof(HARDERROR_MSG)*10000h) or (HARDERROR_MSG_OVERHEAD)
    17.  
    18. Local Message:HARDERROR_MSG
    19.     invoke KeQuerySystemTime, addr Message.ErrorTime
    20.     mov dword ptr [Message.Header.DataSize],HARDERROR_API_MSG_LENGTH
    21.     mov Message.Header.MessageType,LPC_ERROR_EVENT
    22.     mov Message.ValidResponseOptions,0
    23.     mov Message.NumberOfParameters,0
    24.     mov Message.UnicodeStringParameterMask,0
    25.     mov Message.Response,OptionOk
    26.     mov Message.Status,STATUS_SUCCESS
    27.     invoke PsGetCurrentProcess
    28.     mov edx,EPROCESS.ExceptionPort[eax]
    29.     invoke LpcRequestWaitReplyPort, edx, addr Message, addr Message
    Это запрос на порт, потом csrss мессагу забоксит, сюда и сводится ExRaiseHardError().
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Добавлю что порт устанавливает csrss из CsrCreateProcess() при нотификации, которая при создании нового процесса выполняется из юзермода. Если процесс создан средствами RtlCreateUserProcess(), то этот порт не установлен.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Это ты к чему? Добавил бы пояснения хоть строчку)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    *Дабавлю
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Грит, подправь там пост.
    Это запрос на порт, потом csrss мессагу забоксит, сюда и сводится ExRaiseHardError().
     
  8. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Не знаю мож кому понадобится взял за основу код Great ну и дописал маленько чтобы можно было пользоваться как MessageBox-ом
    Код (Text):
    1. ULONG KernelMessageBox(IN PWSTR pwText,
    2.                        IN PWSTR pwCaption,
    3.                        IN int  uType
    4.                       )
    5. {
    6. NTSTATUS Status;
    7. UNICODE_STRING Mes,Title;
    8. ULONG Response = 0;
    9. RtlInitUnicodeString (&Mes, pwText);
    10. RtlInitUnicodeString (&Title,pwCaption);
    11. ULONG_PTR Param[3];
    12. Param[0]=(ULONG_PTR)&Mes;
    13. Param[1]=(ULONG_PTR)&Title;
    14. Param[2]=uType;
    15. Status = ExRaiseHardError (
    16. STATUS_SERVICE_NOTIFICATION ,
    17. 3,
    18. 3,
    19. &Param,
    20. NULL,
    21. &Response
    22. );
    23. return Response;
    24. }
    Ну и h файлик сдернутый с Winuser.h
    Код (Text):
    1. #define MB_OK                       0x00000000L // answer was 6
    2. #define MB_OKCANCEL                 0x00000001L // answer ok-6  Отмена -3
    3. #define MB_ABORTRETRYIGNORE         0x00000002L // answer Прервать-2 Повторить-7 Пропустить -4
    4. #define MB_YESNOCANCEL              0x00000003L // answer да-8 Нет-5 Отмена -3
    5. #define MB_YESNO                    0x00000004L // answer да-8 Нет-5
    6. #define MB_RETRYCANCEL              0x00000005L // answer Повторить-7 Отмена-3
    7. #define MB_CANCELTRYCONTINUE        0x00000006L // answer Отмена-3 Попторить поп -9 Продолжить-10
    8. #define MB_ICONHAND                 0x00000010L
    9. #define MB_ICONQUESTION             0x00000020L
    10. #define MB_ICONEXCLAMATION          0x00000030L
    11. #define MB_ICONASTERISK             0x00000040L
    12. #define MB_USERICON                 0x00000080L
    13. #define MB_ICONWARNING              MB_ICONEXCLAMATION
    14. #define MB_ICONERROR                MB_ICONHAND
    15. #define MB_ICONINFORMATION          MB_ICONASTERISK
    16. #define MB_ICONSTOP                 MB_ICONHAND
    17. #define MB_DEFBUTTON1               0x00000000L
    18. #define MB_DEFBUTTON2               0x00000100L
    19. #define MB_DEFBUTTON3               0x00000200L
    20. #define MB_DEFBUTTON4               0x00000300L
    21. #define MB_APPLMODAL                0x00000000L
    22. #define MB_SYSTEMMODAL              0x00001000L
    23. #define MB_TASKMODAL                0x00002000L
    24. #define MB_HELP                     0x00004000L
    25. #define MB_NOFOCUS                  0x00008000L
    26. #define MB_SETFOREGROUND            0x00010000L
    27. #define MB_DEFAULT_DESKTOP_ONLY     0x00020000L
    28. #define MB_TOPMOST                  0x00040000L
    29. #define MB_RIGHT                    0x00080000L
    30. #define MB_RTLREADING               0x00100000L
    вызов обыкновенно как MessageBox

    Код (Text):
    1. ret = KernelMessageBox(L"Привет из Ring-0",L"hellow",MB_OKCANCEL|MB_ICONSTOP);
    2. if (ret==6)
    3. {
    4. DbgPrint("Ок");
    5. }
     
  9. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    И как оказалось на Win7 x64 тоже не работает ;)
     
  10. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Если, кто незнал где взять GetTaskmanWindow() ниже код работает:)

    Код (Text):
    1. user32dll db "user32.dll",0
    2. hUser32 dd ?
    3. GetTaskmanWindow dd ?
    4. szGetTaskmanWindow db "GetTaskmanWindow",0
    5.  
    6. MsgName CHAR "HardError",0
    7.  
    8. .code
    9. Entry proc
    10. Local Result:ULONG
    11.     invoke RegisterWindowMessage, addr MsgName
    12.     mov MessageId,eax
    13.     ;invoke GetTaskmanWindow        ;'MSTaskSwWClass'
    14.     invoke GetModuleHandle, addr user32dll
    15.     mov hUser32, eax
    16.     test eax, eax
    17.     jz _end
    18.     invoke GetProcAddress, hUser32, addr szGetTaskmanWindow
    19.     mov GetTaskmanWindow, eax
    20.  
    21.     call GetTaskmanWindow
    22.    
    23.     mov edx,eax
    24.     invoke SendMessageTimeout, edx, WM_COPYDATA, 0, addr MessageId, SMTO_NORMAL or SMTO_ABORTIFHUNG, 3000, addr Result
    25. _end:
    26.     ret
    [​IMG]
     
  11. reader323

    reader323 New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    134
    А между тем решения проблемы топикстартера что-то нет...
     
  12. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    JCronuz
    Из r0?)
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Создайте наконец поток обычный пользовательский и вызовите из него MessageBox() ;)
     
  14. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Так всем ведь код нужен как это правильно сделать ;)
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Как раз таки создать юзермодный поток проблем не составляет. Зарегистрировать у csrss, в принципе, тоже.
    Надо лишь вызвать csrsrv!CsrCreateRemoteThread()
     
  16. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    А еще лучше под Linux
     
  17. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    MessageBox создаётся нормально, а вот при вызове некоторых других функций шелл код вылетает, пока не пойму почему


    Код (Text):
    1. void sc() {
    2.  
    3.     STARTUPINFO si;
    4.     PROCESS_INFORMATION pi;
    5.    
    6.     ULONG               hUser32;
    7.     ULONG               hKernel32;
    8.     funcLoadLibraryA    fLoadLibraryA;
    9.     funcMessageBoxA     fMessageBoxA;
    10.     funcExitThread      fExitThread;
    11.     funcwsprintfA       fwsprintfA;
    12.     funcCreateProcessA  fCreateProcessA;
    13.     funcGetLastError    fGetLastError;
    14.     funcExitProcess     fExitProcess;
    15.    
    16.     char    user32name[] = {'U','s','e','r','3','2','.','d','l','l','\0'};
    17.     char    wsprintfAname[] = {'w','s','p','r','i','n','t','f','A','\0'};
    18.     char    format[] = {'%','p',' ','%','p',' ','%','p','\0'};
    19.     char    str[0xff];
    20.    
    21.     PSC_DATA sc_data;
    22.     ULONG    len;
    23.    
    24.     __asm mov sc_data, eax 
    25.  
    26.     hKernel32 = GetKernel32();
    27.    
    28.     fExitProcess = (funcExitProcess) GetProcAddrEx(hKernel32, hExitProcess);
    29.     fExitThread =     (funcExitThread)    GetProcAddrEx(hKernel32, hExitThread);
    30.     fLoadLibraryA =   (funcLoadLibraryA)  GetProcAddrEx(hKernel32, hLoadLibraryA);
    31.     fCreateProcessA = (funcCreateProcessA)GetProcAddrEx(hKernel32, hCreateProcessA);
    32.     fGetLastError =   (funcGetLastError)  GetProcAddrEx(hKernel32, hGetLastError);
    33.    
    34.    
    35.     hUser32 = fLoadLibraryA(user32name);
    36.    
    37.     fwsprintfA =   (funcwsprintfA)   GetProcAddrEx(hUser32, CalcHash(wsprintfAname) );
    38.     fMessageBoxA = (funcMessageBoxA) GetProcAddrEx(hUser32, hMessageBoxA);
    39.    
    40.     fwsprintfA(str,format, fCreateProcessA, fExitThread, fExitThread);//ok
    41.  
    42.     fMessageBoxA(0, str, str, 1);//ok, fCreateProcessA fExitThread fExitThread верные
    43.     fMessageBoxA(0, wsprintfAname, wsprintfAname, 1);//ok
    44.    
    45.     __stosb(&si, 0, sizeof(STARTUPINFO));
    46.  
    47.     //тут летит
    48.     fCreateProcessA(NULL, sc_data->cmdline, 0, 0, FALSE, 0, 0, 0, &si, &pi);
    49.            //fGetLastError(); //так тоже летит
    50.            //fExitThread(); //так тоже летит
    51.  
    52.  
    53.     fExitThread(0);//ok
    54.  
    55. }
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Там есть сервис который поток и создаёт, на XP(в сёмке не знаю), но нужен ведь только контекст, среда окружения не нужна сначала, тоесть достаточно нативного треда, а дальше можно заюзать CreateThread(), функа сама зарегает поток у csrss(хотя всё можно вручную заюзать).
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    prorok
    http://www.wasm.ru/forum/viewtopic.php?id=32181
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    Да, о чем и речь. Создать нативный поток в csrss и вызвать нужный экспорт csrsrv.dll. Процесс/поток зарегистрируется