Не могу отловить NtCreateFile.

Тема в разделе "WASM.WIN32", создана пользователем hawk, 27 дек 2008.

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Хотя я рано обрадовался.При такой записи он блокирует обращение ко всем ветвям реестра по ключу
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" :-(
    Может кто знает , как именно NtCreateKey распознает в какую ветвь реестра идет обращение?
     
  2. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Вот выяснил (в том же ядре), что предворительно UNICODE_STRING надо передать в функцию RtlFormatCurrentUserKeyPath, но вот где взять библиотеку для ее использования не знаю, никто не подскажет?
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    ntdll.lib
     
  4. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Aspire а какой h файл нужно подключить?Я просто не знаю как ntdll.lib подключить к сорцу на WINDDK.Заранее благодарен.
     
  5. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    добавил в sources строку
    TARGETLIBS=C:\WINDDK\2600\ntdll.lib
    все равно не распознает эти вункции
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    hawk
    Эх, открываешь файл makefile.def, он в директории bin лежит, находишь там во это (по-моему)
    Код (Text):
    1. !ELSEIF "$(TARGETTYPE)" == "DRIVER"
    2. TARGETEXT=sys
    3. !if "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM"
    4. TARGETLIB=$(DDK_LIB_PATH)\wdm.lib
    5. !ELSEIF "$(DRIVERTYPE)" == "VXD"
    6. TARGETEXT=vxd
    7. !ELSE
    8. TARGETLIB=$(DDK_LIB_PATH)\ntoskrnl.lib $(DDK_LIB_PATH)\hal.lib $(DDK_LIB_PATH)\wmilib.lib
    9. !ENDIF
    и в строку TARGETLIB добавляешь $(DDK_LIB_PATH)\ntdll.lib
     
  7. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Все сделал как Вы сказали-не помогло.
    Выдает: error C4013: 'RtlFormatCurrentUserKeyPath' undefined; assuming extern returning int
    Не зная в чем может быть дело. В Google ничего не нарыл.
     
  8. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    hawk
    А у себя в дефайнах или в самом коде прототип RtlFormatCurrentUserKeyPath описывал?
    Обычно ошибка "error C4013: 'что-то там' undefined; assuming extern returning int" говорит о том, что компилятор просто не знает, что перед ним.
    Тем более что эта функция недокументирована.
    Попробуй в код добавить
    Код (Text):
    1. NTSYSAPI
    2. NTSTATUS
    3. NTAPI
    4. RtlFormatCurrentUserKeyPath(
    5.      OUT PUNICODE_STRING  RegistryPath );
     
  9. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Пдскажите, вот нарыл функцию SetRootKey , кто нибудь про нее чегонибудь знает?
     
  10. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Похоже, что перед передачей NtCreateKey происходит установка RootKey .У когонибудь есть мысли на этот счет?
     
  11. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Всё!Проблема решенна!Я вычислил!Ответ храниться перед sysenter.
    П.С.Кому интересно или не выходит пишите в личку.
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    hawk
    Может, еще денег за это попросишь? Так не делается. Если сам споткнулся на чем то - предупреди другого.
     
  13. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Aspire ну за деньги ты загнул. А вообще сори за тупость.
    Короче, я стал просматривать работу RegCreateKeyEx , которая в конечном счете передает параметры NtCreateKey.
    Перед переходом непосредственно к сервису, как известно в регистр eax помещается номер сервиса в таблице сервисов (в одной из), а в edx помещается указатель на передоваемые аргументы-т.е. указатель на конкретный адрес в стеке, после чего происходит sysentr.
    Так вот , я посмотрел , что именно передается NtCreateKey и проэкспереминтировал с разными HKEY.Сравнив результаты я пришел к выводу , что основная ветвь реестра передается в ObjectAttributes->RootDirectory;

    Я внес соответствующие изменения в драва, а именно.
    ..........
    HANDLE Root;
    ................
    Root=ObjectAttributes->RootDirectory;

    if (wcslen(wcsFileName) > 0)RtlInitUnicodeString(&uniFileName, wcsFileName);

    if((ULONG)Root==0x1C){


    if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) {
    status = STATUS_OBJECT_NAME_NOT_FOUND;
    goto done;
    }
    }

    done:
    .................
    В этом примере я отлавливаю обращения к HKEY_LOCAL_MACHINE;
    для него значение RootDirectory=0x1C, а точнее не для него , а для подключа \MACHINE.

    На уровне Native API реестр выглядит совсем по-другому. Вместо нескольких корневых псевдоключей HKEY_XXX используется единственный ключ “\REGISTRY” с двумя подключами “\USER” и “\MACHINE”:

    \REGISTRY
    \USER
    \.DEFAULT
    \S-FOO
    \S-BAR
    \MACHINE
    \HARDWARE
    \SAM
    \SECURITY
    \SOFTWARE
    \SYSTEM
    Вот собственно и все.
    А основной трабл который я допустил изначально , это то что я не задался вопросом о роли InitializeObjektAttributes, которая и переводит передоваемую ей обычно строку вида "\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" в привычную строку вида SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run и помещает ее в
    ObjectAttributes->ObjectName,а в соответсвиис \\REGISTRY\\MACHINE\\ или \\REGISTRY\\USER\\ выставляет значение ObjectAttributes->RootDirectory.
    Для ключа \REGISTRY\\USER\\ значение ObjectAttributes->RootDirectory=0x034.