|
Заблокирован
|
|
Нужен пример простейшего драйвера на C/C++. Visual Studio 2008/новее. Win 8 x64, можно и XP x86 (а лучше оба)19.03.2015, 01:49. Показов 40441. Ответов 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 раздел жесткого диска Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача
Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
Сигнатура
func Fetch(urls string, maxConcurrent int) Result
Пример
urls :=. . .
|
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition)
Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
|
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
|
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool
Worker Pool — паттерн конкурентной обработки задач в Go.
Суть: фиксированное количество горутин-воркеров читают задачи из общего канала
и пишут результаты в общий канал результатов. . . .
|
|
[golang] Pipeline
alhaos 08.06.2026
Pipeline
Pipeline — паттерн конкурентной обработки данных в Go.
Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
|
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь
lIs4oanZS9Y
|
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|