Pull to refresh

Comments 21

Такая крутая статья, да из песочницы!? Очень интересно, пишите ещё что-нибудь этакое.
Кстати, теги сейчас более читабельными стали ;)
Я правильно понял, что если назначить перехват на процесс с правами SYSTEM то и перехватчик запустится с ними?
Да, именно так. IFEO подменяет исключительно то, какой файл будет исполняться.
… независимо от пользователя, ибо ветка HKEY_LOCAL_MACHINE, где хранятся настройки IFEO, — общая для всех.
с проблемой консоли стоит попробовать AttachConsole(dwProcessId); чтобы подцепиться к консоли родительского процесса, тогда консольные приложения смогут найти ту имеющуюся консоль вместо создания новой.

Спасибо! Было интересно почитать.

У меня уже давно идея в голове витает, просто озвучу.

Есть программное обеспечение, которое перехватывает вызовы работы с файлами и подменяет файл на указанный.
Например: требуется открыть c:\mypath\settings\bla.cfg, вместо него открывается z:\portable\mypath\setting\bla.cfg
аналогичный алгоритм для путей т.е. подменяем c:\mypath\* на z:\portable\mypath\*

И ещё одна возможность: перехват обращений к реестру и записи их в файл.

Может подскажите что то, куда копать?
Для первого удобно использовать символические ссылки (если только не требуется хранить одновременно «настоящий» и «поддельный» файлы).

Для реестра — смотря что имеется в виду. Если просто мониторинг, то есть Process Explorer, который это умеет. Если надо, чтобы вместо реестра всё записывалось в файл (и потом читалось из этого же файла), то даже не знаю. Если верить MSDN, реестр тоже поддерживает символические ссылки, с предупреждением «использовать, только если вопрос жизни и смерти». Если найти инструмент, умеющий их создавать (regedit не умеет), в HKEY_USERS загрузить внешний файл-куст, а вместо нужного ключа создать символическую ссылку на этот загруженный куст, может быть, это и сработает, но файл будет в специальном бинарном реестровом формате. Подменить реестр, скажем, на INI-файлы так не получится.

Есть ещё возможность глобальных хуков, перехватывающих обращения к WinAPI-функциям, но это надо программировать. Не знаю, существуют ли готовые программы, реализующие такую подмену.
• Да, символические ссылки это хорошая идея.
• Поправочка, не Process Explorer, а Process Monitor. Я и сам их долго путал.
• regedit.exe вообще мало что умеет, на подобные случаи есть консольная утилита reg.exe
Тьфу ты, я был уверен, что написал именно Monitor, а оказалось, что пальцы самостоятельно набили Explorer. :-)

Интересный вопрос. Здесь я вижу несколько возможностей, по мере увеличения сложности:


1) Вам однозначно стоит посмотреть Sandboxie. Он выполняет полноценную виртуализацию файловой системы и реестра для приложений, запущенных внутри песочницы. При некоторой изобретательности можно подменить что угодно чем угодно. Все отличия реального реестра от виртуального он хранит в стандартном HIVE файле, экспортировать их в .reg — не проблема. Если возникнут какие-то конкретные сложности — пишите в личку, я с радостью отвечу, это моя любимая тема.


2) Можно создать виртуальный диск используя Dokan. Все обращения к нему можно будет легко самостоятельно обрабатывать из пользовательского режима как вздумается (например, перенаправляя на другие диски). Но только к нему, а не к системным дискам. И придётся кодить.


3) Если внедрить свою dll в чужой процесс, то можно подменить нужные системные вызовы для работы с файловой системой и реестром, и на ходу менять пути, к которым обращается программа. Здесь тоже придётся кодить, и больше. Для реализации на Delphi есть advApiHook.pas.


4) Написать свой минифильтр файловой системы. см. Как написать свою «песочницу». Это уже довольно жестоко.

В вашей версии advApiHook в некоторых местах необходимо добавить VirtualProtect (например, в HookCode). Без этого проблемы с DEP.
О как. Было непросто найти и эту версию, не подскажите, случайно, где взять более правильную?
Я сам потихоньку исправлял ошибки, когда находил (еще лет 8 назад). Не уверен, что есть какая-то публичная новая версия, но было бы здорово иметь поддерживаемый сообществом репозиторий на github. Но, к сожалению, популярность Delphi уже не та, да и направление не самое массовое.
Ооо, это великолепно.

Мои пути скорее всего 3 и 4, люблю велосипеды.
Сандбоксие взял в копилку к тспвиев, филемон и регмону.

Благодарствую.
В случае с путем к файлу перехватывайте NtCreateFile
Ну собственно даже этим механизмом это можно реализовать, просто при вызове CreateProcess создавать его с флагом CREATE_SUSPENDED, и потом через CreateRemoteThread подгрузить туда свою ДЛЛку, которая будет хучить CreateFile.
Авто, если шаришь в ассемблере, скачай покапайся в исходниках Kernel Mode Driver Development Kit (KmdKit) от Four-F, много чего интересно для себя найдёшь.
Если кому интересно: добавил в утилиту возможность прописаться в контекстном меню проводника, чтобы можно было выбрать exe файл и назначить на него действие буквально в пару кликов. Релиз на Гитхабе.

Скриншот
image
Кстати, проводник Windows тоже знает об этой проблеме
Это какая версия Windows настолько умная? Окошко точно родное проводниковое?
В 8.1 файл program.exe создаётся/переименовывается без предупреждений
А это он только при своём старте проверяет наличие такого файла. То есть да, создавать и переименовывать будет без предупреждений, но если при загрузке проводник найдёт его — скажет. На Windows 7, по крайней мере.
Sign up to leave a comment.

Articles