драйвер для защиты процесса

Тема в разделе "LANGS.C", создана пользователем RUStx88, 22 июл 2010.

  1. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    пишу драйвер на С для защиты процесса, сделал перехват функции ZwOpenProcess, определяю в своей проге (чистый Win32API) PID защищаемого процесса, передаю драйверу PID, и уже соответственно драйвер осуществляет защиту процесса

    у меня соответственно вопрос - этого достаточно для защиты памяти процесса от записи или это вообще не в этой стороне?
    смотрю сейчас уже в сторону дополнительной обработки функций ZwWriteVirtualMemory и ZwProtectVirtualMemory, подскажите пожалуйста, как они работают, что делают, ничего толкового и подробного не нашел по этим функциям, одни ссылки только что эти функции используют руткиты и антивири

    желательно с примерами на С и комментами, буду очень благодарен, если направите на путь истинный
    (асм не предлагать, я в нем почти ни бум бум)))
     
  2. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    мыслите в правильном направлении, без хэндла процесса ничего не получится в юзермоде. Но из csrss можно скопировать нужные хэндлы (он имеет хэндлы всех процессов), так что придется хукать ещё и NtDuplicateObject, чтобы предотвратить копирование.
    Хуки на ZwWriteVirtualMemory и ZwProtectVirtualMemory излишни (а вот описание почитайте в книжке Неббета, которая в английском варианте валяется везде (Недокументированные возможности Windows 2000).
     
  3. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    можно подробнее - почему излишни? не потому что, чтобы их вызвать сначала идет обращение к ZwOpenProcess?

    прошу прощения за наглость, но, пожалуйста, аргументируйте свои ответы, не голословно же мне всему верить

    возможно, не совсем меня правильно поняли - драйвер работает в ring0, ring3 оставим для приложений, меня интересует только защита процесса в нулевом кольце, прога - только для определения PID защищаемого процесса (процесс не свой, а "чужой" - в принципе какого угодно приложения) и передача этого PID в драйвер
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    RUStx88
    Какже вы драйвера тогда пишите, если вам понятие системных сервисов не известно ?
    Если нет описателя, то к обьекту документированными способами не добраться.
     
  5. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    я имею ввиду их синтаксис и использование, на примерах

    пишу свой первый "драйв")), так что особо сильно не придирайтесь, а лучше поделитесь ссылками или своими знаниями, чтобы я устранил пробел в своих

    т.е. достаточно, я так понимаю? перекрываем эту функцию (ZwOpenProcess) обращения к процессу и большинство прог\юзеров обломается?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    RUStx88
    Да. Ещё открытие системных процессов нужно запретить.
    Нужно начинать с более простых вещей. Качественная реализация будет для вас не доступной. Будет масса уязвимостей, начиная с простейших типа race condition и более грубыми.
     
  7. Satsura

    Satsura S4(uR4 __r00tw0rm__

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    374
    Адрес:
    Узбекистон, бляать!!11 :D
    - Естественно обламается вы же используете ring0, а юзермордные программы выполняются в контексте ring3.

    - Так ето уже руткит получается.

    2 RUStx88:
    вы пишете что то вроде руткит-драйвера Conficker'a?) Так знайте и его обломать не сложно;)
    ЗЫ.: Пропалится АВ при первом же запуске.
     
  8. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    пишу защитника для своего процесса, ну использует для этого технологию руткитов))) про Conficker не слышал)))

    я сделал так:
    перехват функции ZwOpenProcess и при обращении к защищаемому процессу STATUS_ACCESS_DENIED
    +
    скрытие процесса (думаю еще над подменой его PID)

    думаю, это самое легко реализуемое + не самое легкое для обхода этой защиты
     
  9. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Ms-Rem'а простейший перехват в SSDT не годится?
    Хотя наверное вы с него и писали свой код
     
  10. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Я думаю никто вам не сможет сказать какой защиты достаточно а какой нет. Вот мне сразу в голову не идёт способ как "влезть в процесс" из userland если нет хендла. И это незначит что этого способа нет. Т.е. если я сейчас скажу "Да я точно знаю что тебе хватит просто перехватить ZwOpenProcess и твой процесс неуязвим!" тебе это както поможет? ))) Вобщем если хочешь защитится от всего и всех, то пиши "мегакрутой руткит". Если надо создать относительно надёжную защиту можешь делать так. Пишешь утилиту которая "влезает в процесс", потом в драйвере блокирует те методы. Потом придумываешь новые методы "влезания" и всё заново. Если с последним совсем проблема, тогда вначале читаешь литературу по устройству виндоус.... Ну и гдето после этого уже появляются новые идеи )
     
  11. Satsura

    Satsura S4(uR4 __r00tw0rm__

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    374
    Адрес:
    Узбекистон, бляать!!11 :D
    100 пудов! нет ни одного руткита который нельзя было бы обломать;)
    И процесс вы точно на 100% никогда не сможете защитить ничем.
    Так что одна из методик обхода и защиты процесса - сокрытие потоков процесса через всем известные приемы с ядром и ntdll;)
     
  12. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    еще вот такая проблема объявилась, хук для ZwOpenProcess работает прекрасно, решил потренироваться, использовать детект (типа: был факт - делаем оповещение) на то, кто пытается влезть в процесс

    переписываю код хука ZwOpenProcess на функцию ZwWriteVirtualMemory, и... что такое - НЕ компилится!!!

    компилятор выдает мне
    главное, код абсолютно такой же, только функции поменялись, но все равно не работает
    тысячу раз проверял синтаксис функции ZwWriteVirtualMemory - все правильно написано, объявлено

    подскажите, пожалуйста, как перехватить эту функцию, я уже не знаю что делать, не пойму, что за трабла
    весь гугл излазил уже, все китайские сайты

    вот код перехвата
    Код (Text):
    1. typedef struct ServiceDescriptorEntry {
    2.   unsigned int *ServiceTableBase;
    3.   unsigned int *ServiceCounterTableBase;
    4.   unsigned int NumberOfServices;
    5.   unsigned char *ParamTableBase;
    6. } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
    7.  
    8. __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
    9.  
    10. #define SYSTEMSERVICE(function) \
    11.   KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)function + 1)]
    12. #define SYSCALL_INDEX(function) \
    13.   *(PULONG)((PUCHAR)function + 1)
    14. #define HOOK(function, NewFunction, OldFunction) \
    15.   OldFunction = (PVOID)InterlockedExchange((PLONG)&MappedSystemCallTable[SYSCALL_INDEX(function)], (LONG)NewFunction)
    16. #define UNHOOK(function, OldFunction) \
    17.   InterlockedExchange((PLONG)&MappedSystemCallTable[SYSCALL_INDEX(function)], (LONG)OldFunction)
    18.  
    19. NTSYSAPI NTSTATUS NTAPI ZwWriteVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG BufferLength, OUT PULONG ReturnLength OPTIONAL);
    20. typedef NTSTATUS (*ZWWRITEVIRTUALMEMORY)(IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG BufferLength, OUT PULONG ReturnLength OPTIONAL);
    21. PVOID OldZwWriteVirtualMemory;
    22.  
    23. NTSTATUS NewZwWriteVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN PVOID Buffer, IN ULONG BufferLength, OUT PULONG ReturnLength OPTIONAL) {
    24. ...
    25. }
    26. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath) {
    27. ...
    28.   g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices * 4);
    29.   if (!g_pmdlSystemCall)
    30.     return STATUS_UNSUCCESSFUL;
    31.   MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
    32.   g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
    33.   MappedSystemCallTable = (PVOID*)MmMapLockedPages(g_pmdlSystemCall, KernelMode);
    34.   OldZwWriteVirtualMemory = (PVOID)(SYSTEMSERVICE(ZwWriteVirtualMemory)); //!!!!!!!!!!!!!!!!!!!!!!!!
    35.   HOOK(ZwWriteVirtualMemory, NewZwWriteVirtualMemory, OldZwWriteVirtualMemory); //!!!!!!!!!!!!!!!!
    36. ...
    37. }
    38.  
    39. VOID UnLoadDriver(IN PDRIVER_OBJECT DriverObject) {
    40.   UNHOOK(ZwWriteVirtualMemory, OldZwWriteVirtualMemory); //!!!!!!!!!!!!!!!!!!!
    41. ...
    42. }
    где восклицательные знаки - на них ругается компилятор при использовании ZwWriteVirtualMemory, при ZwOpenProcess все нормально

    заменяю ZwWriteVirtualMemory на ZwOpenProcess - и ву-а-ля всё работает
    в чем трабла????
     
  13. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Не сочтите за снобизм, но не компилятор, а линкер

    функция ZwWriteVirtualMemory(...) не экспортируется из ядра. Если уж используете SSDT, то из нее можно получать адрес оригинальной функции по заданному индексу (индекс зависит от номера билда ядра ОС).

    UPD: Еще, в вашем случае, если до вас был установлен сплайс-перехват (jmp-переход в начале функции на адрес хука), то вы еще в BSOD свалитесь. Вставьте хотя бы код проверки на выход за пределы SSDT или читайте тело функции с диска, а не из памяти.
     
  14. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    тааааак, поиск по форуму решил больше, чем гугл)))))

    нашел много тем про проблему вытаскивания адреса функции ZwWriteVirtualMemory
    http://wasm.ru/forum/viewtopic.php?id=24179

    да, извиняюсь, протупил, линкер, конечно )))
     
  15. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    А как же NtCreateProcess? Я получу хендл на ваш процесс создав его сам.
     
  16. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    тогда уж и NtCreateProcessEx перехватывайте
     
  17. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
  18. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    RUStx88
    Тогда уже просто при вызове ZwWriteVirtualMemory проверяй какой процесс описывает хэндл непосредственно в ядре. На производительности это не особо отразится. Зато не нужно будет следить за кучей хэндлов сразу и перехватывать никому ненужные ZwOpenProcess и кто там с ним ещё.
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    закинуть код в контекст другого процесса можно и без ZwWriteVirtualMemory... другое дело что, перехватывая ZwOpenProcess, мы решаем больше проблем... не только вопросы по работе с ап защищаемого процесса, но и создания потоков в нем или изменение контекста одного из потоков...