- - * - WhiteUnicorn - * - -




* #WhiteUnicorn/ StartPage/ Tricks/ Opera_Search_Add >


Поисковики в пятой Опере, дополнение.

(Если вы не знаете, что такое Опера, то вам сначала сюда :)

Чтобы понять, о чем идет речь здесь, лучше начать с основного солюшена: Как научить пятую Оперу пользоваться правильными поисковиками :)

Проблема:

Она проявилась весьма странным образом. :-/

Оперу я обычно ставлю так: сначала на комп, имя которого Gluckodrom. Если мне нравится то, что я вижу, то я просто копирую весь каталог с новой Оперой на свой рабочий компьютер (на работе), исправляю пути в opera.ini, перезаписываю нужные .dat и .adr файлы и пользуюсь. Потом уношу тот же каталог домой и тоже без инсталляции пользуюсь. Всегда все работало замечательно.

Вдруг, откуда ни возьмись, появился глюк. Появился только на моем рабочем компе. Дома его не было и на Глюкодроме его тоже не было. На моем сайте все пункты помечены звездочками, подсвечивающимися с помощью JavaScript скрипта, написнного мной очень давно и подключаемого ко всем страницам через заголовок хтмл файла. Он уже давным давно обкатан и не глючил никогда и нигде. И вот сейчас я заметила, что в Опере, начиная с 5.10en, он перестал работать. Звездочки при наведении мыши перестали подсвечиваться. Когда я включила отображение ошибок скриптов, то увидела не лезущую ни в какие ворота ошибку - что объект Image то ли не существует, толи не является объектом, не помню точно. Чего я только не пробовала.. На этом же компьютере в версиях Оперы до 5.1х этот же скрипт работал (в других браузерах тоже).

В конце концов мне это надоело и я решила забить на проблему, пока она мне не очень мешает. И вдруг, на сайте "Абсолютно все о браузере Опера" я увидела упоминание о том, что якобы строки поисковиков используются в Опере в других местах, для других целей, в том числе они учавствуют в выводе страниц и в работе скриптов. 8-/

Вот тут то я наконец поняла, чем же таким отличаются Оперы на рабочем, домашнем и глюкодромном компах - на рабочем у меня были прописаны мои поисковики. Причем я с некоторых пор решила менять не собственно поисковики, а элементы поиска Image, MPeg3/Audio и Video, поскольку я ими все равно не пользуюсь.

Проверка доказала, что да, патченный мной екзешник дает глюк, а непатченный - нет.

Конечно, я не могла оставить этого ;) и довольно быстро выяснилось, что это тоже не является большой проблемой (во всяком случае пока).

Солюшен:

К сожалению, солюшен не для всех :-/ Сорри, но нет времени писАть автоматический патч, тем более для каждой следующей версии его пришлось бы апгрейдить, поэтому я просто описываю процесс, как найти и исправить проблему. Кто такие вещи делал, тому этого будет более чем достаточно. А дальше может кто и патч напишет.

Итак, проверяем, что Опера у нас не запущена, делаем резервную копию Opera.exe (мало ли чего, мы же его потом патчить будем..) и открываем opera.exe в IDA.

После того, как IDA завершит автоанализ, переходим в то место, где лежат строки поисковиков. Это выглядит вот так (кусочек; имена переменных и функций ужЕ мои):

0058C448 offoffGoogle    dd offset offGoogle     ; DATA XREF: sub_44C40E+1FFr
0058C448                                         ; sub_44C40E+22Br
0058C44C szSrchVideo     db 'http://service.bfast.com/bfast/click?siteid=30656059&bfpage='
0058C44C                 db 'multimedia_smy&bfmid=22218516&user=befree&pg=q&stype=svideo&'
0058C44C                 db 'q=%s&nbg=%i',0
0058C4D0 hkVideo         db 'v',0
0058C4D2                 align 4
0058C4D4 szVideo         db 'Video',0
0058C4DA                 align 4
0058C4DC szSrchImg       db 'http://service.bfast.com/bfast/click?siteid=30656059&bfpage='
0058C4DC                 db 'multimedia_smy&bfmid=22218516&user=befree&pg=q&stype=simage&'
0058C4DC                 db 'q=%s&nbg=%i',0
0058C560 hkImg           db 'i',0
0058C562                 align 4
0058C564 szImg           db 'Image',0            ; DATA XREF: RegOperaTypes+91o
0058C564                                         ; JSParser+350o

Сразу настораживает "несимметричность" обращений к разным участкам строк. Мы же знаем, что поисковики юзаются все вместе. Логично было бы увидеть получение указателя на начало всего блока или на его конец. Или на каждый из поисковиков. Или даже на каждый элемент структуры. Но не так, выборочно - ни с того, ни с сего обращаемся к слову Image, при этом игнорируем Video и Mp3/Audio.

Теперь надо посмотреть, какие ссылки "честные", а какие - для наведения сложноуловимых глюков.

По характеру кода в районе RegOperaTypes и JSParser легко догадаться, что к поиску инфы они ну никаким боком ;) Кроме того, по JSParser сразу стала ясной и природа моего глюка с JavaScript. Поскольку вместо слова Image в моем патченном екзешнике сидит слово Yandex, то у меня и не было объекта Image :)

Думаю, уже понятно, как это пофиксить. Допустим, я хочу все таки исправить это слово Image. Но оно используется в парсере джава скрипт, который я обозвала JSParser. Значит ищем в екзешнике еще вхождение слова Image, оканчивающееся нулевым символом, и "переводим стрелку" на него ;). Мне показалось подходящим слово Image, расположенное по смещению 58db06. Теперь, с помощью старого доброго qview просто меняю 58C564h на 58db06 вот тут:

0044F11C   push    58C564h
004AEE98   mov     ebp, 58C564h

(Это местА, которые мне показала Ида и которые были признаны мной "левыми" ссылками на слово Image)

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

Yes ! It worked ! =)

Опера запускается, поисковики работают, скрипт работает.

Итак, что надо сделать, чтобы все работало с теми исправлениями, которые делаете вы для себя:

  1. Берем opera.exe нужной нам версии и дизассемблируем его с помощью IDA
  2. Смотрим, откуда идут ссылки "поперек дороги", т.е. где зачем то стоят дата референсы на вещи типа Image, t, Google etc.
  3. Идем туда, анализируем окружающий код и делаем вывод, действительно ли это "троянский" :) вызов.
  4. Ищем в opera.exe другое подходящее вхождение такого же элемента. Если нету, то ищем свободное место и просто дописываем сами.
  5. Переводим стрелку "троянского" вызова в другое место.
  6. Когда больше "левых" референсов на текущий элемент нет, исправляем его, как нам надо.
  7. Ессно, проверяем, все ли сработало, как нам надо.

Сложно ? ИМХО нет ;) Главное, это работает. Пока работает...


(c) White Unicorn
Любая часть этого документа может быть скопирована любым из существующих способов :)
(Но если вы оставите в форуме свои замечания по поводу успешного / неуспешного применения солюшена, то это будет совсем хорошо :)




* #WhiteUnicorn/ StartPage/ Tricks/ Opera_Search_Add >



- - * - Anastasija aka WhiteUnicorn - * - - LJLiveJournal
PFPhotoFile