Современные решения

для защиты Windows приложений

и восстановления исходного кода
Автор: samvel. Дата публикации: 30.06.2005

Исследование защиты Test Protection 3 by DotFix Software


На днях зайдя на любимый сайт wasm.ru я обнаружил интересную статью
"Руководство по исследованию программ, написанных на VB 6.0". Прочитав
ее, я понял, что мой путь лежит в раздел "Разное" сайта
www.dotfix.net, который я периодически посещаю, но вот на указанный
раздел как-то внимания не обращал.


Пропатченный TestProtection3.exe, выводит палиндром фразы "улыбок тебе дед макар".
В файле пропатчено 7 байт; так как в задании разрешается патчить 8 байтов, возможно еще один
байтик предназначался для того, чтобы в слове "ракам" вторую букву "а" заменить на букву "о". Я этого делать не стал, в целях сохранения целостности палиндрома, однако делается это аналогично тому, как описано ниже.

Взламывается этот сэмпл следующим образом:
1. Находим OEP=00401250, распаковываем прогу, восстанавливаем импорт ImpRec’ом, суем ее в W32Dasm и видим импортируемые VB-функции. Среди них есть одна интересная - MidCharBstr, вызов которой осуществляется по адресу 004024E6. Ставим по этому адресу точку останова в SoftIce, вылетаем в отладчик, и видим, что указанная функция в цикле в полном соответствии с названием выбирает символы из исходной строки палиндрома, адрес которой
передается функции через стек по адресу 004024E5. То, в каком порядке выбираются символы определяется чуть ранее: соответствующее значение возвращает в eax функция по адресу 004024D0: при работе исходного файла это последовательность 1,2,3,.......21. Таким образом, становится понятна основная идея патча: сделать так, чтобы в стек по адресу 004024D9 возвращались те же числа, но в обратной последовательности. Для этого я использовал следующую замену кода (предварительно заметив тот факт, что регистр edi на протяжении всех итераций цикла остается равным нулю, в результате чего становится возможным использовать его в
качестве счетчика):

Исходный код:

004024CF 50 push eax 004024D0 FF15A8104000 call [004010A8]

Заменяющий код:

33C0 xor eax,eax B015 mov al, 15 2BC7 sub eax,edi 47 inc edi

Таким образом, мы уложились всего в семь байт, что соответствует
условию задачи.

2. Второй этап заключается в самом инлайн патче. Запускаем LordPE, Break&Enter, bpint3, выбираем исходный запакованный экзешник, прерываемся на точке входа в теле загрузчика, начинаем его трассировать и устанавливаем, что прыжок на OEP осуществляется по
адресу 004001D1:

004001СD 78F3 js............ 004001CF 7503 jnz........... (1) 004001D1 FF630C jmp dword ptr [ebx+0Ch]

Выше в упаковщике можно увидеть кучу нулей, следовательно туда мы и будем перенаправлять jmp. Правим в Ultraedit’e код

004001CD 7505 jnz........... (1) 004001CF E9CCFEFFFF jmp 004000A0

Начиная с ареса 004000A0 мы дописываем следующий код патчера:

004000A0 C705CF24400033C0B015 mov dword ptr [004024CF],15B0C033 004000AA 66C705D32440002BC7 mov word ptr [004024D3],C72B 004000B3 C605D524400047 mov byte ptr [004024D5], 47 И прыжок на OEP: 004000BA E991110000 jmp 00401250

После всех этих манипуляций прога и выдаст нам заветную фразу. К слову, взломанный экзешник прекрасно работает в Win98, WinXP HE Russian, WinXP PE Russian (протестировано на 4 машинах). Однако в моей системе WinXP Corporate + SP2 он при запуске выдал ошибку :-(((
С этим разбираться я не стал, так как думаю поставленная цель достигнута.

Вот вроде и все.

Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

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