Как симулировать изменение файла?

Тема в разделе "WASM.WIN32", создана пользователем ant, 13 янв 2010.

  1. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Возникла одна идея. Для ее реализации требуется дать системе сигнал о том, что некий файл был изменен.
    Предполагается, что к файлу нет доступа ни на запись, ни на чтение(он зашифрован, заблокирован, нет прав и прочая).
    Я пытался брутфорсить google по словарю: file, notify, notification, "сообщения windows", filenotifychange и так далее. У Рихтера тоже не нашел ничего по сабжу. Если плохо искал, намекните, пожалуйста.
    И вообще, возможно ли такое сотворить из юзермода, с правми администратора?
    PS: С удивлением для себя выяснил, что ntfs потоки не совсем равноценны. "Основной" - главнее. То есть, при отсутствии прав на запись в файл к нему и дополнительный поток "прицепить" не удается.
    С точки зрения обывателя это логично. Но, мне показалось, что дополнительный поток ntfs должен быть вполне самостоятельным объектом. Не угадал-с.
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Функция notification была создана для удобства, в 2000-м ее по-моему не было. Соответственно если нужно фальшивое сообщение, то нужно просто смоделировать - инжект, хук и т.п. Не думаю, чтобы были какие-то сложности. т.к. функция не критична в плане безопасности.
     
  3. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    В справочнике Р.Саймона по Win 200 API ее на самом деле нет. В MSDN я ее тоже не нашел. Что за загадочная функция?
    1) Вообще, задачи защитить файл от изменений не стоИт. Требуется обмануть (в частном случае) виндовую "Службу восстановления системы", заставив ее создать копию файла в точке восстановления. Насколько я понял, она это делает , если файл был изменен.
    2) Интересует также общий случай. (сабж)
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, FilePath, NULL);

    Сработает для тех, кто подписался на события с помощью SHChangeNotifyRegister.
     
  5. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Насколько я понял, служба восстановления системы не подписана на указанные события. Вероятно, без ковыряния ядерных структур тут не обойтись. А там и без этого изврата можно обойтись. Халявы не вышло :) В любом случае, спасибо.
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Cлужба восстановления системы использует FindFirstChangeNotification,
     
  7. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Вот именно что "служба"
     
  8. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Если быть точным, то не служба, а winlogon.exe Нет никаких ограничений на использование этого API из обычного процесса.
     
  9. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Делал так:
    Код (Text):
    1.     invoke SHChangeNotify,SHCNE_DELETE,SHCNF_PATH, addr f,0
    2.     invoke GetLastError
    3.     invoke dwtoa, eax, addr TempBuff
    Каспер сказал, что это страшный сцуко zbot.gen

    Кроме того, имеем ERROR_INVALID_HANDLE
     
  10. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Хех, Касперу почему-то не доставляет отсутствие ExitProcess.
    Результат пока таков:
    После SHCNE_DELETE подопытный файл перестает отображаться в окне проводника, пока не нажмешь F5. Интересный эффект. Но, в ресторы файл попадает только тогда, когда он был изменен, а не удален, поменял атрибуты и проч.
    Здесь http://msdn.microsoft.com/en-us/library/bb762118(VS.85).aspx подходящего сообщения я что-то не нашел.
     
  11. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    SHCNE_UPDATEITEM
     
  12. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    SHCNE_ATTRIBUTES
     
  13. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    В том и дело, SHCNE_UPDATEITEM пробовал, не срабатывает. SHCNE_ATTRIBUTES пробовал тоже, на всякий случай. Хотя, даже если менять атрибуты через проводник - не срабатывает.
    Хотя, судя по реакции на SHCNE_DELETE - должно работать?
    Меня смущает SHChangeNotify, которую я использую и FindFirstChangeNotification. Так и должно быть?
     
  14. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Похоже, смущало правильно. Сделал так, что одна программа регистрируется получателем уведомлений ( FindFirstChangeNotification, WaitForSingleObject), другая посылает уведомления через SHChangeNotify. В итоге - ноль реакции. Если изменяю файл на самом деле, реакция есть. Сейчас вот дочитаю msdn...
     
  15. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    SHChangeNotify работает на уровне shell'a. Может ловить не только файлы но и любые shell items
    Ловится через SHChangeNotifyRegister

    FindFirstChangeNotification работает на уровне файловой системы и ловит только файлы/директории.
    Ловится через Wait функции.

    Перекрестно эти фунуции не работают. Т.е FindFirstChangeNotification не поймает SHChangeNotify