ldloc.s <d0t.net> stloc.s <Reversed>
-
Автор темы
- #1
=========================================================
Все опыты проводились на Windows 10 x64 21H1 (Сборка ОС 19043.906) – процессор Intel
Подопытный: x64 PE-файл
=========================================================
Всем привет. Недавно ковырял последний вмпрот, и мне стало интересно, почему он не брякается ни на какую функцию, о которой я знал, связанной с MessageBox'ом. После нескольких часов, я все таки нашел, где зарыта собака. Оказывается, MessageBox вызывается прямо из ядра недокументированной функцией.Все опыты проводились на Windows 10 x64 21H1 (Сборка ОС 19043.906) – процессор Intel
Подопытный: x64 PE-файл
=========================================================
И вот я сделал небольшой сэмпл, как можно это воспроизвести. Кстати, я не знаю, как это будет вести себя на 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);
}
Последнее редактирование: