eXeL@B —› Программирование —› Почемуто не идет управление |
Посл.ответ | Сообщение |
|
Создано: 30 апреля 2012 12:35 · Личное сообщение · #1 есть к примеру код драйвера Code:
так вот .. компилю .. беру запускаю через KmdManager из набора KmdKit.. драйвер запускается замечательно но при попытке отослать ему через этот менеджер управляющий код к примеру 800 или 801 выдается сообщение (менеджером) каннот гет дривер хандле а в лог идет запись контрол файл неудается найти указаный файл кто знает в чем грабли ? |
|
Создано: 30 апреля 2012 13:31 · Личное сообщение · #2 |
|
Создано: 30 апреля 2012 15:11 · Личное сообщение · #3 У меня смутное чувство, что слеши в строках надо экранировать. | Сообщение посчитали полезным: Dart Sergius, Cigan |
|
Создано: 30 апреля 2012 16:44 · Личное сообщение · #4 в результате экспериментов выяснилось что походу косячит сама утилита KmdManager .. написал утилитку консольную и она нормально общается с драйвером ... тут всплыл еще вопрос кто нить в курсе как можно из драйвера!!! получить реальный адресс к примеру NtOpenProcess (в SSDT стоит хук на эту функцию ) ПыСы кстати таки да в коде Code:
нужно с двумя слешами имена девайсов писать |
|
Создано: 30 апреля 2012 18:11 · Поправил: ARCHANGEL · Личное сообщение · #5 CKA3KA Решили сами, что ж - похвально! Ключевым моментом в определении правильных (оригинальных) адресов сервисов является чтение этих самых адресов из ntoskrnl.exe или аналогичного с диска, т.к. имя этого файла может варьироваться. Сделать это проще из юзермода, но если нужно чисто из драйвера, то можно и так. Для начала следует определить полный путь к нашей версии ntoskrnl.exe. Это можно сделать так: Code:
где ранее был дефайн Code:
Первой в этом списке будет идти инфа про модуль, который, собственно, нас и интересует. Известно, что первый DWORD содержит в себе счётчик (количество) структур SYSTEM_MODULE_INFORMATION, поэтому он нам неинтересен, и его надо пропустить: Code:
Далее поле ImageName содержит адрес, но без указания буквы диска, на котором файл был расположен. В юзермоде это легко решается определением буквы через GetSystemDirectoryA, используя тот факт, что ядро лежит на то же диске, на котором и установлена ось. Далее в ядре нам нужно поределить виртаульное семещение, по которому располагается KiServiceTable. Простейший способ это сделать - воспользоваться экспортируемым KeServiceDescriptorTable. Теперь считаем, что всё нужное у нас уже есть, теперь считаем оригинал KiServiceTable из файла на диске: Code:
Т.е. открываем файл для чтения, мэппируем его в память, ищем, какому виртуальному адресу соответствует Raw Offset на диске (да, кстати, нужно определить не только полный путь к файлу ядра, но и его базу загрузки, но это всё тоже есть в структуре SYSTEM_MODULE_INFORMATION), далее читаем оттуда эти адреса и правим их с учётом ImageBase ядра. Теперь осталось передать этот массив правильных адресов в ядро. Как видите - ничего такого, чего бы нельзя было бы похожим способом сделать чисто из ринг0, в этом коде нет. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 01 мая 2012 11:58 · Личное сообщение · #6 Ну я бы не прочь отдать эту "работу" профессионалу который сделает это быстрее и качественнее меня но вы не отвечаете на мои запросы так что приходится ковыряться самому .. я нашол что все делают через Ring3 и юзают волшебную функцию FindKiServiceTable но у меня пока все умирает на стадии Code:
ПыСЫ если всетаки надумаете пишите |
|
Создано: 01 мая 2012 15:11 · Личное сообщение · #7 Ну, это, по сути, одно и то же. Можно использовать LoadLibraryEx для подгрузки в адресное пространство ntoskrnl.exe, а можно CreateFile+CreateFileMapping+MapViewOfFile. Флаг DONT_RESOLVE_DLL_REFERENCES позволяет так подгрузить модуль, чтоб тот не начал выполнять свою DllMain. Первый параметр для LoadLibraryEx - это, что вполне логично, имя модуля. Вот и смотрите код, который это имя генерирует. А эта "волшебная" FindKiServiceTable - я уверен - не что иное, как изложенная выше методика. Раз уж пошло такое дело - не могли б вы максимально подробно объяснить, что вам требуется сделать и как. Т.е. если всё нужно сделать из драйвера, то как этот драйвер будет стартовать, т.е. кто его будет устанавливать, запускать и т.д. Если доускается юзать ещё и ринг3, то какова будет его роль и т.д. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 31 мая 2012 21:54 · Личное сообщение · #8 Не хочу открывать новую тему спрошу тут возник вопрос : запускаю драйвер через RtlAdjustPrivilege RtlInitUnicodeString в реестр вношу \Registry\Machine\SYSTEM\CurrentControlSet\Services NtLoadDriver драйвер прекрасно стартует и работает .. но когда использую RtlAdjustPrivilege RtlInitUnicodeString в реестре сношу \Registry\Machine\SYSTEM\CurrentControlSet\Services NtUnLoadDriver он не выгружается !!!! есть мысли в чем грабли |
|
Создано: 31 мая 2012 21:58 · Личное сообщение · #9 CKA3KA Ага, есть. DriverUnload в дровине не реализован. И включать привелегию загрузки драйвера второй раз уже не нужно, одного раза достаточно. И последовательность действий должна быть другая - вначале надо NtUnloadDriver, а потом строки с реестра сносить, а вообще правильнее было бы Service Control Manager, а не через Native API. ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 01 июня 2012 22:17 · Личное сообщение · #10 Новая хитрая проблема в драйвере выгрузку делаю VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject) { PDEVICE_OBJECT deviceObject = pDriverObject->DeviceObject; UNICODE_STRING uniWin32NameString; RtlInitUnicodeString( &uniWin32NameString, WIN32_DEVICE_NAME ); IoDeleteSymbolicLink( &uniWin32NameString ); IoDeleteDevice( deviceObject ); return; } а в DriverEntry добавил RtlInitUnicodeString(&uniNtName, NT_DEVICE_NAME); RtlInitUnicodeString(&uniWin32Name, WIN32_DEVICE_NAME); IoDeleteSymbolicLink(&uniWin32Name); в WinXP также некорректно работает (невыгружается) в виндах версии вые все ОК это карма какаято |
eXeL@B —› Программирование —› Почемуто не идет управление |