Recover My Files Crack [Intro] Программа эта очень полезна, так как позволяет восстанавливать удаленные файлы. Вещь неплохая, но с весомыми ограничениями. В частности, в неактивированной версии отсутствует сохранение найденных файлов… А в этом потребность у меня имелась.. Ну и постоянное напоминание об активации тоже не есть хорошо (для людей с расшатанной психикой, вроде меня). Что касается нахождения готового лекарства к программе – так это лишь в крайних случаях и когда на взлом совсем нет времени. Приступим Armadillo must die Peid сделал неутешительный вывод, что программа накрыта третьей Армадиллой.. Но без Copymem, что меня порадовало. Ну а испорченную иат грех не восстановить. Вариант армы был довольно безобидный, все находилось просто по методу товарища Нарвахи (перевод его статей по третьей версии армадиллы на _http://estetatet.narod.ru/ - 4 части без Copymem - просто супер мануал))). Поэтому основной процесс распаковки я не рассказываю (о нем уже рассказали во всех красках), заострю внимание лишь на тех моментах, где возникли небольшие трудности и пришлось кое-что подправить. Также приведу часть кода патча, который я добавила в распакованный файл. Скрипт, данный в статье Нарвахи, извлекающий список API, нуждается в легкой корректировке Данный код Code: mov [op],"MALA ENTRADA POR FAVOR RESOLVER" Надо заменить на Code: mov [op],pu А переменная pu – аргумент команды gn, получающей имена функций и модулей (надеюсь вы знакомы с мануалом и понимаете о чем я говорю). То есть когда Скрипт находит адрес, не принадлежащий ни одной апи и пишет MALA ENTRADA POR FAVOR RESOLVER (типа ничего не найдено и исправьте)… Это не очень хорошо (да и больно длинно), поэтому мы пишем “плохой” адрес вместо этой надписи. Кстати, патч тоже глючит, если не исправить. Патчим. Патч и имена функций пишем в отдельную секцию. Сначала я написала код, который непосредственно пишет адреса функций там, где они были, пользуясь тем, что нашел скрипт, но после этого программа не заработала, а выдавала ошибку, что память по адресу 76b26002 нечитаемая.. Это не есть гут. Судя по адресу - какая-то длл. Посмотрела в запакованном модуле – по этому адресу загружена библиотека winmm.dll. Значит ее надо подгрузить. Поэтому в код патча добавилось Code: 00BDA222 EB 30 JMP SHORT RecoverM.00BDA254 00BDA224 58 POP EAX 00BDA225 50 PUSH EAX ; имя dll 00BDA226 FF15 19A0BD00 CALL DWORD PTR DS:[BDA019] ; kernel32.LoadLibraryA 00BDA22C 8B25 0AA0BD00 MOV ESP,DWORD PTR DS:[BDA00A] 00BDA232 61 POPAD ; восстановление регистров 00BDA233 - E9 7442BDFF JMP RecoverM.007AE4AC ; переход на oep …. 00BDA254 E8 CBFFFFFF CALL RecoverM.00BDA224 ; ну это всем понятно=) 00BDA259 77 69 6E 6D 6D 2E 64 6C 6C winmm.dll Полный код не привожу по причине его размера (если есть непреодолимое желание его лицезреть - пишите в пм). После подгрузки длл все заработало на ура. Crack Теперь надо прибить наг скрины с просьбами об активации и деактивировать злое ограничение в сохранении (из-за которого, собственно, я это все мероприятие затеяла). Начнем с точки входа Code: 007AE4AC 55 PUSH EBP 007AE4AD 8BEC MOV EBP,ESP 007AE4AF B9 08000000 MOV ECX,8 007AE4B4 6A 00 PUSH 0 007AE4B6 6A 00 PUSH 0 007AE4B8 49 DEC ECX 007AE4B9 ^ 75 F9 JNZ SHORT RecoverM.007AE4B4 007AE4BB 53 PUSH EBX 007AE4BC 56 PUSH ESI 007AE4BD B8 8CD47A00 MOV EAX,RecoverM.007AD48C Стартовый код довольно необычный (я его где-то уже видела, но довольно давно), что за компилятор сказать не решусь… Определенно что-то знакомое. Посмотрим, что скажут мне детекторы. PeId скроил непонимающую физиономию и выдал Nothing found *.. Die оказался более информативен и предложил варианты, что это либо делфи, либо паскаль. Поверим на слово. Если это действительно так, то можно воспользоваться программой Source Rescuer. Это декомпилятор для прог, написанных на Delphi и C++ Builder. Удобен тем, что показывает адрес, где какая-либо процедура находится. А теперь немного отвлечемся от процесса декомпиляции и посмотрим, как защита выглядит визуально. Мы нажимаем в главном окне на Save, но программа сразу же предлагает зарегистрироваться, перед тем как воспользоваться всеми благами данного продукта. Значит в коде главной формы (Main) требуется найти все процедуры, имеющие отношение к сохранению, и поставить в OllyDbg точки останова на их обработку. Это не составило труда. Таких процедур три Первая Code: procedure TFormMain.actSaveExecute(Sender: TObject); begin // Address $794138 end; Вторая Code: procedure TFormMain.actSaveAsExecute(Sender: TObject); begin // Address $79407C end; Третья Code: procedure TFormMain.SaveFiles; begin // Address $792D1C end; На все три адреса я поставила точки останова. При нажатии Save сработал первый бряк (первый вариант в списке). Code: 00794138 PUSH EBP 00794139 MOV EBP,ESP 0079413B PUSH 0 0079413D PUSH EBX 0079413E PUSH ESI 0079413F MOV EBX,EAX 00794141 XOR EAX,EAX 00794143 PUSH EBP 00794144 PUSH RecoverM.007941E6 00794149 PUSH DWORD PTR FS:[EAX] 0079414C MOV DWORD PTR FS:[EAX],ESP 0079414F CALL RecoverM.007AC2AC 00794154 MOV EAX,DWORD PTR DS:[7C2850] 00794159 CMP BYTE PTR DS:[EAX],0 ; предположительно флаг регистрации 0079415C JE SHORT RecoverM.007941BA ; заинтересовал этот условный джамп 0079415E MOV EAX,DWORD PTR DS:[7C236C] 00794163 MOV EAX,DWORD PTR DS:[EAX] 00794165 CALL RecoverM.007A9394 0079416A TEST AL,AL Сразу хочу сказать, что искать верный ключ я не буду, так как при сканирование Krypto Analyser-ом результатом было несколько найденных криптосигнатур (4). Это совсем не радовало. Blowfish меня более всего смутил) А теперь о процедуре сохранения. Условный прыжок по адресу 0079415C, привлек внимание из-за двух предыдущих инструкций. А не флаг ли это регистрации? Но эту гипотезу нужно сначала подтвердить и получить как следствие научный факт)))). Реверсер предполагает, а программист располагает) Теперь возвращаемся в декомпилятор и ищем вызовы плохих процедур, отвечающих за вызов наг скрина, чтобы знать врага в лицо. Обработка кнопки Buy Now Code: procedure TFormMain.actBuyNowExecute(Sender: TObject); begin // Address $79B95C end; Тоже интересно Code: procedure TFormMain.actRegisterExecute(Sender: TObject); begin // Address $79BFC8 end; Глянем в другие формы (все манипуляции до этого были с формой Main). Форма registration.. Посмотрим в код, сгенерированный Source Rescuer. Code: procedure TFormRegister.FormShow(Sender: TObject); begin // Address $6FB324 end; Сюда тоже поставим бряк. Теперь будем трассировать. Подозрительный условный прыжок выполняется, смотрим что происходит дальше… После выполнения прыжка Code: 0079415C JE SHORT RecoverM.007941BA мы попадаем сюда Code: 007941BA 8B83 E8030000 MOV EAX,DWORD PTR DS:[EBX+3E8] 007941C0 66:BE EFFF MOV SI,0FFEF 007941C4 E8 0300C7FF CALL five.004041CC 007941C9 8BC3 MOV EAX,EBX 007941CB E8 C0A6FFFF CALL five.0078E890 007941D0 33C0 XOR EAX,EAX 007941D2 5A POP EDX 007941D3 59 POP ECX 007941D4 59 POP ECX 007941D5 64:8910 MOV DWORD PTR FS:[EAX],EDX 007941D8 68 ED417900 PUSH five.007941ED 007941DD 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] 007941E0 E8 FF0CC7FF CALL five.00404EE4 007941E5 C3 RETN Сначала, я, конечно, трассировала, но это очень долго и как, потом выяснилось (трассировала по рет от процедуры активации– Ctrl+f9) там была цепочка из где-то 11 процедур и только потом шел вызов злой формы… В общем трассировать было бесполезно (умереть за трассировкой)). Вместо всего этого кодомазохизма я поставила бряки после каждого call и это принесло результаты! Но обо всем по порядку. Потом срабатывает бряк на создании формы регистрации (адрес 6FB324).. Жму f9 и срабатывает брекпоит после первого call’а Code: 007941C4 E8 0300C7FF CALL five.004041CC 007941C9 8BC3 MOV EAX,EBX ; тут брякаемся Этот call => создает форму. Отлично. Теперь попробуем изменить значение нашей заветной переменной. Code: 00794159 CMP BYTE PTR DS:[EAX],0 Просто на этом шаге меняем значение переменной с помощью OllyDbg -> Modify data с нуля на 1. Жмем f9 и высвечивается сообщение, что надо выбрать файлы для сохранения. Эврика!)) Значит делаем вывод, что с большой долей вероятности что имеет место быть флаг регистрации. Флаг регистрации - это хорошо, с какой стороны посмотреть, конечно). Посмотрим, что у нас лежит по адресу 007C2850 (см. начало процедуры выше)- лежит адрес 007C54E0. По этому адресу или ноль или единица. Ставим на него hardware breakpoint on access, чтобы проследить все обращение к этой ячейке памяти. В процессе работы приложения таких обращений будет около 12, большая часть которых при загрузке. Править все эти 12 проверок – некрасиво, да и незачем. Достаточно подправить сам флаг регистрации. Первое ображение к нему – это как раз запись в него нуля. Это не есть гут поэтому Меняем Code: 007AE69A C600 00 MOV BYTE PTR DS:[EAX],0 на Code: 007AE69A C600 01 MOV BYTE PTR DS:[EAX],1 Всего один байт) Загружаем и… Программа думает, что зарегистрирована. И, конечно, нет никаких наг скринов и файлы прекрасно сохраняются. [Done]