Статья [Reverse-Engineering] Решение CrackMe и обход анти-реверс техник

  • colby57
  • UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)
  • 155
  • 2
  • 240
Шалом.

Давно наткнулся на один крякми с crackmes.one, это был довольно примитивный крякми со сравнением пароля и двумя техниками против реверса которая помешала бы новичкам при отладке. Запомните момент про примитивность сравнения пароля, как никак автор этого крякми дал оценку 3 из 6 (Medium).

Начнём с разбора защиты, ибо как я уже и сказал выше она бы доставила много хлопот новичкам. Для начала расскажу какие функции против отладки она использует
Скрытое содержимое доступно для зарегистрированных пользователей!


Как вы уже могли понять, программа проверяет на наличие запущенных процессов в вечном цикле.
Ищет она эти процессы:
1614847791406.png

Лоадер интериума также проверяет через эти функции запущенные процессы =)

Начинаем обходить эти трюки.
Так как IsDebuggerPresent тупо проверяет через CMP на 0x1 (true), то можно поменять проверку на любое другое число (кроме 1 и 0) как к примеру 0x55
1614848029739.png

Первый трюк обошли. Идем дальше.

Тут уже идёт та самая проверка имени процессов. Кажется на первый взгляд, что патчить джампы тут будет очень геморрно, ибо тут слишком много джампов =)
На самом деле тут достаточно в начало функции перезаписать PUSH EBP на RET, тем самым мы обрезали все проверки на имена процессов одной инструкцией.

Теперь функция выглядит так:
C++:
void CheckProcessName()
{
   return;
  
   // Original code
}

1614848334999.png
1614848414078.png


И вот мы обошли два трюка против отладчика. Дальше у нас идёт пароль, тут всё ещё проще чем веник. Для крякми третьего уровня это довольно серьёзный косяк, из-за которого очень легко узнать пароль.

1614848810585.png


Нужно поставить бряк на инструкцию где сравнивается значение из регистра и некая переменная, после перехода на бряк уже будет высвечен сам пароль.
1614848886661.png

1614848901853.png


Пароль: 011101110111100001100011011100000111011101110010011001010111100001001100010110000110100001101011011101010111100001001100

1614848933837.png



На этом всё. Всем добра и позитива.
 
  • 112
  • 92
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Шалом.

Давно наткнулся на один крякми с crackmes.one, это был довольно примитивный крякми со сравнением пароля и двумя техниками против реверса которая помешала бы новичкам при отладке. Запомните момент про примитивность сравнения пароля, как никак автор этого крякми дал оценку 3 из 6 (Medium).

Начнём с разбора защиты, ибо как я уже и сказал выше она бы доставила много хлопот новичкам. Для начала расскажу какие функции против отладки она использует
### Скрытое содержимое ###

Как вы уже могли понять, программа проверяет на наличие запущенных процессов в вечном цикле.
Ищет она эти процессы:
Посмотреть вложение 8811
Лоадер интериума также проверяет через эти функции запущенные процессы =)

Начинаем обходить эти трюки.
Так как IsDebuggerPresent тупо проверяет через CMP на 0x1 (true), то можно поменять проверку на любое другое число (кроме 1 и 0) как к примеру 0x55
Посмотреть вложение 8812
Первый трюк обошли. Идем дальше.

Тут уже идёт та самая проверка имени процессов. Кажется на первый взгляд, что патчить джампы тут будет очень геморрно, ибо тут слишком много джампов =)
На самом деле тут достаточно в начало функции перезаписать PUSH EBP на RET, тем самым мы обрезали все проверки на имена процессов одной инструкцией.

Теперь функция выглядит так:
C++:
void CheckProcessName()
{
   return;
 
   // Original code
}

Посмотреть вложение 8813Посмотреть вложение 8814

И вот мы обошли два трюка против отладчика. Дальше у нас идёт пароль, тут всё ещё проще чем веник. Для крякми третьего уровня это довольно серьёзный косяк, из-за которого очень легко узнать пароль.

Посмотреть вложение 8815

Нужно поставить бряк на инструкцию где сравнивается значение из регистра и некая переменная, после перехода на бряк уже будет высвечен сам пароль.
Посмотреть вложение 8816
Посмотреть вложение 8817

Пароль: 011101110111100001100011011100000111011101110010011001010111100001001100010110000110100001101011011101010111100001001100

Посмотреть вложение 8818


На этом всё. Всем добра и позитива.
Получилось как всегда круто(как дополнение на счет генерации,может кому нибудь будет интересно).
Генерация пароля там тоже несложная.
4epuxa = axupe4. То есть переставляем буквы в обратной последовательности
Изменяем каждый символ axupe4, отнимая от каждого символа 88, потом делим это число на 31, затем к остатку прибавляем 97 и сохраняем.
Это если у вас символ буква. Если символ число, тогда все точно также, только отнимаем 56 и прибавляем 65.
1614890133374.png
1614890225683.png
У меня вышло после всех этих манипуляций jgdynW. Переводим в бинарное число или смотрим в отладчике и получается
011010100110011101100100011110010110111001010111.
 
  • colby57
  • UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)
  • 155
  • 2
  • 240
Получилось как всегда круто(как дополнение на счет генерации,может кому нибудь будет интересно).
Генерация пароля там тоже несложная.
4epuxa = axupe4. То есть переставляем буквы в обратной последовательности
Изменяем каждый символ axupe4, отнимая от каждого символа 88, потом делим это число на 31, затем к остатку прибавляем 97 и сохраняем.
Это если у вас символ буква. Если символ число, тогда все точно также, только отнимаем 56 и прибавляем 65.
У меня вышло после всех этих манипуляций jgdynW. Переводим в бинарное число или смотрим в отладчике и получается
011010100110011101100100011110010110111001010111.
ну не совсем обязательно надо было разбирать алгоритм учитывая такой косяк, но всё же молодец
 
Сверху Снизу