|
Заблокирован
|
|
Нужен пример простейшего драйвера на C/C++. Visual Studio 2008/новее. Win 8 x64, можно и XP x86 (а лучше оба)19.03.2015, 01:49. Показов 40885. Ответов 121
Метки нет (Все метки)
Совсем хорошо будет, если этот драйвер будет еще и делать что-то хоть как-то заметное юзером
![]() И совсем замечательно, если будет еще и вкратце объяснено, как его установить на обеих ОС ![]() P.S. Да-да, ![]() Добавлено через 43 секунды И да, можно в принципе и не VS 2008, а что-то еще, хоть MinGW. Только тогда попрошу пояснить, какая у вас версия того компилятора и как его юзать. Добавлено через 1 минуту VS только Express, так что VisualDDK, к сожалению, никак не пойдет...
1
|
|
| 19.03.2015, 01:49 | |
|
Ответы с готовыми решениями:
121
Как установить Windows 10 x64 (после обновления с Win 7 x86 до Win 10 x86) сохранив лицензию
Разработка драйвера в Visual Studio 2008 |
|
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
|
||||||
| 30.05.2016, 21:08 | ||||||
|
это мне получается в strlen(myString) нужно записать строку, о том, что процесс создается, и переменную с ID процесса нужно внести? она будет доступна?
0
|
||||||
|
Ушел с форума
|
||||
| 31.05.2016, 10:14 | ||||
|
В ядре следует использовать соответствующие аналоги - RtlStringCchLength, RtlStringCchPrintf и т.д. выведи в файл (ZwWriteFile).
1
|
||||
|
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
|
||||||
| 31.05.2016, 12:44 | ||||||
|
Разветвление правильно сделано и RtlStringCchPrintf правильно использована?
RtlStringCchLength какие должна аргументы принимать? Первый аргумент - указатель на буфер, что содержит строку это указатель на ExAllocatePool будет или что? А второй аргумент размер буфера в символах, правильно? И еще где нужно выделять ExAllocatePool?
0
|
||||||
|
Ушел с форума
|
|||||||||||||
| 31.05.2016, 13:59 | |||||||||||||
|
Тут в коде вообще какая-то мешанина, оно даже не скомпилируется, скорее всего.
Например:
в ParentId и ProcessId лежит "мусор"?
MSDN по первым же ссылкам.
0
|
|||||||||||||
|
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
|
||
| 31.05.2016, 14:05 | ||
|
Где нужно использовать RtlStringCchPrintf? и Как сделать чтоб туда сохранялись ID из MyCreateProcessNotifyRoutine?
0
|
||
|
Ушел с форума
|
|||||
| 31.05.2016, 14:31 | |||||
|
Разбей свою задачу на несколько мелких и разбирайся с каждой отдельно. Так будет и быстрее, и эффективнее, и с ошибками поприятнее. Проверено.
В нотификаторе, - он у тебя называется MyCreateProcessNotifyRoutine, - создай work item: IoAllocateWorkItem. Далее запихни в какую-нибудь структуру ID процессов и KEVENT для ожидания, после чего запусти свой work item (IoQueueWorkItem), передав ему указатель на эту структуру через Context. И жди, пока будет взведено событие из этой структуры (KeWaitForSingleObject). В рабочей функции work item-а выдели буфер (ExAllocatePoolWithTag), отформатируй в него строку с ID процесса и запиши буфер в файл. После чего взведи событие (KeSetEvent) и верни управление. Все. Очистку ресурсов (ExFreePoolWithTag, ZwClose и т.п.) не описываю, так как это само собой разумеющееся.
(вроде уже разобрались); 2) Запуск своего work item с передачей ему аргументов и ожиданием его завершения; 3) Работа с файлом. Реши сначала эти задачи по отдельности друг от друга. Кстати, вот здесь я собрал много полезных ссылок по теме, может, найдешь что-то интересное: Документация и загрузки для разработчика драйверов
0
|
|||||
|
1 / 1 / 1
Регистрация: 04.11.2014
Сообщений: 97
|
|
| 19.09.2016, 18:56 | |
|
здравствуйте, для использования build environment нужно в переменную path прописывать какой-нибудь путь?
0
|
|
|
Ушел с форума
|
|
| 20.09.2016, 07:28 | |
|
Нет, не нужно.
1
|
|
|
0 / 0 / 0
Регистрация: 24.09.2015
Сообщений: 18
|
||||||||||||||||
| 08.12.2016, 19:56 | ||||||||||||||||
|
Здравствуйте, занялся разработкой драйвера, соответственно возникли вопросы в реализации, пока читал наткнулся на одну из интересных тем - эту, так вот сам вопрос - каким образом можно отправить сообщение с драйвера в программу при перехвате запуска любого процесса?
У меня есть функция
Добавлено через 22 минуты Попробовал сделать по-другому, т.к всё же считаю, что PIRP каждый раз генерируется по-новому и нельзя писать каждый раз в одну сохраненную структуру, делаю данную глупость из-за не понимаю, но из логических соображений пришел к такому выводу, я прав? Сделал глобальную переменную BOOLEAN - флаг и некий буфер, при перехвате процесса я устанавливаю этот флаг в TRUE и заполняю буфер, описанный глобально, а в методе отправки и приёма сообщений и проверяю наличие флага, если он в TRUE, то отправляю сообщение программе и соответственно сбрасываю данный флаг в FALSE, данный подход верный? И ещё вопросик - метод отправки сообщения в драйвере вызывается сам каждый раз когда моё приложение пытается считать данные из драйвера?
0
|
||||||||||||||||
|
Ушел с форума
|
||
| 08.12.2016, 20:16 | ||
|
Если никаких данных не нужно передавать, сойдет и простой event.
0
|
||
|
0 / 0 / 0
Регистрация: 24.09.2015
Сообщений: 18
|
||||||
| 09.12.2016, 02:27 | ||||||
|
А каким образом можно приостановить процесс? Читал, пробовал - не получилось, всё находится в ntdll.lib и выдает unresolved external symbol, нет реализации, читал о динамике, пробовал
![]() Добавлено через 2 часа 24 минуты Всё никак не получается получить адрес функции NtSuspendProcess, жаль что просто так вызвать нельзя, приходится мудрить..
0
|
||||||
|
Ушел с форума
|
||||||
| 09.12.2016, 09:57 | ||||||
|
Во-первых, забудь про ntdll. Мы же в ядре, здесь нет ntdll!
Во-вторых, вызывать Nt-функции в ядре не рекомендуется, вместо них следует использовать одноименные аналоги с приставкой Zw. Например, NtCreateFile -> ZwCreateFile, NtSetEvent -> ZwSetEvent и т.д. Ну и в-третьих, ZwSuspendProcess - не документировання функция. Это значит, что тебе придется написать ее прототип и подключать ее самому. Например, так:
0
|
||||||
|
0 / 0 / 0
Регистрация: 24.09.2015
Сообщений: 18
|
|
| 09.12.2016, 14:48 | |
|
Понял, спасибо, о многом также читал, но после Вашего сообщения всё получше стало на круги свои
Про не документированную функция я уже в курсе, прототип уже писал, но немного другой и проблема не в прототипе и не в вызове, а как Вы понимаете в самом подключении, читаю информацию в интернете, пытаюсь что-то изобрести, но не выходит. Вычитал, что нужно по полученному адресу вызвать функцию, даже ZwSuspendProcess - её, но как я понимаю это бред. Пытаюсь искать реализацию, с одной проблемы, появляется другая, используют другие какие-то функции, которых нет( при решении новых проблем появляются новые или в итоге не работает ничего), т.к опять же пытаешься сделать какой-то бред. В интернете нахожу что-то вроде этого - http://pastebin.com/H8Jna9GR Та как всё же можно " подключить её самому" ? Быстро это не сделать? Просто интересно насколько всё печально
0
|
|
|
Ушел с форума
|
|||
| 09.12.2016, 15:38 | |||
|
А у тебя код в режиме ядра работает, там эти функции не доступны. Если функции нет в .lib-файле, получишь ошибку компоновщика (unresolved external). Но и в этом случае функцию можно найти через MmGetSystemRoutineAddress.
0
|
|||
|
0 / 0 / 0
Регистрация: 24.09.2015
Сообщений: 18
|
||||||
| 09.12.2016, 16:22 | ||||||
|
У меня видимо функции нет, поэтому получаю unresolved external, написал функцию
0
|
||||||
|
Ушел с форума
|
|
| 09.12.2016, 16:30 | |
|
Значит, эта функция ядром не экспортируется.
0
|
|
|
0 / 0 / 0
Регистрация: 24.09.2015
Сообщений: 18
|
|
| 10.02.2017, 16:45 | |
|
Здравствуйте, возник такой вопрос - возможно ли перехватить командную строку запуска процесса? (возможно, не корректно выражаюсь, но мысль постараюсь передать правильно)
При запуске пользователем приложения, передать драйвером эту строку своему приложению, оно проанализировало всё и в случае необходимости сделало запуск открываемого приложения пользователем.
0
|
|
|
Ушел с форума
|
|
| 10.02.2017, 16:50 | |
|
Можно зарегистрировать нотификатор на запуск процесса - PsSetCreateProcessNotifyRoutine(Ex).
В этом нотификаторе можно вытащить командную строку из PEB процесса и передать ее в пользовательский процесс по любому доступному каналу связи (через IRP, например).
0
|
|
|
0 / 0 / 0
Регистрация: 24.09.2015
Сообщений: 18
|
|
| 26.04.2017, 03:25 | |
|
Доброй ночи, подскажите каким образом правильно отменить/закрыть запускаемое приложение.
Нотификатор на запуск процесса зарегистрирован, закрываю процесс через ZwTerminateProcess, всё закрывается, но единственная проблема в том, что вылетает MessageBox(типа) с сообщением, что отказано в доступе к запускаемому приложению. Это собственно из-за моего блокирования запуска, каким образом можно заблокировать так, чтобы этого сообщения не было и приложение не было запущено? Через драйвер само собой. Возможно, нужно другую функцию вызывать или же эту и ещё что-то?
0
|
|
|
Ушел с форума
|
|
| 26.04.2017, 09:18 | |
|
Тут не все так просто.
MessageBox с ошибкой вылетает потому, что когда ты делаешь ZwTerminateProcess прямо из нотификатора, процесс завершается на очень ранней стадии, фактически до того, как CreateProcessXxx вернет управление вызывающему коду. Чтобы этого избежать, нужно позволить процессу запуститься на короткое время, а затем грохнуть его. Наиболее секьюрный способ это сделать - зашедулить в первичный поток APC, и из этой APC вызвать NtTerminateProcess (ntdll.dll). См. функции KeInitializeApc, KeInsertQueueApc, KeDelayExecutionThread. Секьюрным я его назвал потому, что никакой другой код, кроме кода базовых системных dll, - а это ntdll, wow64 ntdll, wow64.dll, wow64cpu.dll и wow64win.dll, - выполнен не будет. Т.е. если мы пишем какой-нибудь фаервол или HIPS, то этот способ в плане безопасности один из лучших. Но у этого способа есть две большие проблемы. 1. Для WOW64-процессов нужно дождаться, пока не будет проинициализирована подсистема WOW64, иначе APC будет ронять процесс с кодом 0xC0000005. 2. На Windows 8.1 и выше у процесса может быть заблокирована генерация динамического кода и для создания APC придется "химичить". Есть и другой способ, более мягкий (но и менее секьюрный): при создании процесса и отображении в него начальных dll в стеке первичного потока лежит структура CONTEXT, где стартовый адрес записан в регистре Rip/Eip. Ты можешь подменить его и из своего кода, опять же, сделать NtTerminateProcess. Еще для расширения кругозора рекомендую почитать вот эту статью: Способ принудительной загрузки DLL в адресное пространство процесса https://rsdn.org/article/baseserv/InjectDll.xml Но сразу предупреждаю: статья устарела, а код содержит целую пачку багов, так что доверять, не глядя, не стоит.
0
|
|
| 26.04.2017, 09:18 | |
|
User32.dll на Win x64 - это x86-библиотека, x64 или. и то и другое одновременно? Установка Visual Studio 2008 на Windows 7 Professional x64 bit Qt Creator & MS Visual Studio создание окна в Win 7 x64 Win API в Microsoft Visual Studio 2008 Не ставится Win 7 x86 и Win 7 x64 на GPT раздел жесткого диска Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|