Пытаюсь открыть девайс "\Device\Ndis" Код (Text): InitializeObjectAttributes addr oa, addr uNdisName, OBJ_KERNEL_HANDLE, NULL, NULL invoke ZwOpenFile, addr hObject, FILE_READ_DATA+FILE_WRITE_DATA,\ addr oa, addr iosb, FILE_SHARE_READ+FILE_SHARE_WRITE, 0 .if eax==STATUS_SUCCESS invoke ZwClose, hObject mov [esi].IoStatus.Status, STATUS_SUCCESS .else mov [esi].IoStatus.Status, STATUS_UNSUCCESSFUL .endif ZwOpenFile возвращает STATUS_SUCCESS, но и хэндл объекта не возвращает (hObject) а iosb тоже возвращает 0... Если скзать проще - ничего не взвращается ни хэндла, ни ошибки
Только имей ввиду, что если к интересующему тебя девайсу кто-то приаттачен, то ты получишь указатель не на сам девайс, а на вершину стека.
Four-F Если не ошибаюсь, то девайсы можно перебирать через mov eax, (DEVICE_OBJECT PTR [eax]).NextDevice Но мне надо было найти драйвер через девайс Kola А что IoGetDeviceObjectPointer увеличивает счетчик ссылок ?
да, увеличивает... кстати, для того чтобы получить драйвер, можно использовать ObReferenceObjectByName с именем \Driver\Ndis
[ SteelRat: <font color="indigo]Если не ошибаюсь, то девайсы можно перебирать через mov eax, (DEVICE_OBJECT PTR [eax]).NextDevice</font><!--color--> ] Можно - девайсы какого-то конкретного драйвера. Если стек перебрать, то DEVICE_OBJECT.AttachedDevice вверх и DEVICE_OBJECT.DeviceObjectExtension.AttachedTo вниз. [ SteelRat: <font color="indigo]А что IoGetDeviceObjectPointer увеличивает счетчик ссылок ?</font><!--color--> ] На девайс нет, но создает объект "файл", который и надо потом dereference. Подробности тут: http://www.wasm.ru/article.php?article=drvw2k15 [ SteelRat: <font color="indigo]Но мне надо было найти драйвер через девайс </font><!--color--> ] Если есть указатель на девайс, то это не проблема: DEVICE_OBJECT.DriverObject. А если у тя только имя девайса, то про IoGetDeviceObjectPointer можешь забыть: http://www.ntkernel.com/forum/viewtopic.php?t=168
Я подумал... можно и IoGetDeviceObjectPointer заюзать. Просто придется спуститься вниз по стеку пока не дойдешь до искомого девайса. 1. IoGetDeviceObjectPointer, потом ObQueryNameString. Если это не тот девайс, то 2. DeviceObject->DeviceObjectExtension->AttachedTo или IoGetLowerDeviceObject под ХР+, потом ObQueryNameString. Если опять не тот девайс идем вниз (п.2).
Трудность в другом Решил дописАть свой снифер... Смысл в переопределении диспетчеров чтения/записи прямо на драйвере сетевухи и считывания пакетов... Как то здесь, на форуме меня не поддержали Но ведь работает, правда только на чтение, запись не получилась (BSOD) да и стартует он не "красиво", решил перекроить по другому Посмотрел что делает драйвер - регистрирует минипорт и всё, затем NDIS перехватывает на себя все диспетчеры сетевого драйвера и прячет Four-F может есть какая мысль по этому поводу ? Теоретически есть мысль вызвать DriverEntry этого драйвера, она заполнит структуру адресами диспетчеров, а затем переопределить по 6 байт у каждого... Но есть "грабли" - если она в INIT секции, то BSOD.
Вот блин, снифер - вопрос интересный. Где же я был, когда эту идею не поддержали на форуме? - а почему просто на стартануть перед драйвером минипорта и перехватить, скажем, NdisMRegisterMiniport? И уже из NDISxx_MINIPORT_CHARACTERISTICS взять/подменить все интересующие нас указатели?
"перехватить, скажем, NdisMRegisterMiniport" Первый вариант именно так и работает Для "нормального" старта нужно внести драйвер в группу NDIS и запускаться после старта ndis.sys, а затем перехватывать, но мне хотелось сделать "красивее" - "тряхнуть" NDIS и отобрать адреса диспетчеров... Но пока мысль не приходит. После установки оказалось, что T-Metr "тихо курит бамбук", в передаваемом трафике столько всякого оказалось в перемешку с "нормальными" данными, правда пока не понятно чего
- другими словами, запускаться в любое время, и коннектиться к NDIS? Я пытался такое провернуть, только с другой стороны: от протоколов. Тогда не получилось: что работало под 2000 - не жило под XP и пр. Слишком много алхимии. Хотя идея классная. Начинаю снова ковырять в этом направлении...
[ SteelRat: <font color="indigo]Four-F может есть какая мысль по этому поводу ?</font><!--color--> ] Нет. Я в сетевых делах не шарю. Насчет "прячет" и откуда взялось 6 байт, я вообще не понял. Если ты хучишь MajorFunction[xxx], то IMHO, если всё правильно реализовано BSOD'ов быть не должно. Слей, например, Device Filter Utility 1.12 с www.ntkernel.com и натрави на дровину. Она похучит MajorFunction[xxx] и никаких BSOD'ов не будет.
SteelRat -> Пытаюсь открыть девайс "\Device\Ndis" InitializeObjectAttributes addr oa, addr uNdisName, OBJ_KERNEL_HANDLE, NULL, NULL invoke ZwOpenFile, addr hObject, FILE_READ_DATA+FILE_WRITE_DATA,\ addr oa, addr iosb, FILE_SHARE_READ+FILE_SHARE_WRITE, 0 .if eax==STATUS_SUCCESS invoke ZwClose, hObject mov [esi].IoStatus.Status, STATUS_SUCCESS .else mov [esi].IoStatus.Status, STATUS_UNSUCCESSFUL .endif ZwOpenFile возвращает STATUS_SUCCESS, но и хэндл объекта не возвращает (hObject) а iosb тоже возвращает 0... Если скзать проще - ничего не взвращается ни хэндла, ни ошибки Leon -> Помогите люди добрые, пришлите на leon_pacyfier@mail.ru исходники с установкой соединения и посылкой инфы через открытый девайс (например Ndis или Tcp).
void find_target_body() { NDIS_STATUS ndis_status; NDIS_STATUS ndis_error; PNDIS_PROTOCOL_BLOCK protocol; PNDIS_PROTOCOL_BLOCK cur_proto; NDIS_PROTOCOL_CHARACTERISTICS proto_chars; UINT medium_index; NDIS_MEDIUM medium_array[1] = {NdisMedium802_3 }; NDIS_STRING adapter_name; PNDIS_OPEN_BLOCK open_block; PNDIS_MINIPORT_BLOCK miniport; BOOLEAN found; DebugEnter(DBL3, "find_target_body"); memset(&proto_chars, 0, sizeof(proto_chars) ); proto_chars.MajorNdisVersion = 4; proto_chars.MinorNdisVersion = 0; proto_chars.BindAdapterHandler = hack_protocl_bind_adapter; proto_chars.UnbindAdapterHandler = hack_protocol_unbind_adapter; proto_chars.CloseAdapterCompleteHandler = hack_protocol_close_adapter_complete; RtlInitUnicodeString(&proto_chars.Name, L"pngpr"); //ðåãèñòðèðóåì "ëåâûé" ïðîòîêîë NdisRegisterProtocol(&ndis_status, &protocol, &proto_chars, sizeof(proto_chars) ); //õàðäêîä, íàäî îïðåäåëèòü èìÿ óñòðîéñòâà äèíàìè÷åñêè, íî ýòî ïîçæå RtlInitUnicodeString( &adapter_name, L"\\DEVICE\\{6FD112A7-112E-4AEB-BF14-E41999199A1C}" ); //ïîëçåì ÷åðâåì ïî ñïèñêó ïðîòîêîëîâ cur_proto = protocol; found = FALSE; while (cur_proto) { DbgPrint("Protocol: %ws\n", cur_proto->Chars.Name.Buffer); //ñìîòðèì, êóäà ïîäêëþ÷åí ïðîòîêîë: open_block = cur_proto->OpenQueue; while (open_block) { DbgPrint("\tBind to: %ws\n", open_block->BindDeviceName->Buffer); if (0 == RtlCompareUnicodeString(open_block->BindDeviceName, &adapter_name, TRUE ) && FALSE == found) { //êàæèñü, íàøëè.... miniport = (PNDIS_MINIPORT_BLOCK)open_block->AdapterHandle; #ifdef _DEBUG //Âûâîäèì æåëàåìîå: DbgPrint("\n\t\tsomething about handler from protocol:\n"); DbgPrint("\t\tSendHandler: %#x\n", open_block->SendHandler); DbgPrint("\t\tSendPacketHandler: %#x\n", open_block->SendPacketsHandler); DbgPrint("\t\tReceiveHandler: %#x\n", open_block->ReceiveHandler); DbgPrint("\t\tPostNt31ReceiveHandler: %#x\n", open_block->PostNt31ReceiveHandler ); DbgPrint("\t\tReceivePacketHandler: %#x\n", open_block->ReceivePacketHandler); DbgPrint("\n\t\tsomething about handler from miniport:\n"); DbgPrint("\t\tEthRxIndicateHandler: %#x\n", miniport->EthRxIndicateHandler); DbgPrint("\t\tPacketIndicateHandler: %#x\n", miniport->PacketIndicateHandler); #endif //çàïîìèíàåì òî÷êè trap.target_miniport = miniport; trap.target_bind = open_block; found = TRUE; } open_block = open_block->ProtocolNextOpen; } cur_proto = cur_proto->Next; } //l&m, êîðîëåâà ïîêèíóëà çäàíèå... NdisDeregisterProtocol( &ndis_status, protocol); DebugExit(DBL4, "find_target_body"); }