::: Cracking Part III: Crack mIRC32 v5.6 & Secret Agent v2.05 :::


Здоровеньки булы, битовые монстры! Я продолжаю показывать примеры плохой безопасности у программ! На сей раз жертвами стали mIRC32 v5.6 & Secret Agent v2.05. Начнём пожалуй с mIRC32 =).
Итак...Устанавливаем программку, после чего запускаем её! Нас просят зарегистрироваться..впрочем для нас это не ново =). Мы регимся, но нас обламывают надписью "Sorry, your registration name and number don't match!....". Мы её запоминаем и грузим всё тот же DASM..находим опять же данную строчку и находим адрес вызова данной строчки:

004394D2 call sub_49CCB4 <- процедура проверки введённого
004394D7 test eax,eax <- сравнение результата
004394D9 jz loc_43957A <- если ввели неправильно, то ошибка

Прыгаем на нашу процедуру, после чего начинаем мыслить...=)

Первая проверка связана с длиной введённого:

0049CCC7 cmp eax,5 <- Проверяем длину
0049CCCA jnb short loc_49CCD0 <- Если она больше или равно 5, то прыгаем
0049CCCC xor eax,eax <- иначе обнуляем eax
0049CCCE jmp short loc_49CD2C <- и процедура завершается

Этот кусок уже наводит на кое-какую мысль, но пока нам править тут ничего не надо =). Прыгаем на loc_49CCD0:

loc_49CCD0:
push esi <- сохраняем в стек esi
push ebx <- сохраняем в стек ebx
call sub_49CBD4 <- тра-ля-ля
test eax,eax <- очередная проверка
jz short loc_49CCE2 <- и прыжок
mov eax,1 <- eax:=1
jmp short loc_49CD2C <- процедура заканчивается

Из этого куска мы видим, что опять выполняется какая-то проверка и в зависимости от результата делаем соответствующие действия. Нам это не столь важно! Нам важна строчка mov eax,1! Почему? Потому...если вы ещё не забыли (если забыли, то смотрите кусок кода выше) при неправильном заполнении eax обнуляется. Следовательно eax должно быть отличным от нуля, т.е. равным 1! Вот оно - заветное! Следовательно мы должны занопить переход jz short loc_49CCE2. Вот вам и защита =). Теперь что не пиши в регистрационную форму, тебя зарегят! Меняем байты: 0009C2D9: 74 07 -> 90 90. Всё, крякнуто!

Следующий объект, который мы будем насиловать - Secret Agent v2.05 - это офф лайн браузер! Время - деньги...начнём!
Делаем всё тоже самое: пытаемся зарегиться, запоминаем фразу "Invalid registration..." и находим то место, где она вызывается:

004171A8 call sub_41726E <- вызываем процедуру обработки
004171AD cmp dword ptr [esi+10h],0 <- сравниваем результат с нулём
004171B1 push 30h
004171B3 push edi
004171b4 jnz short loc_4171E0 <- прыгаем, если результат отличен от нуля
004171B6 push offset aInvalidRegistr <- ошибка

Итак...уже ясно, что результат должен быть отличен от нуля. Прыгаем в процедуру и начинаем анализ...как всегда =).
Следуя трезвой логике..нам нужно найти строчку в процедуре, где аргументу [esi+10h] присваевается какая-нить циферка отличная от нуля. Итак..через несколько секунд я нахожу где-то в конце процедуры следующее:

...............
00417312 mov dword ptr [edi+10h],1

loc_417319: <- это конец нашей процедуры
or dword ptr [ebp-4],0FFFFFFFFh
lea ecx, [ebp-10h]
call sub_43162C
mov ecx,[ebp-0Ch]
pop edi
pop ebx
mov large fs:0,ecx
leave
retn

Вот то, что нам надо.....Теперь у нас есть 2 выбора: ламерский и крякерский =). Ламерский - это занопить все переходы в конец функции: на loc_417319. Крякерский - заменить первый переход в конец на свой! Я выбираю крякерский способ =))! Итак..идём в начало процедуры и находим первый переход:

0041729E jz short loc_417319

Теперь меняем его так, чтоб он прыгал сразу на нашу команду, которая находится по адресу 00417312! Я загружаю свой QView и делаю следующие манипуляции: 0001729E: 74 79 -> EB 72.
Вот и всё! ХАКЕД! =)
Серией своих статей о кряке я хотел показать программистам, какую защиту они ставят на программы! Ведь это же смешно..простая банальная защита. Такие программы ломаются в один присест. Я же советую программерам использовать уже проверенные временем алгоритмы шифрования собственного кода программы, ставить всякого рода антидизассемблерские, антиотладочные, антидеббагерские примочки, которые искажают свой код при попытке взлома, "пищат", "вешаются"...что угодно =). Ну а так же такие мелочи, как проверку на искажение кода, путём проверки даты модификации (при этом не нужно выдавать никаких окошек..а то опять взломают..нужно просто тихо делать какие-то манипуляции, чтоб усложнить жизнь крякеру). Ну и прочие капканы. Но всё это только усложнит жизнь настоящему крякеру, но не поможет спасти прогу от взлома =). Ибо надо помнить, что любую программу можно взломать!
На этом я с вами прощаюсь!

AcidFalz

[an error occurred while processing this directive]