Ссылка на оригинал http://www.crackmes.de/users/maxxor/keygenme_v6/
Итак, первым делом проверим файл на упакованность через DIE. Нам показывает что он не упакован, и что написан на С/С++.
Далее загружаем файл в IDA и что же мы там видим. А видим мы там много "лишнего" кода, который определяет и создает формы приложения. Тем не менее, после непродолжительных поисков мы находим функцию, в которой создается форма с текстом "Thank you for registering!".
После вдумчивого анализа графа в IDA вот к чему я пришел:
есть имя и оно должно быть числовое;
есть пароль и он должен быть 20 символов, при этом присутствует символ тире ('-');
Также есть цикл проверки, в котором есть две ветви:
Подумав на ассемблерным кодом, я пришел к выводу, что сначала проверяется чтобы имя было из четырех цифр.
Затем на основе имени заполняется некоторый массив по формуле:
Bufname[j] = name * (name / (8 * j + 16)); j<4;
Потом идет основной цикл, цель которого расчитать индекс для взятия символа и массива хеша:
SecHash = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Вот этот цикл:
for ( k = 0; k < 20; ++k )
{
if ( !k || (signed int)k % 5 ) //проверяется остаток от деления на 5
{
if ( (signed int)k % 2 ) //проверяется остаток от деления на 2
{
a = (signed int)k / 4 + 1; //ветвь первая
if ( a > 3 )
a -= 4;
b = 2 * (Bufname[a] % (signed int)(k + 1));
if ( (signed int)b <= 9 )
b += 3;
if ( (signed int)b >= 36 )
b -= 10;
if ( (b & 0x80000000) != 0 || (signed int)b > 35 ) //проверка на выход за пределы SecHash
b = k + 7;
OutPass += SecHash[b];
}
else
{
c = (signed int)k / 4 + 1; //ветвь вторая
if ( c > 3 )
c -= 4;
d = 2 * (Bufname[c] % (signed int)(k + 1));
if ( (signed int)d <= 9 )
d += 4;
if ( (signed int)d >= 36 )
d -= 10;
if ( (d & 0x80000000) != 0 || (signed int)d > 35 )
d = k + 7;
OutPass += SecHash[d];
}
}
else
{
OutPass += '-';
}
}
По сути алгоритм не так уж и сложен. Вот собственно и все что я хотел рассказать.
Итак, первым делом проверим файл на упакованность через DIE. Нам показывает что он не упакован, и что написан на С/С++.
Далее загружаем файл в IDA и что же мы там видим. А видим мы там много "лишнего" кода, который определяет и создает формы приложения. Тем не менее, после непродолжительных поисков мы находим функцию, в которой создается форма с текстом "Thank you for registering!".
После вдумчивого анализа графа в IDA вот к чему я пришел:
есть имя и оно должно быть числовое;
есть пароль и он должен быть 20 символов, при этом присутствует символ тире ('-');
Также есть цикл проверки, в котором есть две ветви:
Подумав на ассемблерным кодом, я пришел к выводу, что сначала проверяется чтобы имя было из четырех цифр.
Затем на основе имени заполняется некоторый массив по формуле:
Bufname[j] = name * (name / (8 * j + 16)); j<4;
Потом идет основной цикл, цель которого расчитать индекс для взятия символа и массива хеша:
SecHash = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Вот этот цикл:
for ( k = 0; k < 20; ++k )
{
if ( !k || (signed int)k % 5 ) //проверяется остаток от деления на 5
{
if ( (signed int)k % 2 ) //проверяется остаток от деления на 2
{
a = (signed int)k / 4 + 1; //ветвь первая
if ( a > 3 )
a -= 4;
b = 2 * (Bufname[a] % (signed int)(k + 1));
if ( (signed int)b <= 9 )
b += 3;
if ( (signed int)b >= 36 )
b -= 10;
if ( (b & 0x80000000) != 0 || (signed int)b > 35 ) //проверка на выход за пределы SecHash
b = k + 7;
OutPass += SecHash[b];
}
else
{
c = (signed int)k / 4 + 1; //ветвь вторая
if ( c > 3 )
c -= 4;
d = 2 * (Bufname[c] % (signed int)(k + 1));
if ( (signed int)d <= 9 )
d += 4;
if ( (signed int)d >= 36 )
d -= 10;
if ( (d & 0x80000000) != 0 || (signed int)d > 35 )
d = k + 7;
OutPass += SecHash[d];
}
}
else
{
OutPass += '-';
}
}
По сути алгоритм не так уж и сложен. Вот собственно и все что я хотел рассказать.
Комментариев нет:
Отправить комментарий