WhiteUnicorn |
| |
#WhiteUnicorn/ StartPage/ Tricks/ Opera_MultiCopy > | |
|
(если вы не знаете, что такое Опера, то вам сначала сюда :)
Солюшен подходит для _любой_ версии Оперы, начиная с 3.51 (меньше у меня нет), и заканчивая 5.02 (на момент написания солюшена это последняя версия). Скорее всего, это будет работать во всех более старых и более новых версиях Оперы. И мало того, очень может быть, это будет работать не только для Оперы :)
Если вы вебдизайнер, то знаете, что сайт надо тестировать в разных версиях браузеров даже одного производителя. Чтобы быть уверенным, что он нормально смотрится в них. Но здесь мы сталкиваемся с одной досадной проблемой - многие прогаммы при запуске проверяют, не запущены ли они уже. И если запущены - то не запускают еще копий себя. Вообще то это есть хорошо и правильно, но в данном конкретном случае нам это мешает запустить одновременно, например, Оперу 3.62, 4.02 и 5.02 (три самые распространенные на настоящий момент версии)
Для того, чтобы воспользоваться этим солюшеном, вам надо хоть иметь хоть чуть-чуть опыта работы с хекс-редактором. У кого еще нет этой полезной программки, рекомендую завести - лишней точно не будет. Для начала видимо проще всего взять QView - маленький но злой :) и к тому же бесплатный. Живет здесь: http://www.enlight.ru/qview
Итак, проверяем, что Опера у нас не запущена, делаем резервную копию Opera.exe (мало ли чего..) и открываем opera.exe в qview, hiew или чем вы там пользуетесь для редактирования екзешников.
Поскольку код, проверяющий запуск второй версии программы - стандартный, то это сработает для любой версии Оперы (из тех, какие я в руках держала). Ищем вот такую последовательность байт:
3d b7 00 00 00
Она должна встретиться в файле только один раз. Если это не так - значит или не так ищете или пишите мне - разберемся, что у вас за екзешник такой нестандартный :)
Нашли ? Теперь меняем ее вот на такую последовательность:
b8 01 00 00 00
(Да, меняем только первые два байта, остальные так нулями и оставляем.)
Для тех, кто с хекс редактором не работал, вот что надо делать (предполагается, что вы используете QView):
Все. Теперь Опера независимо от того, запущена она или нет, будет запускать свою отдельную копию.
Поскольку для нормальной работы всетаки лучше, чтобы механизм отслеживания копий работал, как ему положено, то я рекомендую просто сделать второй екзешник, назвать его, допустим, opera_multi.exe и его пропатчить. А пользоваться нормальной Оперой. Если же надо запустить вторую, третью etc копии - тогда запускать ужЕ эту патченную.
Для старых версий Оперы возможны глюки из за пересечения ини файлов, они раньше держались в каталоге windows. Поэтому во избежание ненужных неприятностей запускайте все эти копии оперы с явным указанием имени нужного ини файла. И файлов этих ессно держите столько, сколько разных Опер вы собираетесь использовать.
Для тех, кому интересно, что за магические байты мы меняем :)
Когда запускается Опера (и любая другая прога тоже), выполняется некоторый стартап код, который как правило одинаковый или очень близкий для большинства программ. В нем в том числе может проводится и эта проверка на копии.
Вот кусок из Оперного екзешника версии 5.02, в три приближения доходим до нужного места. Промежуточные куски я пропускаю, чтобы сэкономить место - если надо, сами посмотрите прямо в файле:
Самое начало, точка входа:
0013FD02: 55 push ebp 0013FD03: 8BEC mov ebp,esp [skip] 0013FD28: FF1500035600 call dword ptr [00560300] ; KERNEL32.dll,GetVersion [skip] 0013FD76: FF15FC025600 call dword ptr [005602FC] ; KERNEL32.dll,GetCommandLineA [skip] 0013FDA1: FF15F8025600 call dword ptr [005602F8] ; KERNEL32.dll,GetStartupInfoA [skip] 0013FDC4: FF15D0015600 call dword ptr [005601D0] ; KERNEL32.dll,GetModuleHandleA 0013FDCA: 50 push eax 0013FDCB: E8D0BCEFFF call 0003BAA0 ; Нам сюда
Промежуточная функция (в старых версиях этого куска нет BTW, сразу идет следующий, без промежуточного вызова.)
0003BAA0: FF742410 push dword ptr [esp+10] 0003BAA4: FF742410 push dword ptr [esp+10] 0003BAA8: FF742410 push dword ptr [esp+10] 0003BAAC: FF742410 push dword ptr [esp+10] 0003BAB0: E84DC88900 call 008D8302 ; Нам сюда
И вот тут наши магические байты меняются:
0003BABB: 55 push ebp 0003BABC: 8BEC mov ebp,esp [skip] 0003BACC: FF1570075600 call dword ptr [00560770] ; ole32.dll,CoInitialize [skip] 0003BB10: FF15AC015600 call dword ptr [005601AC] ; KERNEL32.dll,CreateMutexA 0003BB16: 3BC3 cmp eax,ebx 0003BB18: 8945EC mov dword ptr [ebp-14],eax 0003BB1B: 0F8435060000 jz 0003C156 0003BB21: FF1598015600 call dword ptr [00560198] ; KERNEL32.dll,GetLastError 0003BB27: 3DB7000000 cmp eax,000000B7 ; если GetLastError вернула 0b7h 0003BB2C: 0F8424060000 jz 0003C156 ; то сваливаем отсюда и новую копию не запускаем
Если в строке
0003BB27: 3DB7000000 cmp eax,000000B7
Поменять байты, как мы это делаем, то мы получим вместо cmp eax,b7h вот что:
0003BB27: B801000000 mov eax,00000001
А после выполнения этой инструкции у нас ZeroFlag железно будет не ноль :) И условный переход не сработает.
Таким образом мы всегда будем выполняться так, как если бы Опера запускалась в первый раз.
(c) White Unicorn
Любая часть этого документа может быть скопирована любым из существующих способов :)
(Но если вы оставите в форуме свои замечания по поводу успешного / неуспешного применения солюшена, то это будет совсем хорошо :)
| |
#WhiteUnicorn/ StartPage/ Tricks/ Opera_MultiCopy > | |
|
| ||
Anastasija aka WhiteUnicorn |
LiveJournal PhotoFile |
|
|