Как реализована виртуализация приложений? - PullRequest
9 голосов
/ 23 апреля 2010

Я пытаюсь понять, как работают такие программы, как App-V и sandboxie (http://www.sandboxie.com/)). Но я не могу придумать ничего такого, что могло бы сделать это возможнымКак они перехватывают вызовы API и обманывают целевое программное обеспечение? Если кто-то скажет, что это просто магия и пикси-пыль, я бы им поверил. Серьезно, есть ли какие-либо документы, обсуждающие решения этой проблемы?* Если это возможно на уровне CLR, то это было бы хорошо, но я готов перейти на родной язык, если потребуется.

Ответы [ 3 ]

3 голосов
/ 23 апреля 2010

Sandboxie делает это, по сути, внедряя код в ядро ​​Windows API, так же, как это делает вирус (именно поэтому Vista x64 предотвращает такое поведение и почему Sandboxie не работает в этой ОС).

Здесь - проект, объясняющий перехват API.Я узнал, как все это работает, изучив исходный код для Metamod: Source (используется для SourceMod для CounterStrike: Source :))

0 голосов
/ 27 апреля 2010

Посетите страницу Википедии по Виртуализация X86 , на которой обсуждается виртуализация программного обеспечения (ранние версии VMWare, Wine, Sandboxie и, в некоторой степени, App-V) и более современные аппаратная виртуализация (Hyper-V, VMWare и др.).

Я предполагаю, что вы ищете специально для программную виртуализацию , как при использовании .NET (или любой CLR), которую выВы уже в какой-то степени абстрагируетесь от архитектуры процессора, особенно с целью AnyCPU.

0 голосов
/ 23 апреля 2010

Я не знаю, как MS это сделал, но вот основная теория одного способа сделать это ...

То, что вы хотите сделать, это подключиться к системным вызовам (подобно цепочке впрерывание).

  1. Произошел системный вызов.
  2. Ваш пользовательский перехват выполняется.
  3. Если этот системный вызов не требует специальной обработки, продолжайте.В противном случае он требует специальной обработки и перейдет к шагу 4.
  4. Получите указатель стека, указатель инструкций и все остальное из стека и создайте новый кадр стека, чтобы отправить вас обратно в свой пользовательский код в пользовательской области..
  5. Делайте ваши массивы данных, путей и прочего на земле пользователя.Таким образом, если базовая ОС изменяется, этот код не нужно обновлять [как часто].
  6. После завершения массирования данных снова выполните системный вызов.
  7. Ваше пользовательское прерывание выполняется снова, но он должен обнаружить, что вы звоните со своего уровня помощника пользователя-земли и пропустить вызов до конца.Для установки правильных адресов возврата могут потребоваться некоторые манипуляции с фреймами стека.
  8. Выполняется обычный системный вызов.
  9. Когда системный вызов возвращается, фрейм стека должен отправить вас обратно в поток обычной программы.,

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...