Выполните несколько экземпляр любого приложения Windows

Предположим, что некоторый автор осуществил свое Приложение Windows, чтобы быть единственным экземпляром. Там какой-либо путь состоит в том, чтобы сделать несколько экземпляром этого приложения (кроме выполнения в виртуальной машине или запроса автора переписать приложение)?

Если бы существует готовый инструмент, я хотел бы знать это. (Я попробовал sandboxie и Altiris SVS без удачи).

Если нет ничего там, я хочу программировать инструмент/взлом, который позволит мне сделать это. Я ищу указатели, где запустить - что будет включено, какие навыки были бы необходимы. У меня есть умеренные навыки программирования в C и Java.

Если это не может быть сделано, объясните почему.

Править: Я знаю, что это - плохая идея, но я все еще должен сделать это (по различным причинам). Я хочу универсальный путь, который работает на любое приложение и не представляет ошибки.

11
задан 26.10.2012, 16:30

3 ответа

Много приложений проверяют глобальный список процессов (с EnumProcesses, OpenProcess, GetModuleBaseName и подобными функциями) или список окон (с EnumWindows, EnumChildWindows).

Можно попытаться установить рычаг (см. образцы SetWindowsHookEx, CallNextHookEx, и т.д.) сцеплять те определенные вызовы API-функции из того приложения и замены запросило данные в ответ с Вашим для одурачивания приложения.

2
ответ дан 07.12.2019, 12:24

Файлы блокировки, именованные каналы и события синхронизации являются некоторыми распространенными способами, которыми приложения используют, чтобы проверить, что они - единственный рабочий экземпляр. Для работы вокруг файлов блокировки, необходимо было бы или виртуализировать файловую систему, рычаг в нее или сделать тщательно синхронизированный, удаляют (и это не может работать, если она блокирует файл, открытый также). Именованные каналы и события синхронизации будут намного более трудными, потому что Вы не имеете того же контроля снаружи приложения, которое Вы делаете с файлами.

1
ответ дан 07.12.2019, 12:24

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

В 16-разрядном Windows, когда программа запустилась, ОС передала ее уникальный дескриптор, названный HINSTANCE. Это было бы также передано HINSTANCE в настоящее время рабочего процесса с помощью того же исполняемого файла (если таковые имеются). В те дни это было, вероятно, наиболее распространенным способом к программе, чтобы знать, работала ли копия уже. В 32-разрядном Windows, с защищенной памятью, определенными для процесса адресными пространствами и концом кооперативной многозадачности, HINSTANCEs больше не нес то же значение.

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

4
ответ дан 07.12.2019, 12:24

Теги

Похожие вопросы