Как ProcessExplorer получает список объектов, их имена

Тема в разделе "WASM.NT.KERNEL", создана пользователем billi12, 11 ноя 2011.

  1. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Сабж. Особенно интересует получение имен для ключей реестра.

    Я так понимаю, они используют NtQuerySystemInformation с SystemHandleInformation, потом пробегаются по хэндлам, открывая каждый NtQueryObject. Там еще замут с зависанием при получении имени в случае, если GrantedAccess определенный.

    Но мне ненад держать весь список хэндлов всех процессов. Что если просто сделать запрос NtQueryObject с ObjectBasicInformation, там проверить GrantedAccess, а потом и гляди ObjectNameInformation?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    billi12
    Не совсем понятно, в чем проблема. И какая цель вообще? :)

    Можно получить все HANDLE'ы, затем оставить только те, что ссылаются на ключи реестра и делать с ними все что хочется.
     
  3. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Какова ситуация. Перехватываю ССДТ. Необходимо получить полные пути к ключам. Имена открываемых/создаваемых ключей получаю без проблем. Но бывают ключи вида \Registry\ololo\konb_v_palbto, которые норм воспринимаются, а бывают \CSID\{многа_цифр}, у которых есть приоткрый хэндл. А нужно в идеале выводить HKLM\trololo...

    Сейчас попробовал все сделать с помощью ObReferenceObjectByHandle. Вариант не катит, т.к. при обычном нажатии правой кнопки на раб. столе менюшка появляется секунды через 3-4.

    А вариант с полным перечислением...Что будет когда появится новый процесс? Ведь он может открыть какойто ключ када угодно. Хелп, хелп. Труляля.

    Мысль - ведь все эти ключики типа HKLM - это заранее определенные хэндлы? Все ключи открываются от них?
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    billi12
    Открой для себя CmRegisterCallback().
    И ещё ObQueryNameString() тоже не забудь.
    По поводу путей ключей - было уже, в поиск.
     
  5. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Щас попробую, спасибо. А на что еще коллбэк рутины вешаются?
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    О, теперь ты понимаешь всю прелесть власти, - добро пожаловать в клуб.
    По теме: лучше, если скажешь, на что тебе надо, разные есть, особенно начиная с Vista SP1.
     
  7. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    =) Ну я пытаюсь сделать монитор действий приложений в области работы с файлами и реестром. С драйверами можно сказать незнаком, поэтому все через пень-колоду. Впринципе я create/read/write/openfile отлавливаю, для реестра тоже, но ситуация с именами печалит. Щас надеюсь норм получится с тем, что вы посоветовали для реестра.

    В идеале бы ловить попытки послать почту, скачать файл. Здесь могут помочь эти функции? Целевая винда - ХР, 32
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В таком случае - учить основы и не повторять моих ошибок.
    Слышишь?! Я сказал, насмерть стоять, но не повторять моих ошибок!

    Драйвер TDI-фильтр.
     
  9. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Оффтоп наверное...но. Я читал в блоге Вашу историю) В чем Ваша ошибка?
    Про себя - щас диплом то докалякаю, а как потом жизнь сложится - посмотрим...я усидчивый, если над - с нуля начну. Поэтому щас главное - примитивное работающее решение.
     
  10. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, поэтому завязываем.
    Ниже всё, что я хотел сказать.

    Проблема в упущенном времени.
    Сейчас я мог бы уметь в 3 раза больше.
    Но я предпочёл "быстрый старт" и умею меньше.

    Если брать нашу специальность, то...
    Одни выходят из ВУЗа готовыми специалистами.
    Другие к диплому не знают за что браться и ищут ответы.
     
  11. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Да, согласен. Но как-то все хотелось совместить хорошую успеваемость, личную жизнь, хобби. Видно это не моё, раз нердом не стал) Тем не менее, проблема есть и надо её решать, так ведь? Спасибо Вам за советы, как кернелмодные, так и жизненные.
     
  12. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Это ппц...облазил, что можно. Сделал с этой функцией. Бсод и хоть тресни.

    Код (Text):
    1. NTSTATUS PostOpenKey(IN PREG_POST_OPEN_KEY_INFORMATION info)
    2. {
    3.     POBJECT_NAME_INFORMATION on;
    4.     ULONG l=0;
    5.     NTSTATUS st;
    6.     PVOID ObjNameBuf;
    7.    
    8.     ObjNameBuf = ExAllocatePoolWithTag(PagedPool, 512, 'blah');
    9.     RtlZeroMemory(ObjNameBuf, 512);
    10.  
    11.     on = (POBJECT_NAME_INFORMATION)ObjNameBuf;
    12.     on->Name.MaximumLength = 512 - sizeof(OBJECT_NAME_INFORMATION);
    13.     st = ObQueryNameString(info->Object,on,512,&l);
    14.  
    15.     ExFreePool(ObjNameBuf);
    16.  
    17.     return STATUS_SUCCESS;
    18. }
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Поле info->Status надо проверять на успех макросом NT_SUCCESS().
    Если ошибка, то указатель по адресу info->Object невалидный и трогать его нельзя.
     
  14. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А BSoD точно здесь? Что показывает '!analyze -v'?
     
  15. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Как бы дико не звучало, я без отладчика. Поставил проверку NT_SUCCESS, бсод на ней стал выскакивать. Добавил в DriverEntry SeSinglePrivilegeCheck (dbg_priv, UserMode) c LUID dbg_priv = { SE_DEBUG_PRIVILEGE, 0 }; Теперь он успешно проходит NT_SUCCESS, нормально выделяет/удаляет буфер. Однозначно вылет на ObQueryNameString((
     
  16. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    billi12
    дамп хоть скинь
     
  17. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Анализировать дамп с помощью kdfe? Для него нужен complete дамп?
    BlueScreenView выдает следующее

    Код (Text):
    1. Bug Check String                 Bug Check Code     Parameter 1     Parameter 2     Parameter 3
    2. PAGE_FAULT_IN_NONPAGED_AREA 0x10000050             0x9bc8b868   0x00000008  0x9bc8b868
    3.  
    4. Address In Stack    From Address    To Address  Size            Time Stamp  
    5. mystracer.sys+f58964    0xb3066000  0xb3076980  0x00010980  0x4ebe58a4
    6. ntoskrnl.exe+e38c0  0x804d7000  0x806d0a80  0x001f9a80   0x4d00d4fb
     
  18. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В папке windows\minidump должен создаться файл Mini_DATE.dmp. В нем можно посмотреть более детально, что произошло. Без него вообще трудно что-то сказать.
     
  19. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    ))А я из него и привел кусок.Я залил на ifolder пару последних минидампов http://ifolder.ru/26902148
     
  20. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Судя по всему, ф-ии ObQueryNameString передается неправильный объект (каким-то образом испорчен адрес). ObQueryNameString пытается вызвать обработчик QueryNameProcedure, описываемый типом, в результате чего управление передается в космос. Короче, то, что передается в ObQueryNameString в качестве первого параметра, не является адресом объекта.