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

ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
=========================================================

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

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

=========================================================
Всем привет. Недавно ковырял последний вмпрот, и мне стало интересно, почему он не брякается ни на какую функцию, о которой я знал, связанной с MessageBox'ом. После нескольких часов, я все таки нашел, где зарыта собака. Оказывается, MessageBox вызывается прямо из ядра недокументированной функцией.
И вот я сделал небольшой сэмпл, как можно это воспроизвести. Кстати, я не знаю, как это будет вести себя на 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);
}
1622923187791.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);
}
1622923083491.png

Результат:
1622923717663.png
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
аменить на прямой системный вызов(SYSCALL, у меня он равен 0x167, но имейте ввиду, что в бинарь вшивается номер системного вызова, который меняется со временем от версии к версии windows!)
Не обязательно зашивать, так делает дерьматолог со своим вмпом и по итогу у него перестают работать прямые сисколлы на новых версиях винды.
Можно парсить ntdll и вытаскивать из нее номера системных вызовов, с user32 вроде не прокатит т.к. там экспортируются функции только в новых версиях винды.
Но находка с ZwRaiseHardError прикольная, молодец :grinning:
 
Забаненный
Статус
Оффлайн
Регистрация
9 Июл 2017
Сообщения
11
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Либо воспользоваться ProcessHacker'ом, для этого мува нужно иметь овер 8 классов виницианцкой школы :roflanEbalo: :roflanBuldiga: 1623096396168.png
 
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
Либо воспользоваться ProcessHacker'ом, для этого мува нужно иметь овер 8 классов виницианцкой школы
Имеешь ввиду, когда сообщение высветилось => посмотреть call stack? Да, так можно было сделать, только из-за моей нехватки знаний, я не знал, что NtRaiseHardError как-то связана MessageBox'ом. Я вообще подумать не мог, что это реализовано в ядре
 
Эх, жизнь — хоть за хуй
Забаненный
Статус
Оффлайн
Регистрация
8 Июл 2019
Сообщения
2,993
Реакции[?]
1,656
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Годнота
 
Сверху Снизу