Статья Маскируем и вызываем 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);
}
Также, если кому-то интересно, то заместо вызовов 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);
}
Результат:
 
Последнее редактирование:
  • 28
  • 3
  • 42

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