четверг, 24 декабря 2015 г.

Разбор MaxXor's KeygenMe V6

Ссылка на оригинал 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 += '-';
        }
      }

По сути алгоритм не так уж и сложен. Вот собственно и все что я хотел рассказать.

Комментариев нет:

Отправить комментарий