allasm.ru

    Меню

 

…и угораздило же меня приобрести "писец" (то бишь CD-RW) в OEM-поставке! И ведь спрашивал продавца: а где, позвольте, тут пишущий софт или, по крайней мере, драйвера? На что продавец, удивленно так пожимая плечами, ответил: какие драйвера? Втыкаете - работает. А пишущие программы подходят любые, вот купите в соседнем магазине диск с Neuro CD. Мне, обладателю retail-"писца" от PHILPS, еще тогда это показалось странным, поскольку, я хорошо помнил, что диск с драйверами в коробке PHILPS'а был, а Easy CD Creator - непосредственно сам пишущий софт, - располагался совсем на другом диске. Но ведь как-то же справляются с OEM-продукцией другие люди, подумал я, и… купил.

Наскоро воткнув новехонький 40-скоростной NEC в свой компьютер, я был немало удивлен, когда Neuro CD наотрез отказался признать его "писцом". Не помог тут и Easy CD Creator, взятый с Филечкиного CD. Провозившись битый час и, ничего ровным счетом так и не выяснив, я, зверски разозленный на продавца, решил сделать ход конем, установив NEC на компьютер с "девяносто восьмой" Windows, вернув PHILPS'а себе. Никаких изменений! Собравшись было отдавать привод назад продавцу, я неожиданно вспомнил, что в одном из последних номеров Компьютер Пресс был обзор пишущих программ, причем демонстрационные версии всех этих программ содержались на прилагаемом к журналу компакт-диске. Из всех программ NEC'овый писец опознала лишь одна: Record NOW, которая, к счастью не имела никаких функциональных ограничений, исключая, правда 30-днейвый триальный период. Причем, программа оказалась такой уютной и удобной, что расставаться с ней мне не захотелось, но и расставаться со своими деньгами мне не хотелось тоже.

Как выглядит защита? При каждом запуске программа выводит противный nag-screen, напоминающий сколько дней ей еще "жить" осталось, и тем самым страшно нервирующий: Хорошо, ищем фразу "Number of days remaining in evaluation" во всех файлах программы и, если наша искалка поддерживает уникод, быстро выясняется, что данный текст содержится в файле lockers.dll, открыв который любым редактором ресурсов, мы обнаруживаем в нем тот самый заветный диалог! Остается выяснить: кто же выводит этот диалог на экран? Ищем строку "lockres.dll" во всех файлах программы. ОК, это lockout.dll. Да… и эти разработчики не в ладах с юмором. Запускам dumpbin и смотрим список экспортируемых функций:

Dump of file lockout.dll

File Type: DLL

  Section contains the following exports for lockout.dll

           0 characteristics
    3C855E8D time date stamp Wed Mar 06 03:10:53 2002
        0.00 version
           1 ordinal base
          23 number of functions
          23 number of names

    ordinal hint RVA      name

          3    0 0000CFF0 ?DESDecrypt@@YAKPBDPAD0@Z
          4    1 0000CC40 ?DESEncrypt@@YAKPBDPAD0@Z
          1    2 00003520 EvalModeTest
          2    3 00003930 EvalModeTestVB
          6    4 0000B230 _ezLICENSE_Check_Delphi@16
          7    5 0000B1A0 _ezLICENSE_Check_VB@16
          9    6 0000BC20 _ezLICENSE_ChkExpire_Delphi@16
         10    7 0000BB90 _ezLICENSE_ChkExpire_VB@16
         12    8 00009DB0 _ezLICENSE_ChkFileCRC_Delphi@8
         13    9 00009D40 _ezLICENSE_ChkFileCRC_VB@8
         15    A 0000BA30 _ezLICENSE_Clear_Delphi@12
         16    B 0000B9B0 _ezLICENSE_Clear_VB@12
         18    C 0000A320 _ezLICENSE_GetRestNumber_Delphi@16
         19    D 0000A290 _ezLICENSE_GetRestNumber_VB@16
         22    E 0000A6C0 _ezLICENSE_Upgrade_Delphi@20
         23    F 0000A610 _ezLICENSE_Upgrade_VB@20
          5   10 0000B2C0 ezLICENSE_Check
          8   11 0000BCA0 ezLICENSE_ChkExpire
         11   12 00009E20 ezLICENSE_ChkFileCRC
         14   13 0000BAA0 ezLICENSE_Clear
         17   14 0000A3B0 ezLICENSE_GetRestNumber
         20   15 00009C30 ezLICENSE_GetVersion
         21   16 0000A770 ezLICENSE_Upgrade

