/\ /\ / \_ _/ \ ____/ /__ T E A M . F I F T Y . T H R E E __\ \____ \__ ____\\- ____ -//____ __/ / /_____ ______\ \__________\ \ _/ /_\ \_________________________-// // ____/ /_\ \_ __\ _\ ____ /___ _ \_ \/ // ___\/_ /__ ))______________\_ _______\_|__ /____\/_____\ /gf _/______________(( \___\\- /___//- /____((- TEAM FiFTY THREE TUTORiALS PACK # SEVENTEEN ::Хорошая защита - красивый взлом :). Talisman 2.6:: Автор: Бойков Александр aka vtAlex Инструменты: REGMON, W32DASM, SoftIce, APIS32 Скажу честно, над этой программой я бился больше, чем над двуми предыдущими. Дело в том, что механизм защиты программы очень хорошо спрятан и найти его очень тяжело. Однако, я его нашёл и теперь попробую донести тебе, читатель, путь этого поиска. Взлом этой программы будет сильно отличаться от взлома прог до этого. Если раньше требовалось заменить пару байт и программа считала себя зарегистрированной, то здесь такой фокус не пройдёт. Итак, установим Talisman. Я выбрал тему "Big Icons Panel" потому что мне она показалась самой удобной из дефолтовых. С инета качать мне было влом, т.к. и эта меня вполне устраивала. Так, тему установили, сделали её дефолтовой. Чтож, приступим к взлому. Запускаем программу. Она нам сразу говорит, что незарегистрирована и неплохо было бы для начала заплатить, а потом пользовать. Но пока 30 дней и так поживёт, правда будет вам о этом напоминать. Жмём кнопку About/Registration из контекстного меню и видим окно регистрации. Вводим имя и код (любые), прога говорит, что это сочетание неверно. Причём, говорит это не с помощью MessageBoxA, а функции, которая вызывается очень часто, поэтому брейк особо не поставишь :(... Да, с главного входа особо не подступиться. Попробуем посмотреть, что эта шняга пытается взять из рееста при запуске. Ничего интересного не видно, кроме двух переменных srok и usercode. Скажу честно, первый раз я просто проанализировал переменную srok и установил её в такое значени, что talisman говорил что прога работает 1 день. Всегда. Но это не самый лучший подход, т.к. прога всё же напоминает нам о регистрации, что не есть хорошо. Откроем прогу при помощи W32Dasm и найдём usercode. :00484C1C DD1C24 fstp qword ptr [esp] :00484C1F 9B wait * Possible StringData Ref from Code Obj ->"usercode" | :00484C20 BA184D4800 mov edx, 00484D18 :00484C25 8BC6 mov eax, esi :00484C27 E8B0B1FCFF call 0044FDDC :00484C2C 8BC6 mov eax, esi :00484C2E E8DDA8FCFF call 0044F510 :00484C33 8BC6 mov eax, esi :00484C35 E8BAE2F7FF call 00402EF4 :00484C3A 8D55F4 lea edx, dword ptr [ebp-0C] :00484C3D 8B83E4020000 mov eax, dword ptr [ebx+000002E4] :00484C43 E8B066FAFF call 0042B2F8 :00484C48 8B4DF4 mov ecx, dword ptr [ebp-0C] :00484C4B 8D45E8 lea eax, dword ptr [ebp-18] * Possible StringData Ref from Code Obj ->"Registered for " | :00484C4E BA2C4D4800 mov edx, 00484D2C :00484C53 E8B8F1F7FF call 00403E10 Опа, сразу после первого объявления usercode видим Registered for. Ну разве не праздник? Если честно, я шёл более тернистым путём, потому что этот не сразу заметил :). Единственная проблема: как сюда попасть? Брейк на этой точке не даст результатов. Ищем ещё usercode, находим два объявления совсем рядом. * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004A125E(C) | * Possible StringData Ref from Code Obj ->"usercode" | :004A12E9 BAFC1D4A00 mov edx, 004A1DFC :004A12EE 8BC3 mov eax, ebx :004A12F0 E863ECFAFF call 0044FF58 :004A12F5 84C0 test al, al :004A12F7 0F848B000000 je 004A1388 * Possible StringData Ref from Code Obj ->"usercode" | :004A12FD BAFC1D4A00 mov edx, 004A1DFC :004A1302 8BC3 mov eax, ebx :004A1304 E8E7EAFAFF call 0044FDF0 :004A1309 E84617F6FF call 00402A54 :004A130E 8945FC mov dword ptr [ebp-04], eax :004A1311 8D4DF8 lea ecx, dword ptr [ebp-08] * Possible StringData Ref from Code Obj ->"username" | :004A1314 BA101E4A00 mov edx, 004A1E10 :004A1319 8BC3 mov eax, ebx :004A131B E8B4E9FAFF call 0044FCD4 :004A1320 33FF xor edi, edi :004A1322 8B45F8 mov eax, dword ptr [ebp-08] :004A1325 E89A2AF6FF call 00403DC4 :004A132A 85C0 test eax, eax :004A132C 7E18 jle 004A1346 :004A132E 8945E0 mov dword ptr [ebp-20], eax :004A1331 BE01000000 mov esi, 00000001 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004A1344(C) | :004A1336 8B45F8 mov eax, dword ptr [ebp-08] :004A1339 0FB64430FF movzx eax, byte ptr [eax+esi-01] :004A133E 03F8 add edi, eax Ставим брейк на начала первого блока с объявлением и... срабатывает. Прослеживаем-с. Выходит, что после теста на al, выходим (al=0) в ту часть проги, где нам скажут: "Извините, но вы незарегены. Пожалуйста, сделайте это ...". Ладно, ставим брейк ещё раз и уже пропатчиваем je на jne. Проходим дальше и нас останавливают, говоря о том, что мол, ваша аппликатион выполнило MessageBoxA, с которым нам и предлагают ознакомиться. Дословно не помню, но что-то вроде: "Неверный тип переменной usercode". Спрашивается, нам это надо? Ясен бонус, нет. Поэтому сносим Call нопами (да и второй, если честно тоже). От этого ничего не изменится, просто не будет проверен на валидность код (если он вообще имеется). Пройдясь по нопам, доходим до username и очередного теста. Сморим, куда указывает этот jle...Куда-то эчень близко с "Registered for...", значит, и нам туда :)... Наверняка нас не пропустят, поэтому патчим на jg. При дебаге подходим вплотную к "Registered for..." и тут нас пытаются отвести при помощи jne. Ну уж нет, последний на сегодня патч на je... И С ШИКОМ ПРОХОДИМ К ЗАВЕТНОЙ НАДПИСИ. Советую больше не мучаться и нажать F9. Ну вот и всё коллега, Talisman сдался. Как не всё? ААА...Опять ругается, наверное username не подходит. Это очень просто исправить: HCU\Software\ Lighttek\Talisman\username=<Ваше имя>. Ещё раз по старой программе :)...И вот Help->About/Registration->Заветное окошечко с уведомлением, что вы зарегистрированы. Бойков Александр aka vtAlex vtAlexWork@mail.ru.