2013-06-17 3 views
5

У нас есть стороннее родное приложение (написанное на C, я считаю), которое мы хотим запустить несколькими экземплярами на машине.Как создать «песочницу» с виртуализированным реестром для приложения?

однако приложение считывает и записывает из одного конкретного раздела реестра, чтобы найти местоположение конфигурационного файла. Он постоянно считывает это местоположение во время его работы. Раздел реестра находится в HKLM. это означает, что если мы попробуем запустить 2 разных экземпляра приложения с двумя разными местоположениями для файла конфигурации, то процессы протекают друг на друга.

Возможно ли «виртуализировать» реестр (или запускать каждый процесс в песочнице), который обрабатывают процессы, чтобы они оба могли думать, что они пишут в одном месте, но на самом деле они пишут и читают откуда-то разные, и они не будут наступать друг на друга.

ответ

5

Есть несколько вариантов виртуализировать программы:
https://en.wikipedia.org/wiki/Portable_application_creators

Создания собственного программного обеспечения для виртуализации является гораздо более сложным и требует всех грубые по программированию и закреплять библиотечные вызовы с использованием Windows SDK.

Однако более простой вариант, который не требует установки и запуска дополнительного программного обеспечения для каждой копии программы, я предлагаю создать несколько копий программы и шестнадцатеричное редактирование каждого исполняемого файла.

сделать столько копий приложения, как вам нужно запустить, а затем открыть файл приложения в шестнадцатеричном редакторе и найдите имя раздела реестра, а именно:
HKLM \ System \ CurrentControlSet \ Control \ Session Manager

Затем измените последний байт цифры для каждой другой версии (1 байт, 0-9), то есть:
HKLM \ System \ CurrentControlSet \ Control \ сессии Manage1
HKLM \ System \ CurrentControlSet \ Control \ сессии Manage2
HKLM \ System \ CurrentControlSet \ Control \ Session Manage3

более 10 отличий (2 байта, 00-99) использовать последние два байта:
HKLM \ System \ CurrentControlSet \ Control \ Session Manag01
HKLM \ System \ CurrentControlSet \ Control \ Session Manag02
HKLM \ System \ CurrentControlSet \ Control \ Session Manag03

+0

интересная идея. Я проверил dll и нашел в нем раздел реестра, поэтому, когда я получу шанс, я проверю это. Не идеальное решение (поскольку мы хотели бы быть более динамичным с процессом создания процесса), но это может работать и может быть простым. –

+0

Я только что протестировал это и, похоже, сработал. Благодарю. Я буду ждать других предложений, но это должно решить нашу проблему, даже если никакое другое решение не поступит. Благодаря! –

+0

Приветствую вас, я рад, что смог помочь вам! –

1

Да, вы можете виртуализировать приложение, эта технология называется Application Virtualization. Попробуйте http://www.cameyo.com/. Cameyo - это программное обеспечение, используемое для создания виртуального приложения.

Виртуальное приложение - это один EXE-файл, содержащий все приложение, включая файлы, библиотеки DLL и реестр. Виртуальные приложения изолированы от вашей системы и могут быть скопированы. & перемещен с одного компьютера на другой без установки.

3

Хотя решение от Joshua будет работать для этого конкретного приложения, оно может не работать для других (например, когда путь реестра сконструирован в коде или когда приложение подписано).

Поэтому я предлагаю использовать DLL injection и перехватить вызовы на RegOpenKey(Ex), RegCreateKey(Ex) и т. Д.Таким образом, вы можете возиться с реестром, прежде чем передавать вызов до реального Windows Advapi32.dll.

Некоторые большие статьи о API подсекать:

API Hooking and DLL Injection on Windows

API Hooking with MS Detours

1

Да, Sandboxie может запускать несколько экземпляров приложения, каждый в своем собственном «песочнице», который он считает, что все вселенная. Но вы также можете получить доступ к данным напрямую обычными способами, если вам нужно.

Таким образом, Sandboxie позволяет просматривать все изменения реестра, которые были сделаны в операциях приложения, и вы можете отбросить их обратно, если хотите.