28 мая 2012 г.

Введение в реверс инженеринг используя IDA - Глава 5

Продолжим иследовать программы при помощи IDA Pro и мегаполезного мануала от Рикардо Нарваха который можно посмотреть на русском тут. Сегодня займемся главой 16 где рассматривается вычисление серийника на основе имени пользователя. В принципе я уже рассматривал такой случай в предыдущей статье под названием "Разбираем crackme - XYZ_KeygenMe20110405". Этот же пример будет гораздо проще, так как там используются стандартное Win API, а не извращенства от китайского друга :)
Итак берем crackme из 1 Главы по ссылке.
Открываем его в IDA Pro и смотрим снова, что мы там можем сделать.

 



Для начала заглянем в импорты, что там интересного можно найти. А там мы видим такую вещь как GetDlgItemTextA. Если щелкнуть на ней 2 раза а потом еще раз 2 раза, то можно оказатся в разделе IAT, что это такое будет в разделе упаковщиков, а пока можно поставить брякопинт на следующую строчку.
Теперь все вызовы GetDlgItemTextA будут останавливаться на нашем брякопинте, так, что запускаем программу и пытаемся ввести логин и пароль. После нажатия на "ОК" программа останавливается на брякпоинте, трейсим ее до выхода или нажимаем CTRL+F7 чтобы сразу оказатся в конце библиотечной функции.
Я предполагаю, что 1 вызов это получение имени а второй это серийника. На скриншете я отметил это овалами.

Если выполнить процедуру, то видно что в третий параметр заносятся имя и серийнк, можно переименовать их в более человеческий вид, опять же будет проще дальше работать, так как уже встретятся знакомые имена переменных. Пусть они будут Name и Serial
Дальше варианта 2, либо мы можем поставить брякпоинты на MessageBoxA как каноничном мануале ну или потрейсить немножко ручками и в итоге получить вот такую картинку.

 
Тут видно интересные процедурки, которые кушают в первом случае имя, а во втором серийник можно поставить брякпоинт на них, чтобы в следующий раз не искать. Ниже этих процедурок идет развилка, если которую посмотреть внимательно, тоесть щелкнуть 2 раза на на вызовах процедур, то одна ведет к выдаче плохой табличке, а вторая к хорошей, пометим их тоже, чтобы было понятно сразу куда ведет эта развилочка. Так и напишем - BadWindow и GoodWindow.

 
В итоге, что мы получаем, нам необходимо посмотреть что в этих 2х вызовах и определить алгоритм генерации серийного номера. Перезапускаем программу и заходим в первый Call, который что то делает с именем.
Пройдя по циклу этой процедуры, становиться ясно, что она делает все буквы в имени большими, а если в имени попадается цифра, то выводит ошибку.
Ключевые моменты я прокомментировал на скриншетах,  так что в принципе все должно быть понятно.


В левой веткой этой процедуры разобрались, теперь посмотрим что находиться в правой стороне, там тоже какаято интересная процедура.
Если зайти в процедуру и немного потрейсить, то можно увидеть, что она тупо складывает hex значение букв и в конце выводит значение в EDI. Я не буду приводить тут код или скриншет, там достаточно простой алгоритм, который определяется на глаз. Лучше посмотрим что происходит дальше. А дальше EDI ксорится с неким волшебным числом 5678h. Это уже интересно становится, в итоге для моего имени Bearchik конечный результат получается 5441h после чего переносится значение в EAX и происходит выход из процедуры. Опыт подсказывает мне, что в следующей процедуре скорей всего будет похожее колдунство только с серийником и потом будет итоговое сравнивание.
Чтож посмотрим, заходим во вторую процедуру параметры у которой - введенный серийник.

Коментарии я проставил, теперь объясню словами, что тут за происходит.
Тут работает следующая формула:
1. Присваем al - 0Ah
2. отнимаем от hex значения первого символа 30h и это остается в EBX
3. Умножаем значение в EDI на EAX где лежит 0Ah
4. Складываем то что получилось в EDI с EBX
Так проделываем с каждым символом и когда символы кончились, проихводится XOR с значением 1234h.
После выхода из процедуры, это все сравнивается со значением 5441h.
Вывод, надо высчитать такой серийник, который бы совпадал после всех манипуляций с 5441h
Для начала сделаем обратный XOR между 5441h и 1234h. Для этого воспользуемся калькулятором предоставленным IDA PRO.

Так как все манипуляции с серийником, это просто приведение к более удобной работе в 16ричном формате, то серийник будет равен 4675h или 18037 в десятичном, проверим это. Работает. В принципе на этом на сегодня и все.

2 комментария:

  1. Классный блог у вас, приятно читать и темы всегда интересные! Всегда хотелось попробовать реверсинженеринг, но все время что то останавливало. Но ваши статьи про IDA просто супер очень интересно и главное что актуальные на сегодняшний день инструменты.

    ОтветитьУдалить
  2. Да нет проблем, меня тоже всегда интересовал реверс. Правда знаний у меня все равно на уровне хобби, профи реверсер из меня никакой :)

    ОтветитьУдалить