Сурово! Во-первых, обращает на себя пара функция DES Encrypt/DES Decrypt, что-то (как и следует из ее названия) зашифровывающая/расшифровывающая. Во-вторых, тройственный подход к наименованию функций, наводит на мысль, что мы имеем дело с "конвертной" защитой, разработанной независимо от защищенной с ее помощью программы, и поддерживающий все основные языки программирования: Си/Си++, Дельфи и конечно же, Visual Basic, узнаваемый по суффиксу VB. В-третьих, такое обилие всевозможных проверочных функций предвещает, что исследование защиты и защищенной программы окажется делом отнюдь не легким! Причем, в те три сотни килобайт, которые занимает файл lockout.dll можно много всяких ловушек и хитростей понапхать, так что на скорый успех нам рассчитывать не приходится. Но… глаза страшатся, а руки делают. Начнем с того, что посмотрим: какие именно функции защитной библиотеки использует программа.

…вот тебе и раз! Защищенная-то программа состряпана на Визуальном Бейсике, о чем красноречиво свидетельствует единственная явно загружаемая ею библиотека MSVBVM60.DLL! Ах, так?! Хорошо, пойдем напролом. Просто удаляем lockout.dll из каталога программы и подсовываем ей любую другую DLL, предварительно переименованную в данную. Запускаем программу. На экране незамедлительно появляется сообщение об ошибке: среда Visual Basic'а ругается, что не может найти функцию EvalModeTestVB. Что ж, это уже кое-что! Загружаем lockout.dll в дизассемблер, находим в нем эту самую "Eval", быстро выясняем, что она является "переходником" к EvalModeTest, которая… которая… Ой-ой-ой, которая занимает до черта килобайт и содержит в себе крайне запутанный с большим количеством глубоко вложенных друг в друга процедур программный код. Да чтобы проанализировать все это и месяца не хватит! А кто сказал, что этот код вообще следует анализировать?! Достаточно просто подсунуть нужный код возврата и все! Весь вопрос в том: какой именно код нужный. Бегло просмотр содержимого функции показал, что существуют как минимум три различных кода возврата: "0", "2" и "3". Если это так, то скорее всего одному из них соответствует состояние "программа не зарегистрирована, но лицензия еще не истекала", "программа не зарегистрирована и лицензия уже истекла", и, наконец, "программа зарегистрирована". Что ж, на перебор трех вариантов не уйдет много времени! Взяв в руки HIEW, переписываем код защитной функции "с нуля": XOR EAX, EAX/RETN.

Возвращаем lockout.dll на ее прежнее место, запускаем Record NOW и… не можем поверить свои глазам, - программа исправно работает! "Исправно" - в том смысле, что nag?screen уже не выводится и по истечении положенных тридцати дней писец по-прежнему живет, а не умирает.

Хорошо, а если бы разработчик защищенного приложения, не поленился бы воткнуть проверку на успешность загрузки функции EvalModeTestVB и при ее отсутствии немотивированно прекращал свою работу? Смогли бы мы тогда узнать: какие функции библиотеки lockout используется, а какие нет? Уговорили! Взломаем программу другим путем! Погоняем курсор к MyCDPro.exe и, нажав на , пытаемся найти lockout.dll прямым контекстным поиском. Вот, пожалуйста:


Поиск ссылки на lockout.dll в защищенной программе

Прямым текстом: "lockout.dll" и рядышком с ней EvalModeTestVB. Имена остальных защитных функций в исследуемой программе отсутствуют. Самое забавное, что в модуле lockout.dll присутствует огромное количество строк типа: "'User has turned back their clock, so calculating days based on last and init", "The CRC file is valid", "Failed to update the Last Accessed time", - т. е. защита составлена довольно грамотно и в состоянии как следует за себя постоять. Если, конечно, разработчик защищаемого приложения использовал все, предоставленные ей возможности, сполна. Увы, этого не произошло и на этот раз…

  [C] Крис Касперски