![]() |
Снятие ASProtect 1.22 - 1.23 Beta 21 и патчинг Lemonade Tycoon v1.1.6
Мишень: Lemonade Tycoon v1.1.6(2100кб, ftp://ftp.gamehouse.com/pub/LemonadeTycoonInstall.exe)
Что еще нужно: 1. OllyDbg + плагин OllyDump 2. ImpRec 1.6 Final 3. IDA 4. Hiew или любой другой шестнадцятиричный редактор 4. Пиво "Beck's", 0.5 ;) Жертва Нашей мишенью является одна незамысловатая играшка. Но самое важное, что она запротекчена "ASProtect 1.22 - 1.23 Beta 21", о чем нам любезно поведал PEID: http://securityprobe.net/other/ProTe..._protected.jpg Жертва пока недосягаема для жестоких козней дизассемблера ;) Поиск OEP Пользоваться автораспаковщиками вроде AsprStripperXP мы не будем и поэтому запустим OllyDbg и откроем в отладчике исполняемый файл проги. Для успешного нахождения оригинальной точки входа жертвы мы должны включить в ольке обработку исключений (memory access voilation, access violation). Заходим в опции отладки (нажав Alt+O) и устанавливаем флажки как на рисунке ниже: http://securityprobe.net/other/ProTe...exceptions.jpg Включение обработки исключений при работе с памятью возвращаемся в окно "CPU" OllyDbg иначинаем проходить исключения(нажимая Shift+F9). После 27 раз (если еще один раз нажать Shift+F9, наша прога пройдет OEP и запустится) мы появимся по адресу .D405CC http://securityprobe.net/other/ProTe...exceptions.jpg Окно "CPU" после обработки 27 исключений Далее необходимо поставить точку останова на команде RETN (.D40609) и приказать ольке "дойти" до нее нажатием Shift+F9 еще раз. Последним этапом в поиске OEP будет установка бряка на доступ аспром к кодовой секции защищаемого им приложения. Для этого нажимаем Alt+M (чтобы вызвать окно "Memory Map") и жмем F2 на второй по счету секции заданного процесса. В нашем случае это Lemonade codesection по адресу 00401000. http://securityprobe.net/other/ProTe...odesection.jpg Бряк на доступ к кодовой секции Последний раз жмякаем по Shift+F9 и ВСЕ!!! Мы на OEP. Чтобы всетаки в это поверить, можно нажать Ctrl+A и олька проведет анализ кода и дизассемблерный листинг вместо непонятных однобайтным выражений обретет "человеческий" вид =) Делаем дамп Выбираем в главном меню Plugins-OllyDump-Dump debugged process и в появившемся окне нажимаем "Dump" (перед этим не забыв снять флаг "Rebuild import", чтобы OllyDump самостоятельно не пытался восстанавливать импорт дампа). http://securityprobe.net/other/ProTe...on/dumping.jpg Делаем дамп с помощью плагина OllyDump Восстановление импорта Просто так дамп (я назвал файл dumped.exe) запускаться не будет - ему нужно восстановить таблицу импортированных функций. Для этого запустим ImpRec и выберем в ней наш исследуемый процесс Lemonade.exe (он будет все еще "стоять" на OEP, ведь Olly вместе с ним мы еще не закрывали). В поле "OEP" вводим адрес нашей OEP(который равен 4FB6B) и кликаем по "IAT AutoSearch"-"Get Imports"-"Show Invalid". Получаем пару сотен неопределенных функций. Для их восстановления попытаемся провести трассировку в 2 этапа. В первом щелкнем правой кнопкой мыши на одной из выделенных неопределенных функций и выбираем в меня "Trace Level1 (Disasm)". Во втором этапе заново щелкаем по "Show invalid", а далее восстанавливаем функции с помощью плагина Plugin Tracers - Asprotect 1.22. После проведенных манипуляций в окне логов появится такая надпись Это говорит о том, что импорт восстановлен и можно произвести модификацию нашего дампа (dumped.exe) нажатием на кнопке "Fix Dump" Итак, мы получили ПОЛНОСТЬЮ работоспособный распакованый файл (dumped_.exe)! Приступим к его анализу... |
Отладка и взлом жертвы с помощью патча
Загружаем распакованную прогу в отладчике. Поскольку для ввода регистрационных данный она использует стандартные окна ввода, и стандартное окно ошибки, то было решино по старинке установить точки останова на вызовах функций MessageBoxA (выводящих сообщения об ошибке) или GetDlgItemTextA (считывающих вводимый текст). http://securityprobe.net/other/ProTe...ting_Break.jpg Установка бряков на вызове функций MessageBoxA Нажатие на кнопку "Enter License Information" привело на такой кусок кода в ольке: http://securityprobe.net/other/ProTe...MessageBox.jpg Прервались на выводе ошибке длинны регкода (она должна быть равна 20) Каким же было мое удивление, когда протрассируя участки с проверкой длин введенных регистрационных данных (.0042563A), кучей строковых и арифметических преобразований с ними (.00425692) и записью сомнительных ключей в реестр я не обнаружил их последующего чтения ни установкой бряков на соответствующих апи, ни с помощью RegMon'а (разумеется, все тестировалось после повторной загрузки программы)! Оказалось, что причиной тому был нижеприведенный участок кода: Код:
seg000:00425D99 call esi ; DialogBoxParamA ; Create a modal dialog box from aКод:
seg000:00425278 lea eax, [ebp+ProcessInformation]http://securityprobe.net/other/ProTe...ateProcess.jpg Ставим бряки на вызовы функций завершения работы приложения Запускаем на выполнение наш файл, вводим необходимые рег.данные (я вводил имя: ProTeuS и код: 1234567890abcdeABCDE) и без проблем получаем искомую точку (.44А841) http://securityprobe.net/other/ProTe...coon/break.jpg Обнаружение точки вызова функции завершения работы приложения поднявщись на несколько уровней вверх по структуре дизассемблерного листинга в IDA видим такой код: |
Код:
seg000:004247A0Заглянув в вызываемую функцию 0042484A call sub_4264BC видим, что в регистр eax заносится 1, содержание ячейки памяти по адресу 57F99C. Код:
seg000:004264BChttp://securityprobe.net/other/ProTe...m_on_write.jpg Бряк на запись в ячейку памяти, хрянящую статус зарегистрированности Жмем по F9 и перед нами появляется такой кусок кода: Код:
seg000:00426296http://securityprobe.net/other/ProTe...ycoon/pat4.jpg Патчим бинарник игры в шестнадцатиричном редакторе Hiew Теперь програма полностью работоспособна. Запуск игры происходи сразу же, без вывода любых нагов и прерываний посреди процесса игры. gl hf 2 all |
| Время: 10:56 |