- - * - 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):

  1. Берем opera.exe (копию), кидаем на qview.exe. В результате он открывается в qview.
  2. Жмем F4, пока не окажемся в режиме HEX (думаю, догадаетесь, где текстовый режим, где хекс, а где ассемблер ;)
  3. Жмем Ctrl+Home (На всякий случай - вдруг мы не в начале файла находимся)
  4. Жмем F7 и в строке Hex пишем нашу последовательность байт, какую искать хотим. И жмем Ентер. (На то безобразие, которое при наборе появляется в с троке ASCII внимания не обращаем - так надо :)
  5. Если все правильно - QView найдет эту последовательность и остановится в этом месте.
  6. Чтобы проверить, что она единственная, жмем Shift+F2 (желательный, хотя и не обязательный шаг)
  7. Переключаемся в режим редактирования (если мы уже не в нем). Для этого при нажатой Alt смотрим, что написано в нижней строке около F3. Если EditOFF - значит мы в рид онли, тогда жмем этот самый F3. Если уже EditON, значит мы уже в режиме редактирования.
  8. Теперь аккуратно меняем два первых байта (3d b7) на b8 01
  9. Сохраняем изменения - AltF9
  10. И выходим - Esc или F10

Все. Теперь Опера независимо от того, запущена она или нет, будет запускать свою отдельную копию.

Рекомендации:

Поскольку для нормальной работы всетаки лучше, чтобы механизм отслеживания копий работал, как ему положено, то я рекомендую просто сделать второй екзешник, назвать его, допустим, 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 - * - - LJLiveJournal
PFPhotoFile