
Фишинг серийников в Blumentals Screensaver Factory
При помощи программы Blumentals Screensaver Factory вы можете создавать красивые скринсейверы в виде слайдшоу из ваших фотографий. Саму "фабрику" можно без проблем найти в интернете, но речь сейчас не о ней, а о скринсейверах, которые сделаны с ее помощью. В Blumentals Screensaver Factory есть возможность создания коммерческих скринсейверов, защищенных серийным номером, и некоторые аффтары умудряются торговать подобными дешевками, на создание которых было затрачено всего несколько минут. Такие скринсейверы можно узнать по окну настроек:
Окно настроек скринсейвера
В зависимости от использованной версии "фабрики" вкладок может быть больше или меньше, но общий стиль оформления остается неизменный.
Для работы нам понадобится бесплатный отладчик OllyDbg. Начальное знание Ассемблера, прямые руки и незамутненная голова - опции по умолчанию :) Термин "фишинг" больше относится к компьютерным правонарушениям, но вполне будет уместным и здесь. Мы будем "отлавливать" правильный серийный номер.
Итак, "ловись рыбка большая и маленькая". В свойствах экрана открываем настройки скринсейвера, нажимаем кнопочку Register... и вводим ваше имя и любые левые данные в качестве серийника:

Окно регистрации скринсейвера
Совершенно очевидно, что после нажатия кнопочки Ok мы получим сообщение об ошибке. Но нас интересует сам текст сообщения, он будет звучать как "Invalid registration key". Не закрывая окна настроек, запускаем отладчик и аттачимся к скринсейверу (меню File - Attach):

Аттач к процессу скринсейвера
Теперь наша задача найти строку сообщения при неправильном серийнике и выяснить условие, при котором она появляется. Для этого переместим курсор в окно дампа и перейдем на начало секции кода (Ctrl+G, адрес 00401000). Затем поиском ищем строку "Invalid registration key" (Ctrl+B).

Поиск строки в памяти
Строка успешно найдена. Ставим курсор на ее начало и ищем места, откуда есть ссылки на нее (Ctrl+R). Таких мест найдется два, нас интересует только первое.

Найдены ссылки на строку
Там находится интересный кусок кода. Для удобства я прокомментировал его ключевые места:
Code (Assembler) : Убрать нумерацию
- 004ECE99 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
- 004ECE9C A1 AC765000 MOV EAX,DWORD PTR DS:[5076AC]
- 004ECEA1 8B00 MOV EAX,DWORD PTR DS:[EAX]
- 004ECEA3 8B80 04030000 MOV EAX,DWORD PTR DS:[EAX+304]
- 004ECEA9 E8 3EEDF5FF CALL 0044BBEC
- ; В регистры EDX и EAX заносятся параметры вызываемой функции. В этом
- ; месте надо установить breakpoint
- 004ECEAE 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
- 004ECEB1 58 POP EAX
- ; Вызов функции сравнения двух строк. Именно это нам и надо!
- ; Похоже что функция имеет вид типа Compare(&str1, &str2) и
- ; взводит флаг equal в зависимости от результата сравнения
- 004ECEB2 E8 B97DF1FF CALL 00404C70
- 004ECEB7 74 43 JE SHORT 004ECEFC
- ; Результат сравнения отрицательный, значит серийный номер неправильный
- 004ECEB9 6A 30 PUSH 30
- 004ECEBB 8D55 E8 LEA EDX,DWORD PTR SS:[EBP-18]
- 004ECEBE A1 EC785000 MOV EAX,DWORD PTR DS:[5078EC]
- 004ECEC3 8B00 MOV EAX,DWORD PTR DS:[EAX]
- 004ECEC5 E8 CEFAF7FF CALL 0046C998
- 004ECECA 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
- 004ECECD E8 527EF1FF CALL 00404D24
- 004ECED2 50 PUSH EAX
- 004ECED3 8D55 E4 LEA EDX,DWORD PTR SS:[EBP-1C]
- ; ASCII "Invalid registration key."
- 004ECED6 B8 ECD04E00 MOV EAX,004ED0EC
- 004ECEDB E8 0C49F9FF CALL 004817EC
- 004ECEE0 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C]
- 004ECEE3 E8 3C7EF1FF CALL 00404D24
- 004ECEE8 8BD0 MOV EDX,EAX
- 004ECEEA A1 EC785000 MOV EAX,DWORD PTR DS:[5078EC]
- 004ECEEF 8B00 MOV EAX,DWORD PTR DS:[EAX]
- 004ECEF1 59 POP ECX
- 004ECEF2 E8 1D01F8FF CALL 0046D014
- 004ECEF7 E9 8A010000 JMP 004ED086
- ; Сюда мы попадаем если результат сравнения положительный, то есть
- ; введен правильный серийный номер
- 004ECEFC 6A 30 PUSH 30
- 004ECEFE 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20]
- 004ECF01 A1 EC785000 MOV EAX,DWORD PTR DS:[5078EC]
- 004ECF06 8B00 MOV EAX,DWORD PTR DS:[EAX]
- 004ECF08 E8 8BFAF7FF CALL 0046C998
- 004ECF0D 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20]
- 004ECF10 E8 0F7EF1FF CALL 00404D24
- 004ECF15 50 PUSH EAX
- 004ECF16 8D55 DC LEA EDX,DWORD PTR SS:[EBP-24]
- ; ASCII "Registration key accepted."
- 004ECF19 B8 10D14E00 MOV EAX,004ED110
- 004ECF1E E8 C948F9FF CALL 004817EC
- 004ECF23 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24]

В регистр EDX записывается указатель на наш левый серийник, а следующей командой в регистр EAX из стека запишется указатель на строку:

В стеке указатель на правильный серийный номер
Строка "4410FCA3" - это второй параметр функции сравнения, и это же нужный нам серийный номер. Записываем его куда-нибудь, закрываем отладчик (при этом закроется и скринсейвер). Снова открываем окно настроек скринсейвера, вводим имя и найденный серийник, получаем радостное сообщение, что "Registration key accepted". Таким образом находятся серийные номера для всех скринсейверов, созданных в Blumentals Screensaver Factory. Естественно, что адреса в памяти и серийные номера для каждого скринсейвера будут разные, здесь описан просто сам принцип. Также на практике мне пришлось столкнуться с демо-версиями скринсейверов, которые как бы регистрировались, но все равно показывали надоедливые наг-скрины. Но тут уже ничем не помочь, нужны только полные версии.
Как видите ничего сложного, весь процесс ловли серийников занял несколько минут :) Никаких изменений в файлы не вносилось, так что это не является взломом программ. И совершенно не обязательно платить за софт, а тем более за таки поделки!
Просмотров: 6180 | Комментариев: 1
Метки: исследование защиты

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Invector
(05.12.2008 в 13:29):
Отлично пишите и обучаете! Спасибо.

Добавить комментарий
Заполните форму для добавления комментария
