Recover My Files Crack

Discussion in 'Реверсинг' started by 0x0c0de, 7 Aug 2007.

  1. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    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]
     
    2 people like this.