Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Реверсинг (https://forum.antichat.xyz/forumdisplay.php?f=94)
-   -   Recover My Files Crack (https://forum.antichat.xyz/showthread.php?t=46232)

0x0c0de 07.08.2007 10:58

Recover My Files Crack
 
Recover My Files Crack

[Intro]
Программа эта очень полезна, так как позволяет восстанавливать удаленные файлы. Вещь неплохая, но с весомыми ограничениями. В частности, в неактивированной версии отсутствует сохранение найденных файлов… А в этом потребность у меня имелась.. Ну и постоянное напоминание об активации тоже не есть хорошо (для людей с расшатанной психикой, вроде меня). Что касается нахождения готового лекарства к программе – так это лишь в крайних случаях и когда на взлом совсем нет времени.

Приступим
Armadillo must die

Peid сделал неутешительный вывод, что программа накрыта третьей Армадиллой.. Но без Copymem, что меня порадовало. Ну а испорченную иат грех не восстановить. Вариант армы был довольно безобидный, все находилось просто по методу товарища Нарвахи (перевод его статей по третьей версии армадиллы на _http://estetatet.narod.ru/ - 4 части без Copymem - просто супер мануал))). Поэтому основной процесс распаковки я не рассказываю (о нем уже рассказали во всех красках), заострю внимание лишь на тех моментах, где возникли небольшие трудности и пришлось кое-что подправить. Также приведу часть кода патча, который я добавила в распакованный файл. Скрипт, данный в статье Нарвахи, извлекающий список API, нуждается в легкой корректировке
Данный код

Код:

mov [op],"MALA ENTRADA POR FAVOR RESOLVER"
Надо заменить на

Код:

mov [op],pu
А переменная pu – аргумент команды gn, получающей имена функций и модулей (надеюсь вы знакомы с мануалом и понимаете о чем я говорю). То есть когда Скрипт находит адрес, не принадлежащий ни одной апи и пишет MALA ENTRADA POR FAVOR RESOLVER (типа ничего не найдено и исправьте)… Это не очень хорошо (да и больно длинно), поэтому мы пишем “плохой” адрес вместо этой надписи. Кстати, патч тоже глючит, если не исправить.
Патчим. Патч и имена функций пишем в отдельную секцию. Сначала я написала код, который непосредственно пишет адреса функций там, где они были, пользуясь тем, что нашел скрипт, но после этого программа не заработала, а выдавала ошибку, что память по адресу 76b26002 нечитаемая.. Это не есть гут. Судя по адресу - какая-то длл. Посмотрела в запакованном модуле – по этому адресу загружена библиотека winmm.dll. Значит ее надо подгрузить. Поэтому в код патча добавилось

Код:


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

Теперь надо прибить наг скрины с просьбами об активации и деактивировать злое ограничение в сохранении (из-за которого, собственно, я это все мероприятие затеяла). Начнем с точки входа

Код:

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 точки останова на их обработку. Это не составило труда. Таких процедур три
Первая

Код:


procedure TFormMain.actSaveExecute(Sender: TObject);
begin
// Address $794138
end;

Вторая

Код:

procedure TFormMain.actSaveAsExecute(Sender: TObject);
begin
// Address $79407C
end;

Третья

Код:

procedure TFormMain.SaveFiles;
begin
// Address $792D1C
end;

На все три адреса я поставила точки останова. При нажатии Save сработал первый бряк (первый вариант в списке).

Код:

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
Код:

procedure TFormMain.actBuyNowExecute(Sender: TObject);
begin
// Address $79B95C
end;

Тоже интересно

Код:

procedure TFormMain.actRegisterExecute(Sender: TObject);
begin
// Address $79BFC8
end;

Глянем в другие формы (все манипуляции до этого были с формой Main). Форма registration.. Посмотрим в код, сгенерированный Source Rescuer.

Код:


procedure TFormRegister.FormShow(Sender: TObject);
begin
// Address $6FB324
end;

Сюда тоже поставим бряк.
Теперь будем трассировать. Подозрительный условный прыжок выполняется, смотрим что происходит дальше… После выполнения прыжка

Код:


0079415C  JE SHORT RecoverM.007941BA

мы попадаем сюда

Код:

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’а

Код:


007941C4    E8 0300C7FF                CALL five.004041CC
007941C9    8BC3                      MOV EAX,EBX ; тут брякаемся

Этот call => создает форму. Отлично. Теперь попробуем изменить значение нашей заветной переменной.

Код:


 00794159  CMP BYTE PTR DS:[EAX],0

Просто на этом шаге меняем значение переменной с помощью OllyDbg -> Modify data с нуля на 1. Жмем f9 и высвечивается сообщение, что надо выбрать файлы для сохранения. Эврика!))
Значит делаем вывод, что с большой долей вероятности что имеет место быть флаг регистрации. Флаг регистрации - это хорошо, с какой стороны посмотреть, конечно).
Посмотрим, что у нас лежит по адресу 007C2850 (см. начало процедуры выше)- лежит адрес 007C54E0. По этому адресу или ноль или единица. Ставим на него hardware breakpoint on access, чтобы проследить все обращение к этой ячейке памяти. В процессе работы приложения таких обращений будет около 12, большая часть которых при загрузке. Править все эти 12 проверок – некрасиво, да и незачем. Достаточно подправить сам флаг регистрации. Первое ображение к нему – это как раз запись в него нуля. Это не есть гут поэтому
Меняем
Код:


007AE69A    C600 00                    MOV BYTE PTR DS:[EAX],0

на

Код:


007AE69A    C600 01                    MOV BYTE PTR DS:[EAX],1

Всего один байт) Загружаем и… Программа думает, что зарегистрирована. И, конечно, нет никаких наг скринов и файлы прекрасно сохраняются.

[Done]


Время: 11:04