Как открыть не свой Device в ядре ?

Тема в разделе "WASM.WIN32", создана пользователем SteelRat, 1 фев 2005.

  1. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Пытаюсь открыть девайс "\Device\Ndis"
    Код (Text):
    1.  
    2.     InitializeObjectAttributes addr oa, addr uNdisName, OBJ_KERNEL_HANDLE, NULL, NULL
    3.     invoke ZwOpenFile, addr hObject, FILE_READ_DATA+FILE_WRITE_DATA,\
    4.       addr oa, addr iosb, FILE_SHARE_READ+FILE_SHARE_WRITE, 0
    5.     .if eax==STATUS_SUCCESS
    6.         invoke ZwClose, hObject
    7.         mov [esi].IoStatus.Status, STATUS_SUCCESS
    8.     .else
    9.         mov [esi].IoStatus.Status, STATUS_UNSUCCESSFUL
    10.     .endif
    11.  


    ZwOpenFile возвращает STATUS_SUCCESS, но и хэндл объекта не возвращает (hObject) а iosb тоже возвращает 0... Если скзать проще - ничего не взвращается ни хэндла, ни ошибки :dntknw:
     
  2. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    попробуй IoGetDeviceObjectPointer
     
  3. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    IoGetDeviceObjectPointer - сила :) то, что надо...
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Только имей ввиду, что если к интересующему тебя девайсу кто-то приаттачен, то ты получишь указатель не на сам девайс, а на вершину стека.
     
  5. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    не забудь сделать ObDereferenceObject
     
  6. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Four-F Если не ошибаюсь, то девайсы можно перебирать через

    mov eax, (DEVICE_OBJECT PTR [eax]).NextDevice

    Но мне надо было найти драйвер через девайс :)

    Kola А что IoGetDeviceObjectPointer увеличивает счетчик ссылок ?
     
  7. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    да, увеличивает...



    кстати, для того чтобы получить драйвер, можно использовать ObReferenceObjectByName с именем \Driver\Ndis
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    [ 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
     
  9. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Kola и Four-F Спасибо :)) Очень содержательный ответ :)
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Я подумал... можно и IoGetDeviceObjectPointer заюзать. Просто придется спуститься вниз по стеку пока не дойдешь до искомого девайса.



    1. IoGetDeviceObjectPointer, потом ObQueryNameString. Если это не тот девайс, то

    2. DeviceObject->DeviceObjectExtension->AttachedTo или IoGetLowerDeviceObject под ХР+, потом ObQueryNameString. Если опять не тот девайс идем вниз (п.2).
     
  11. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Трудность в другом :) Решил дописАть свой снифер... Смысл в переопределении диспетчеров чтения/записи прямо на драйвере сетевухи и считывания пакетов... Как то здесь, на форуме меня не поддержали ;) Но ведь работает, правда только на чтение, запись не получилась (BSOD) да и стартует он не "красиво", решил перекроить по другому

    Посмотрел что делает драйвер - регистрирует минипорт и всё, затем NDIS перехватывает на себя все диспетчеры сетевого драйвера и прячет :dntknw: Four-F может есть какая мысль по этому поводу ?

    Теоретически есть мысль вызвать DriverEntry этого драйвера, она заполнит структуру адресами диспетчеров, а затем переопределить по 6 байт у каждого... Но есть "грабли" - если она в INIT секции, то BSOD.
     
  12. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    Вот блин, снифер - вопрос интересный.

    Где же я был, когда эту идею не поддержали на форуме? :)

    - а почему просто на стартануть перед драйвером минипорта и перехватить, скажем, NdisMRegisterMiniport? И уже из NDISxx_MINIPORT_CHARACTERISTICS взять/подменить все интересующие нас указатели?
     
  13. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    "перехватить, скажем, NdisMRegisterMiniport"

    Первый вариант именно так и работает :) Для "нормального" старта нужно внести драйвер в группу NDIS и запускаться после старта ndis.sys, а затем перехватывать, но мне хотелось сделать "красивее" - "тряхнуть" NDIS и отобрать адреса диспетчеров... Но пока мысль не приходит.

    После установки оказалось, что T-Metr "тихо курит бамбук", в передаваемом трафике столько всякого оказалось в перемешку с "нормальными" данными, правда пока не понятно чего :)
     
  14. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    - другими словами, запускаться в любое время, и коннектиться к NDIS? :)

    Я пытался такое провернуть, только с другой стороны: от протоколов. Тогда не получилось: что работало под 2000 - не жило под XP и пр. :dntknw: Слишком много алхимии.

    Хотя идея классная. Начинаю снова ковырять в этом направлении...
     
  15. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    [ SteelRat: <font color="indigo]Four-F может есть какая мысль по этому поводу ?</font><!--color--> ]



    Нет. Я в сетевых делах не шарю.



    Насчет "прячет" и откуда взялось 6 байт, я вообще не понял. Если ты хучишь MajorFunction[xxx], то IMHO, если всё правильно реализовано BSOD'ов быть не должно. Слей, например, Device Filter Utility 1.12 с www.ntkernel.com и натрави на дровину. Она похучит MajorFunction[xxx] и никаких BSOD'ов не будет.
     
  16. leon

    leon New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    1
    Адрес:
    Ukraine
    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... Если скзать проще - ничего не взвращается ни хэндла, ни ошибки :dntknw:



    Leon ->

    Помогите люди добрые, пришлите на leon_pacyfier@mail.ru

    исходники с установкой соединения и посылкой инфы через открытый девайс (например Ndis или Tcp).
     
  17. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
  18. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    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");

    }
     
  19. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106