Привет всем читателям! Вы пялитесь на мое очередное практическое пособие (второе) по удалению из софта врожденных дефектов, препятствующих использованию оного во всей своей красе. :) На этот раз речь пойдет о софтине, именуемой Registry Studio. Это тот же виндошный regedit, но со всякими наворотами. Использует стандартную схему защиты: имя/серийник и отказывается работать по истечении N дней. Этот баг мы пофиксим... :) Вам, кроме головы на плечах, понадобится: * SoftIce * пойло (о-очень много) * сигареты (если курите) Что ж, хватит трепа. Работы у нас дохрена. Так что за дело. Как обычно, запускаем пациента... вводим данные, но не нажимаем "ОК"... ставим в SoftIce бряк (bpx getwindowtexta)... пробуем регистрировать софтину... всплывает SoftIce. А вот теперь начинается веселье!!! Два раза на F12 - и вы попадете сюда: 0078815D mov esi, [ebp+14] ;введенное нами имя двинуть в ESI 00788160 push ebx ;введенный серийник - в стек 00788161 push esi ;и имя туда же 00788162 call 00784297 . . . Теперь, установив курсор на строку "00788162 call 00784297", давите на F8, чтобы войти в процедуру: 00784297 push ebp . . . 007842A0 push esi ;снова имя в стек... 007842A1 mov esi, [ebp+0C] 007842A4 push esi ;и серийник туда же 007842A5 call [KERNEL32!lstrlen] 007842AB cmp eax, 08 ;длина пароля 8 символов? 007842AE jl 007842C7 ;если меньше - выход. Ага, значит серийник должен быть длиной не менее 8 символов!!! Если вы ввели меньше - исправьте, т. к. иначе дальше продвигаться смысла нет. Исправляйте, я подожду.......... Вернулись? ОК! Идем дальше: 007842B0 mov cl, [esi] ;в CL идет первый символ имени 007842B2 cmp cl, 72 ;он у нас "r"? 007842B5 jz 007842BC ;если да, то перейти дальше, иначе... 007842B7 cmp cl, 52 ;...проверяем, может быть это "R"? 007842BA jnz 007842C7 ;если нет - на выход 007842BC mov al, [esi+01] ;в CL идет второй символ имени 007842BF cmp al, 73 ;он у нас "s"? 007842C1 jz 007842CB ;если да, то перейти дальше, иначе... 007842C3 cmp al, 53 ;...проверяем, может быть это "S"? 007842C5 jz 007842CB ;если нет - на выход Твою мать! Оказывается, первые 2 символа в серийнике должны быть "rs" (регистр не важен). Придется снова изменять введенные рег. данные. Не торопитесь, я жду.................. Исправили? Тогда продолжим: . . . 007842CD test cl, cl ;проверяем, не равен ли CL нулю? 007842CF jz 007842E1 ;если равно - выходим из цикла 007842D1 cmp cl, 2D ;текущий символ - это тире? 007842D4 jz 007842DB ;если да, то переход ----------------------+ 007842D6 mov [eax+ebp-64], cl ; | 007842DA inc eax ; | 007842DB mov cl, [esi+01] ;в CL - следующий символ введенного имени <---+ 007842DE inc esi 007842DF jmp 007842CD ;переход в начало цикла Перед нами цикл проверки введенного рег. номера на наличие символов "-" (тире). Проверяется каждый символ по очереди и записывается по адресу [eax+ebp-64]. Если текущий символ - тире, то оно пропускается, и проверяется следующий за ним символ. Таким образом, по адресу [eax+ebp-64] будет храниться введенный серийник, но без символов "-". Если в серийнике не будет обнаружено ни одного тире, то вычисления закончатся. Да, да! Вы все поняли правильно! Нужно опять изменять регистрационные данные. Готово? Хорошо. Найдем же этот гребаный с/н: . . . 00784208 mov edi, edx 0078420A call 007840B0 0078420F add esp, 10 ;!!!Не хотите проверить, что лежит по адресу в ESP? :)!!! ;Введите: "d esp" (без кавычек) и натискните <ввод>. ;Немного ниже (в старших адресах) вы увидите готовый серийник. 00784212 cmp eax, esi . . . Вот и все! Серийник выглядит примерно так: RS13-3041-2359-1828-6743-72 Что ж, номер мы нашли, и это клево. Теперь можно зарегистрировать прогу и забыть о ней. Помните: кракинг - это не кодинг. Как только способ обойти защиту найден, цель считается достигнутой, а миссия - выполненной. Не стоит зацикливаться на одной софтине. НО! Если вы хотите написать генератор ключей, то вам придется разобраться с алгоритмом создания серийника. Попробуйте сделать это сами. Если что-то не будет получаться или запутаетесь - пишите. Я в свое время провел не одну бессонную ночь, пытаясь разобраться с этим дерьмом. ПОДСКАЗКА: По правде говоря, в алгоритме генерации с/н есть одна каверзная фишка. Там происходит умножение двух чисел - содержимого регистров. Насколько я понял (хотя могу и ошибаться), для создания одного из множителей, в регистр заносится содержимое N-ой ячейки памяти. А вот выбор этой ячейки (а соответственно и числа в ней) происходит псевдослучайно, в зависимости от длины имени, текущей буквы и других обстоятельств, поэтому предсказать следующее число сложновато. Но есть способы обойти и эту хитрость :) До встречи! Да, и... keep on cracking....
Date :04.09.2002 Author:Cryo E-mail:cryo@cydem.zp.ua
Материалы размещены на http://cracklab.narod.ru/doc/ с разрешения http://cydem.zp.ua/