| ИсследуемСначала выясним куда этот баннер рисуется и какойпрограммный модуль им рулит. Достаем MS Spy++ (у всех есть Visual C++?), в нем \"Search->Find Window\", тянем прицел и отпускаем его над баннером. Окно нашли, теперь клик по \"OK\" в диалоге \"Find Window\". Смотрим в открывшемся диалоге caption окна-баннера: \"NwAnimatedGif\" и на вкладку \"процессы\", щелкаем по ThreadID - высветилось имя модуля, создавшего окно (и имя это - ODIGO). HWND 0B24 ; сегодня оно так называетсяWindow HandlehQueueSZQOwnerClass NameWindow Procedure0B24 (2)345732ODIGOAfx:400000:8:89263EEF:00000610Можно тоже самое проделать при помощи SoftIce, но тут сложнее будет: пишем сначала \"HWND Odigo\" - вылетает длинный список, в нем куча окон первого уровня (в первом столбце такая цифра в скобках - их класс_нейм Tooltips_class32 - это, ясное дело, крекламе отношения не имеет. Дальше следует окно класса #32770 (Dialog), в нем несколько дочерних окон. Стало быть, окно вида #32770 - главное, а баннер надо искать внутри, среди его детей. Так вот, если присмотреться к столбцу \"QOwner\", сразу становится понятно, что все эти окна наделал Odigo.exe. Если у кого-то остались подозрения, что модуль ODIGO и файл \"odigo.exe\" не связаны, можно дать Айсу команду \"MOD Odigo\".Словом, где искать вызов рекламы, мы узнали. Посмотрим дизассемблером, что делает exe-шник (W32Dasm как раз пригодится). В секции \"Imports\" есть такое: Import Module 001: WINMM.dll Import Module 002: IMM32.dll Import Module 003: OdigoMsg.dll Import Module 004: OdigoShared.dll Import Module 005: OdigoUI.dll Import Module 006: OdigoUtil.dll Import Module 007: OdigoCppApi.dll Import Module 008: OdigoNet.dll Import Module 009: MFC42.DLL Import Module 010: MSVCRT.dll Import Module 011: KERNEL32.dll Import Module 012: USER32.dll Import Module 013: GDI32.dll Import Module 014: SHELL32.dll Import Module 015: ole32.dll Import Module 016: OLEAUT32.dll Import Module 017: WSOCK32.dll Здесь кроме стандартных библиотек используются и свои собственные. Совместными усилиями они и создают рекламу. Заглянем в список импортируемых функций (меню Functions->Imports - пропустим GDI32, KERNEL32, MFC42, MSVCRT. Это все ядро Windows и библиотеки от С++. Остановились на OdigoApi... Удивительно: у всех функций сохранены имена, среди них обработчики всяких событий, а дальше есть такие строки:OdigoCppApi._OdigoApiCall_FreeIMIPBrandData@4 OdigoCppApi._OdigoApiCall_GetActiveBrowser@16 OdigoCppApi._OdigoApiCall_GetAd@20 OdigoCppApi._OdigoApiCall_GetAdsData@4 OdigoCppApi._OdigoApiCall_GetBrandAllowesAdultContent@4 OdigoCppApi._OdigoApiCall_GetBrandBooleanValue@8 Вот и оно! Ad = Advertisement - оно же реклама. Попробуем найти, где вызывается функция GetAd (дабл-клик по имени функции, при необходимости повторть нужное число раз), два вызова. Первый раз::00463376 8D86D4000000 lea eax, dword ptr [esi+000000D4] :0046337C 6A00 push 00000000 :0046337E 50 push eax :0046337F 8D86D0000000 lea eax, dword ptr [esi+000000D0] :00463385 50 push eax :00463386 FFB6B8000000 push dword ptr [esi+000000B8] :0046338C 55 push ebp * Reference To: OdigoCppApi._OdigoApiCall_GetAd@20, Ord:00BBh :0046338D E814350400 Call 004A68A6 :00463392 8BF8 mov edi, eax Это что-то вроде GetAd( EBP, *(ESI + 0xB8), ESI + 0xD0, 0, ESI + 4), - смысла параметров сразу не понять, да оно и не так важно. И второй::00462FF9 6A01 push 00000001 :00462FFB 6A00 push 00000000 :00462FFD 8DBEC4000000 lea edi, dword ptr [esi+000000C4] :00463003 6A00 push 00000000 :00463005 53 push ebx :00463006 57 push edi * Reference To: OdigoCppApi._OdigoApiCall_GetAd@20, Ord:00BBh :00463007 E89A380400 Call 004A68A6 :0046300C 83F801 cmp eax, 00000001 :0046300F 7508 jne 00463019 :00463011 8B0F mov ecx, dword ptr [edi] * Reference To: OdigoShared.?AddReference@CAd@@QAEXXZ, Ord:00C9h :00463013 FF15E8F54B00 Call dword ptr [004BF5E8] :00463019 8BCE mov ecx, esi; сюда ведет jne из 46300F Это похоже на if ( GetAd( ESI + 0xC4, EBX, 0, 0, 1) == 1) AddReference(...).Это уже очень даже интересно. Стало быть, если GetAd не вернет единичку, то скачанный баннер не появится в программе (если GetAd действительно его скачивает). Здесь даже неважно, что передается в AddReference (а передается туда, скорее всего, инфа о баннере и, похоже, через регистры). Кстати, после первого вызова тоже есть такая проверка и неизменное AddReference(...). Запрещаем программе загружать рекламу (метод 1)Итак, естественным желанием будет обойти GetAd() - очистить стек от параметров, и установить EAX != 1, дескать закачать не удалось. Для первого вызова оффсеты в odigo.EXE с 0x6337С по 0x6338F включительно забиты NOP\'ами (зачем загонять в стек параметры, когда их никто не прочитает), в 0x63390 пишем 33С0 - оно же EAX = 0. На втором вызове 0x62ff9-0x62ffc, 0x63003-0x63009 заполним байтом 0x90, в 0x6300A записали \'33С0\'. Запускаем... Все ок, никаких баннеров, только логотип odigo на их месте, и его по-прежнему можно кликать ;). Удаление баннера хирургическим путем (метод 2)Есть и другое слабое место в Odigo. Это само создание окошка с баннером: :00462F56 59 pop ecx :00462F57 894510 mov dword ptr [ebp+10], eax :00462F5A 68C7040000 push 000004C7 :00462F5F 57 push edi :00462F60 FF750C push [ebp+0C] :00462F63 8BCE mov ecx, esi :00462F65 6800000050 push 50000000 * Reference To: OdigoUI.?Create@CAnimatedGif@@UAEHKABUtagRECT@@PAVCWnd@@I@Z, Ord:0198h :00462F6A FF1580FE4B00 Call dword ptr [004BFE80] :00462F70 85C0 test eax, eax Почему бы не попробовать отменить вызов Create(0x50000000, *(EBP+12), EDI, 0x4C7)?Ровно по оффсету 0x62F6A вводим код \'83 C4 10 90 90 90\' - оно же очистить стек от параметров. Обычно результат выполнения функции хранится в EAX, но здесь мы ничего не меняем. В EAX уже что-то записано, а проверка идет по принципу \"ноль - не_ноль\".Недостатком такого метода станет потеря внешнего вида программы. Так чтопридется подрисовать скин - закрасить зеленое пятно, на котором некогда \"красовался\" баннер. ВыводыЗащита рекламы оставляет желать лучшего. Даже такой примитивный способ как подавление создания окна работает и программа не выдает при этом никаких ошибок. Да и кому интересно их читать? Программа создавалась для развлечения, а не изучения или отладки. Так что общайтесь на здоровье, и да не напряжет Вас реклама! Ваши отзывы всегда велком! P.S. Здесь можно было бы привести достаточно подробный экскурс в Reverse-Engineering по odigo - для многих методов можно узнать названия и получить представление, что они делают. Однако, Reversing программы явно выходит за рамки статьи об удалении баннеров.
|