2010-04-23 2 views
9

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

Если это возможно на уровне CLR, это было бы хорошо, но я готов пойти на родной, если потребуется.

+1

Вы должны посмотреть http://boxedapp.com/ это SDK для виртуализации приложений для разработчиков. – MastAvalons

ответ

3

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

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

+0

Прохладный! Посмотрите на это. Правильно ли я предполагаю, что перехват API не разрешен в 64-разрядных версиях Windows Vista и 7?Благодаря! –

+1

Тот же термин для двух разных вещей; вы можете «зацепить» за то, что вы можете вызвать свой код при возникновении определенного события («отладка» или «время выполнения») - работает только с событиями, которые ОС позволяет вам подключить). Тем не менее, вы не можете перезаписать dll, которые реализуют специфику реального события, в чем нуждается песочница. См. [Здесь] (http://en.wikipedia.org/wiki/Hooking) –

0

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

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

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

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

0

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

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