|
|||||||||||||||||||||||||||||||||||
Автор: samvel. Дата публикации: 30.06.2005
|
Взлом CrackMe 3 от GPcHНа днях зайдя на любимый сайт wasm.ru я обнаружил интересную статью"Руководство по исследованию программ, написанных на VB 6.0". Прочитав ее, я понял, что мой путь лежит в раздел "Разное" сайта www.dotfix.net, который я периодически посещаю, но вот на указанный раздел как-то внимания не обращал. Пропатченный crackme3.exe, выводит палиндром фразы "улыбок тебе дед макар". В файле пропатчено 7 байт; так как в задании разрешается патчить 8 байтов, возможно еще один байтик предназначался для того, чтобы в слове "ракам" вторую букву "а" заменить на букву "о". Я этого делать не стал, в целях сохранения целостности палиндрома, однако делается это аналогично тому, как описано ниже. Взламывается этот crackme следующим образом: 1. Находим OEP=00401250, распаковываем прогу, восстанавливаем импорт ImpRec’ом, суем ее в W32Dasm и видим импортируемые VB-функции. Среди них есть одна интересная - MidCharBstr, вызов которой осуществляется по адресу 004024E6. Ставим по этому адресу точку останова в SoftIce, вылетаем в отладчик, и видим, что указанная функция в цикле в полном соответствии с названием выбирает символы из исходной строки палиндрома, адрес которой передается функции через стек по адресу 004024E5. То, в каком порядке выбираются символы определяется чуть ранее: соответствующее значение возвращает в eax функция по адресу 004024D0: при работе исходного файла это последовательность 1,2,3,.......21. Таким образом, становится понятна основная идея патча: сделать так, чтобы в стек по адресу 004024D9 возвращались те же числа, но в обратной последовательности. Для этого я использовал следующую замену кода (предварительно заметив тот факт, что регистр edi на протяжении всех итераций цикла остается равным нулю, в результате чего становится возможным использовать его в качестве счетчика): Исходный код:
Заменяющий код:
Таким образом, мы уложились всего в семь байт, что соответствует условию задачи. 2. Второй этап заключается в самом инлайн патче. Запускаем LordPE, Break&Enter, bpint3, выбираем исходный запакованный экзешник, прерываемся на точке входа в теле загрузчика, начинаем его трассировать и устанавливаем, что прыжок на OEP осуществляется по адресу 004001D1:
Выше в упаковщике можно увидеть кучу нулей, следовательно туда мы и будем перенаправлять jmp. Правим в Ultraedit’e код
Начиная с ареса 004000A0 мы дописываем следующий код патчера:
После всех этих манипуляций прога и выдаст нам заветную фразу. К слову, взломанный экзешник прекрасно работает в Win98, WinXP HE Russian, WinXP PE Russian (протестировано на 4 машинах). Однако в моей системе WinXP Corporate + SP2 он при запуске выдал ошибку :-((( С этим разбираться я не стал, так как думаю поставленная цель достигнута. Вот вроде и все.
|
|
| ||||||||||||||||||||||||||||||||