Код (Text): _imp__NtRaiseHardError proto ErrorStatus:NTSTATUS, \ NumberOfParameters:ULONG, \ UnicodeStringParameterMask:ULONG, \ Parameters:PVOID, \ ValidResponseOptions:ULONG, \ Response:PULONG MSGBOX macro TitleU, TextU push MB_OK push TitleU push TextU mov ecx,esp push eax ; Response. push esp push 0 push ecx mov eax,dword ptr [_imp__NtRaiseHardError] push 3 push 3 mov eax,dword ptr [eax + 1] push STATUS_SERVICE_NOTIFICATION mov edx,esp Int 2Eh mov eax,dword ptr [esp + 4*6] add esp,4*10 endm Както так
Так все значительно проще. Вместо invoke класть просто всё в стек, и вызвать MessageBox через call. It's terrible!
Здравствуйте. Код (Text): .386 .model flat includelib ntdll.lib extern _imp__NtRaiseHardError@24:dword .code start: push 0 push 0 push 0 mov ecx,esp push eax push esp push 0 push ecx mov eax,_imp__NtRaiseHardError@24 push 3 push 3 mov eax,[eax+1] push 40000018h mov edx,esp int 2eh mov eax,[esp+24] add esp,40 ret end start Окно messagebox не отображается на экране. Ось windows xp 32-bit.
gale, посмотри Сказки дядюшки Римуса о x64 → Глава шестая. Братец Кролик выводит MessageBox всеми возможными способами. Там есть вариант с NtRaiseHardError, правда для x64 и еще куча способов как вывести на экран MessageBox
Мне не нужна куча способов. Мне нужен один способ: в windows xp 32-bit с помощью вызова функции NtRaiseHardError отобразить на экране окно MessageBox.
Код (ASM): .686P .model flat include windows.inc include ntstatus.inc .code start: xor eax,eax sub esp,((Num+Num1)*2+3) and 0FFFFFFFCh;временный буфер под TitleText ;и MessageText делаем кратным 4 lea edi,[esp];lea edi,MessageBuffer mov esi,offset MessageText mov ecx,Num+Num1 @@: lodsb;TitleText и MessageText в буфер stosw loop @b ; заполняем UNICODE_STRING (первый параметр) sub edi,Num1*2 push edi;указатель на TitleText в буфере push (Num1-1)*20002h+2 ; заполняем UNICODE_STRING (второй параметр) sub edi,Num*2 push edi;указатель на MessageText в буфере push (Num-1)*20002h+2 ; третий параметр, содержащий uType для MessageBox push MB_ICONASTERISK or MB_OK sub edi,8 push edi;указатель на UNICODE_STRING, указывающую на TitleText в буфере sub edi,8 push edi;указатель на UNICODE_STRING, указывающую на MessageText в буфере sub edi,0Ch; три параметра по 4 байта push offset x;куда функция запишет выбранный юзером ответ (если тип, ;переданный в следующем параметре, предполагает выбор ответа пользователем) push ecx;0; варианты ответов push edi;указатель на массив параметров push 3;общее число параметров push 00000011b;маска, единичные биты которой соответствуют тем ;параметрам, которые имеют тип PUNICODE_STRING, а нули - остальным параметрам mov al,0B6h;ID NtRaiseHardError для WinXP push STATUS_SERVICE_NOTIFICATION;статус ошибки mov edx,esp int 2Eh add esp,((Num+Num1)*2+3) and 0FFFFFFFCh +13*4;удаляем буфер и чистим ;стек от переданных параметров retn .data MessageText db 'Win32 Assembly with MASM is Great!',0 Num = $-MessageText TitleText db 'Iczelion Tutorial #2:MessageBox',0 Num1 = $-TitleText x dd 0 end start
Mikl___, ошибка в скобках. Код (ASM): add esp,((Num+Num1)*2+3 and 0FFFFFFFCh)+13*4 Всё было бы хорошо, если б не одно но: при запуске, когда появляется окно, первые 2 секунды курсор мыши в виде стрелки и песочных часов (OCR_APPSTARTING).
gale, нет никакой ошибки, Код (ASM): Num+Num1 <-- длина строк в Char (Num+Num1)*2<-- длина строк в WChar (((Num+Num1)*2+3) and 0FFFFFFFCh) <-- к числу кратному 4 +13*4 <-- чистим стек от переданных параметров
gale А для чего вам ? Вывод таким способом сообщений нужен в очень спец. случаях. Этот сервис выводит статусный код ошибки без необходимости подгрузки гуя(gui). В примере выше который должен бсодить не эксплойт, а соотв. управляющий код. Если сервис не работает, то необходимо посмотреть статусный код. Тем более что интерфейс сервисный, есть прототипы их вызова. Или это копипаста?