Готовим кейген ARA Хакер, номер #089, стр. 089-064-5 0048E6C0 TEST ECX,ECX 0048E6C2 JE SHORT DUMeter.0048E6CF 0048E6C4 SHR ECX,18 0048E6C7 XOR EDX,ECX 0048E6C9 AND EDX,0FFFFFFF 0048E6CF INC EAX 0048E6D0 CMP BYTE PTR DS:[EAX],0 0048E6D3 JNZ SHORT DUMeter.0048E6B0 Разберем его чуть подробнее: сдвиг числа влево (SHL) на один разряд эквивалентен умножению этого числа на 2. У нас сдвиг на 4 разряда, то есть умножение на 16. Накапливается сумма очередного кода символа имени, умножаемая на 4 после каждого суммирования. Когда имя длинное, и сумма близка к переполнению формата DWORD (программа вылетала бы с ошибкой), она сдвигается вправо на 24 разряда (делится на 2 в 24 степени). AND ECX,F0000000 и переход за ней как раз и проверяет наличие 1 в одном из 4 первых бит числа. Теперь мы на любом удобном для нас языке сможем восстановить эту процедуру за пару минут, используя арифметические действия, либо логические операции – как и сделано в программе. Тут дело удобства и привычки. Едем дальше. Следующая процедура работает с вырезанной строкой 1, то есть со строкой «456» по нашему введенному коду. Сперва идет проверка на длину 3 - тут все в порядке. Следующие три вызова одной процедуры возвращают порядковый номер каждого символа из нашей строки «456» строке "ABCDEFGHIJKLMNOPQRSTUVWXYZ987654". То есть для 4 это будет 32, для 5 – 31 и ноль, если введенного символа вообще нет в строке. В конце процедуры эти порядковые номера немного преобразуются в итоговый результат. Процедуры CALL 0048E7B8 – это совсем просто, преобразуют строку в число, функция StrToInt в Delphi. Вызывается эта функция два раза: первый раз преобразуется строка 2, второй – строка 3. Отметим, что число, получаемое из строки 2, затем сравнивается с числом, полученным после преобразования введенного имени пользователя, то есть они должны быть равны. Выполнив такое же преобразование над именем (мы его рассмотрели чуть выше), как и в программе, мы можем получить часть верного серийного номера. Имя Ara было преобразовано в число 4661, значит, наш код примет вид D3-456-00004661-78901234, где нам уже известны первая и третья его части. Смотрим дальше… Нам остается совсем немного: разобрать процедуру, которая работает со строкой 4. Функция по адресу 0048E953 вычисляет CRC32 из нашей строки 4 (вспоминаем, что нам показал плагин KANAL), затем выполняется операция XOR с полученной ранее функцией от имени и сравнивается с последней частью введенного кода. Если все верно, то мы ввели правильный код. Работу алгоритма CRC32 мы рассматривать не будем, так как есть множество готовых исходников и компонентов, реализующих этот алгоритм, а при написании кейгена будем использовать уже готовый алгоритм. Один момент... Остается один момент, который касается строки 1. Результат ее преобразования в дальнейшем не используется, то есть на ее место можно вставить любые символы (заглавные латинские). Однако некоторые люди утверждают, что они все-таки используются в скрытых проверках, и по прошествии некоторого времени регистрация становится недействительна. Но голые фразы, без кусков кода и процедур скрытых проверок, ничего не доказывают, а у меня (да и у многих) программа прекрасно работает уже давно. Такое же мнение и у EGOiST’а/TSRh, автора кейгена к этой программе, который был написан задолго до этой статьи. EGOiST’у отдельное большое человеческое спасибо за помощь и консультации при написании этой статьи. |