Готовим кейген ARA Хакер, номер #089, стр. 089-064-4 0048E8B1 MOV DL,BYTE PTR DS:[ESI] 0048E8B3 CMP DL,BYTE PTR DS:[EBX] 0048E8B5 JNZ SHORT DUMeter.0048E8BF 0048E8B7 MOV CL,BYTE PTR DS:[ESI+1] 0048E8BA CMP CL,BYTE PTR DS:[EBX+1] 0048E8BD JLE SHORT DUMeter.0048E8C6 0048E8BF XOR EAX,EAX 0048E8C1 JMP DUMeter.0048E964 Разберем этот с виду большой участок. Цикл 0048E879.. 0048E88A – проверка на принадлежность введенных символов пароля интервалу ‘a’..’z’ и добавления к ASCII-коду, которому принадлежит символ байта E0. Странно, но окно ввода позволяет вводить только заглавные буквы и цифры, так что наши символы просто не могут быть из этого ряда. Код чуть ниже – проверка длины введенного серийного номера. И если он не равен нужной (18h=24 символа), то выход из процедуры будет с плачевным результатом. Итак, длина пароля нам известна, и она фиксирована. Поменяем вводимые нами данные для дальнейшего анализа, только теперь введем ровно 24 символа. Код ниже нам уже знаком – проверка принадлежности символа интервалу маленьких латинских букв. Только теперь довольствовались всего лишь первым символом. А далее наш первый символ сравнивается с буквой D, и, если они не равны, проверка не пройдена. А еще ниже сравнивается и второй символ с цифрой 3. Снова меняем вводимый код, ставим первыми символы D3(вспомним передаваемую в процедуру строку, о которой говорилось выше). Не забываем перемещать бряки на новые позиции, теперь он у нас должен стоять на адресе 0048Е8С6, так как проверку длины и первых двух символов введенного кода мы уже прошли, и наш новый пароль эти проверки уже проходит. Далее 4 раза вызывается процедура CALL 0048E5EA. Ее назначение – получение символов из строки, длина последовательности – в регистре ЕСХ, а адрес строки – в EDX. Я напротив этих вызовов поставил в отладчике символический комментарий в виде Copy(S,1,ecx). Вообще, полезное дело расставлять собственные комментарии к уже разобранным процедурам – улучшает вид кода в отладчике и помогает не запутаться в дебрях вызовов процедур. Смотрим, какие же части нашего пароля нужны проге. Первый вызов вырезает 3 символа, начиная с 4-го, второй – 8 символов, начиная с 8-го, третий – последние 8 символов, четвертый – 16 первых символов. Назовем их условно строками 1,2,3 и 4, чтобы дальше по тексту называть их именно так. Получились не задействованы третий, седьмой и шестнадцатый символ, то есть они могут быть любыми (пока это предварительные данные). Заменим их на классическое тире. В итоге получаем наш пароль вида D3-XXX-XXXXXXXX-XXXXXXXX, где Х – неизвестные (пока) символы заглавных букв и цифр латинского алфавита. Я ввел D3-456-89012345-78901234. Остается выяснить все остальные символы. Назначение процедуры CALL 0048E80C понять нетрудно – приводит строку к верхнему регистру, исключая пробелы, если они есть. В качестве строки – наше имя. А вот следующая процедура производит нехитрые манипуляции с преобразованным именем. 0048E6B0 SHL EDX,4 0048E6B3 MOVSX ECX,BYTE PTR DS:[EAX] 0048E6B6 ADD EDX,ECX 0048E6B8 MOV ECX,EDX 0048E6BA AND ECX,F0000000 |