Главная » Статьи » Крэкинг

Взлом "Соло на клавиатуре 8.1"
26/11/2004
-----------------------------------
Автор: //oz3qK
____________________________________________
Привет всем !
Несколько месяцев назад я установил прогу, которая, как заверяли разработчики, за пару месяцев могла
обучить быстрому слепому набору текста (как русскому так и английскому). Юзать эту прогу стали мои
родственники. Но прогу нашару никто не подарит. Ее надо зарегистрировать и отвалить 15 $. Все мы
люди экономные и лишние деньги нам не помешают :)
Значит сегодня мы будем ломать Соло на клавиатуре 8.1
Нам будут нужны традиционные инструменты крэкера : Дизасемблер (я использовал Ida), отладчик
SoftIce, знание ассемблера (хотя я буду давать некоторые пояснения по ходу дела). Еще нам нужна сама
программа. Найти ее можно на сайте производителя www.ergosolo.ru .
Запускаем программу. Она сразу же выводит сообщение, что надо зарегистрироваться. В одном поле для
ввода содержится серийный номер, во втором нам надо ввести регистрационный код. Пробуя ввести код,
можно заметить что кнопка "Register Now" заблокирована и только когда мы введем правильный код, она
разблокируется.
Из этого можно зделать вывод, что программа берет серийный номер, генерирует регистрационный код и
сравнивает правильный код с тем, который ввели мы (хотя возможен вариант что прога берет наш код и
на его основе генерирует серийный номер и сравнивает с правильным, такой способ громоздкий и мало
вероятный).
Теперь приступим к работе с SoftIce. "Соло на клавиатуре" может произвести считывание
регистрационого кода с помощью Api-функций GetDlgItemTextA или GetWindowTextA. Жмем Ctrl+D, всплывет
окно SoftIce (Ctrl+D стоит по-дэфолту).
Вводим команды :
bpx GetDlgItemTextA
bpx GetWindowTextA
С помощью команды bpx устанавливается точки прерывания (breakpoint) на вызов функций. Снимаются
брейкпоинты командой bc(bc номер (начиная с 0) или bc * (снять все)). Повторное нажатие Ctrl+D или
F5 закроет SoftIce.
Далее набираем в поле для ввода кода любой символ. Сразу же выскакивает SoftIce. Мы находимся
непосредственно внутри функции на которую мы ставили breakpoint (это GetWindowTextA).
После нажатия F12 мы перейдем на следущую по счету команду после вызова этой функции. Прокрутим окно
с командами вверх (Ctrl+Up). Там будет следуйщее (адреса могут отличатся) :
017F:5F4036C3 Push EAX
017F:5F4036C4 Push DWORD PTR [ESI+20]
017F:5F4036C7 Call [User32!GetWindowTextA]
Команда Push заносит значение в стек. В данном случае так передаются параметры функциям. EAX
указывает на место где будет хранится введеный код.
Чтобы выяснить значение EAX (функция попортила его), установим брейкпоинт на адресс 017F:5F4036C3
(bpx 017F:5F4036C3). Жмем F5, вводим еще один символ в поле для кода.
Мы попадаем на нужную точку. EAX = 00695150. Жмем 3 раза F10 (пошаговое выполнение команд, по вызову
(Call) переход во внутрь функции не происходит). После GetWindowTextA, по адресу в EAX запишется
считаная строка. Этот кусок памяти можно просмотреть командой :
d 00695150
Следующее с верху - окно данных. В нем мы можем наблюдать содержимое интересующего нас участка
памяти. После команды d 00695150 в этом окне будет введенный код.
Прокрутим окно данных вниз (Alt+Down). По адресу 00695100 хранится серийный номер. К нему должно
просходить обращение, когда прога генерит правильный код. Если переместится к адресу 00695100, то
можно увидеть набор цифр (!!!!!). Я определил что сюда программа пишет правильный код. Осталось его
просто ввести :)
А теперь разберем алгоритм по которому программа генерирует правильный код. После срабатывания
брейкпоинта вернемся на уровень вверх (F12). Там следущее :
00414E1A : Push ECX
Lea EDX, [ESP+0Ch]
Mov ECX, ESP
Mov [ESP+10h], ESP
Push EDX
00414E26 : Call 0042F65 ;нам не нужна
00414E2B : Call 0040165E ;генерация кода
В первом вызове нет ничего интересного, там проверка длины и другие действия. А вот второй ... :)
Когда очередь подойдет к выполнению CALL 0040165E, нужно нажать F8 (внутрь функции). После
нескольких нажатий появится следуещее :
017F:004046B1 : Mov EDI, [EAX] ; EAX = 00695100, тобиш серийный номер
; (предыдущая процедура перезаписала этот участок памяти)
Push FF
Mov EBP, [EAX+04h] ;первые 4 цифры, но не забывайте
;что они задом-на-перед
Mov EBX, [EAX+08h] ;вторые 4 цифры
Mov ECX, [EAX+0Ch] ;третие 4 цифры
Mov [ESP+28h], ECX ;ESP+28 указывает на адрес 0067F4D0
Lea ECX, [ESP+18h] ;ESP+18 указывает на адрес 00695100
Mov DX, [EAX+10h] ;EAX+10 указывает на адрес 00695100
Mov [ESP+2Ch], DX ;ESP+2C указывает на адрес 0067F4D4
Call ... ;не важно
Mov ESI, [ESP+26h] ;ESP+26 указывает на адрес 0067F4D2
Mov EDX, [ESP+24h] ;ESP+24 указывает на адрес 0067F4D0
Xor ESI, EDX
Lea ECX, [ESP+10h] ;ESP+10 указывает на адрес 0067F4BC
Xor ESI, EBX
Xor ESI, EBP
Xor ESI, EDI
Xor ESI, 0AC40A05Eh
Теперь в ESI правильный код в шестнадцетеричном виде. Теперь не составит труда написать KeyGen.
Генератор ключей для программы можно взять тут: http://rst.void.ru/download/Solo-KeyGen.zip
Категория: Крэкинг | Добавил: -=Hellsing=- (17.06.2009)
Просмотров: 6463 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]