Статья Маскируем и вызываем MessageBox, не используя библиотеку user32.dll

  • 5
  • 8
Контакты для связи отсутствуют.
=========================================================

Все опыты проводились на Windows 10 x64 21H1 (Сборка ОС 19043.906) – процессор Intel

Подопытный: PE-файл

=========================================================
Всем привет. Недавно ковырял последний вмпрот, и мне стало интересно, почему он не брякается ни на какую функцию, о которой я знал, связанной с MessageBox'ом. После нескольких часов, я все таки нашел, где зарыта собака. Оказывается, MessageBox вызывается прямо из ядра недокументированной функцией.
PS: этот трюк добавился с где-то с 1261 версии. Но т.к. я нечаянно перезаписал старый билд новым вмпротом, а теперь не могу нигде найти 1261-1263 билд (кстати, я все еще ищу его, думаю, намёк понятен, заранее спасибо).
И вот я сделал небольшой сэмпл, как можно это воспроизвести. Кстати, я не знаю, как это будет вести себя на Windows 7, 8, XP и т.д. Поэтому если кто-то может протестировать и отписать результаты, буду благодарен.
C++:
#include <windows.h>
#include <winternl.h>

#pragma comment(lib, "ntdll.lib")

extern "C" NTSTATUS NTAPI ZwRaiseHardError(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask,
    PULONG_PTR Parameters, ULONG ValidResponseOptions, PULONG Response);

int main()
{
    UNICODE_STRING msgBody;
    UNICODE_STRING msgCaption;

    ULONG ErrorResponse;

    RtlInitUnicodeString(&msgCaption, L"Message");
    RtlInitUnicodeString(&msgBody,  L"Hello from kernel");

    const ULONG_PTR msgParams[] = {
        (ULONG_PTR)&msgBody,
        (ULONG_PTR)&msgCaption,
        (ULONG_PTR)(MB_OK | MB_ICONWARNING)
    };

    ZwRaiseHardError(0x50000018L, 0x0000003L, 3, (PULONG_PTR)msgParams, NULL, &ErrorResponse);
}
1.png
Также, если кому-то интересно, то заместо вызовов RtlInitUnicodeString(...) можно сделать аналог, без winapi вызовов, а также в ассемблерном коде заменить на прямой системный вызов(SYSCALL, у меня он равен 0x167, но имейте ввиду, что в бинарь вшивается номер системного вызова, который меняется со временем от версии к версии windows!) Всё это нужно, дабы не отследить бряками на ntdll
). Немного трюков:
C++:
#include <windows.h>
#include <winternl.h>

#pragma comment(lib, "ntdll.lib")

extern "C" NTSTATUS NTAPI ZwRaiseHardError(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask,
    PULONG_PTR Parameters, ULONG ValidResponseOptions, PULONG Response);

int main()
{
    UNICODE_STRING msgBody;
    UNICODE_STRING msgCaption;

    ULONG ErrorResponse;

    static const wchar_t cBody[] = L"Hello from kernel";
    msgBody.Length = sizeof(cBody) - sizeof(wchar_t);
    msgBody.MaximumLength = msgBody.Length;
    msgBody.Buffer = (wchar_t*)cBody;

    static const wchar_t cCaption[] = L"Message";
    msgCaption.Length = sizeof(cCaption) - sizeof(wchar_t);
    msgCaption.MaximumLength = msgCaption.Length;
    msgCaption.Buffer = (wchar_t*)cCaption;

    const ULONG_PTR msgParams[] = {
        (ULONG_PTR)&msgBody,
        (ULONG_PTR)&msgCaption,
        (ULONG_PTR)(MB_OK | MB_ICONWARNING)
    };

    ZwRaiseHardError(0x50000018L, 0x00000003L, 3, (PULONG_PTR)msgParams, NULL, &ErrorResponse);
}
2.png
Результат:
3.png
 
Последнее редактирование:
  • 28
  • 3
  • 42
VirtualBoxVM_Az2UWGXIof.png

На Windows 7 полёт нормальный.
Тема полезная, можно использовать в своих проектах, лукас :)
 
  • 14
  • 13
Довольно неплохой приём,возьму на заметку.Забавно,но на stackoverflow(тык) писали об этом.
В основном эту функцию используют для вызова bsod из ring3,чтобы запугать злобного крякера (честно говоря,легче убить системный процесс).
 
Активность
Пока что здесь никого нет
Сверху Снизу