Авторские статьи Mobile Music Pro 1.0.0.1. Убираем ограничения!

Discussion in 'Статьи' started by KindEcstasy, 14 Sep 2007.

  1. KindEcstasy

    KindEcstasy Banned

    Joined:
    30 Sep 2006
    Messages:
    105
    Likes Received:
    64
    Reputations:
    54
    Mobile Music Pro 1.0.0.1. Убираем ограничения!​


    Инструменты:

    OllyDebuger - отладчик.




    Программа:

    Mobile Music Pro может служить конвертером из формата midi в другие форматы мелодий для сотовых телефонов (mmf,imelody,rtttl) и наоборот из форматов для сотовых может сделать midi. Кроме того она предназначенна и для составления мелодий из нот, короче программа нужна только для тех у кого сотовые телефоны старых моделей, или кому не нравиться mp3!




    Процесс:

    Итак, для начала проверим программу в PEiD, который скажет нам что прога не запакованна и написанна на C++, что не может нас не радовать. Посмотрим какие ограничения составили нам разработчики:

    1) Сохранить созданную мелодию кнопкой "Save" не удаётся!
    2) Кнопка "Save As..." тоже не работает
    3) При конвертации мелодий стоит ограничение на конвертацию всего лишь на несколько нот.

    Приступим. Загружаем прогу без отладчика! Сочиняем мелодию и пытаемся сохранить, но тут облом... Мерзкое окошко с ошибкой вида "You can't save file in evaluation version!", пытаеться остановить нас! Теперь попробуем нажать на "Save As..." и тоже самое окно мозолит нам глаза... Так картина ясна!

    Грузим прогу в Olly и сканируем строки, далее ищем строку "You can't save file in evaluation version!", и переходим туда, где она встечаеться в коде. Мдааа плачевная ситуация, почему бы разработчикам не применять банальный способ защиты от StringReference-взлома, ну да ладно, видим такую картину:


    Code:
    0044E91D     0FBE02         MOVSX EAX,BYTE PTR DS:[EDX]              ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    0044E920     85C0           TEST EAX,EAX                             ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    0044E922     75 19          JNZ SHORT MMPro.0044E93D                 ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    0044E924  |. 6A 20          PUSH 20                                  ; /Style = MB_OK|MB_ICONQUESTION|MB_APPLMODAL
    0044E926  |. 68 DCD24C00    PUSH MMPro.004CD2DC                      ; |Title = "Evaluation Version"
    0044E92B  |. 68 F0D24C00    PUSH MMPro.004CD2F0                      ; |Text = "You can't save file in evaluation version."
    0044E930  |. 6A 00          PUSH 0                                   ; |hOwner = NULL
    0044E932  |. FF15 00A54B00  CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
    0044E938  |. E9 3D040000    JMP MMPro.0044ED7A
    0044E93D  |> 8B8D 14D4FFFF  MOV ECX,DWORD PTR SS:[EBP-2BEC]
    0044E943  |. 81C1 70030000  ADD ECX,370
    0044E949  |. E8 0418FFFF    CALL MMPro.00440152
    0044E94E  |. E9 27040000    JMP MMPro.0044ED7A
    0044E953  |> 8B0D E81B4D00  MOV ECX,DWORD PTR DS:[4D1BE8]
    0044E959  |. 030D E41B4D00  ADD ECX,DWORD PTR DS:[4D1BE4]
    0044E95F     0FBE11         MOVSX EDX,BYTE PTR DS:[ECX]              ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    0044E962  |. 85D2           TEST EDX,EDX                             ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    0044E964  |. 75 19          JNZ SHORT MMPro.0044E97F                 ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    0044E966  |. 6A 20          PUSH 20                                  ; /Style = MB_OK|MB_ICONQUESTION|MB_APPLMODAL
    0044E968  |. 68 1CD34C00    PUSH MMPro.004CD31C                      ; |Title = "Evaluation Version"
    0044E96D  |. 68 30D34C00    PUSH MMPro.004CD330                      ; |Text = "You can't save file in evaluation version."
    0044E972  |. 6A 00          PUSH 0                                   ; |hOwner = NULL
    0044E974  |. FF15 00A54B00  CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
    0044E97A  |. E9 FB030000    JMP MMPro.0044ED7A
    0044E97F  |> 8B8D 14D4FFFF  MOV ECX,DWORD PTR SS:[EBP-2BEC]
    0044E985  |. 81C1 70030000  ADD ECX,370

    Посмотрите на первые три строки! В регистр EAX что-то должно отправиться из EDX (вернее байт), потом идёт сравнение EAX, и если в EAX содержиться значение большее значения "0" то условный переход отправит нас по адресу 0044E93D! Но вся загвоздка в том что этого не произойдёт, по причине что в EAX так и останеться НУЛЬ! Значит чтобы перепрыгнуть окошко с ошибкой нам нужно как то увеличить значение EAX! Конечно можно и JNZ заменить на JMP (безусловный переход), но этот способ работает не всегда, хотя тут я думаю что сработает, но мы сделаем по другому:

    Если по адресу 0044E91D, написать вместо MOVSX EAX,BYTE PTR DS:[EDX], mov eax,1, то какая инструкция затрёт наш переход потому, что mov eax,1 занимает больше байт в памяти чем MOVSX EAX,BYTE PTR DS:[EDX] (это видно в отладчике). А вот если написать вместо MOVSX EAX,BYTE PTR DS:[EDX], INC EAX (один байт - увеличение eax на 1), то всё пройдет отлично, главное поставить галочку на "Fill with NOP's", которая добавит 2 NOP'a в недостающие байты. (Если ей пренибреч, то отладчик автоматически вставит в следующие 2 инструкции мусорные байты). Должна получиться такая вот картина:


    Code:
    0044E91D     40             INC EAX                                  ; ПРОПАТЧЕННЫЕ БАЙТЫ
    0044E91E     90             NOP
    0044E91F     90             NOP
    0044E920     85C0           TEST EAX,EAX
    0044E922     75 19          JNZ SHORT MMPro.0044E93D
    0044E924  |. 6A 20          PUSH 20                                  ; /Style = MB_OK|MB_ICONQUESTION|MB_APPLMODAL
    0044E926  |. 68 DCD24C00    PUSH MMPro.004CD2DC                      ; |Title = "Evaluation Version"
    0044E92B  |. 68 F0D24C00    PUSH MMPro.004CD2F0                      ; |Text = "You can't save file in evaluation version."
    0044E930  |. 6A 00          PUSH 0                                   ; |hOwner = NULL
    0044E932  |. FF15 00A54B00  CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
    0044E938  |. E9 3D040000    JMP MMPro.0044ED7A
    0044E93D  |> 8B8D 14D4FFFF  MOV ECX,DWORD PTR SS:[EBP-2BEC]
    0044E943  |. 81C1 70030000  ADD ECX,370
    0044E949  |. E8 0418FFFF    CALL MMPro.00440152
    0044E94E  |. E9 27040000    JMP MMPro.0044ED7A
    0044E953  |> 8B0D E81B4D00  MOV ECX,DWORD PTR DS:[4D1BE8]
    0044E959  |. 030D E41B4D00  ADD ECX,DWORD PTR DS:[4D1BE4]
    0044E95F     0FBE11         MOVSX EDX,BYTE PTR DS:[ECX]
    0044E962  |. 85D2           TEST EDX,EDX
    0044E964  |. 75 19          JNZ SHORT MMPro.0044E97F
    0044E966  |. 6A 20          PUSH 20                                  ; /Style = MB_OK|MB_ICONQUESTION|MB_APPLMODAL
    0044E968  |. 68 1CD34C00    PUSH MMPro.004CD31C                      ; |Title = "Evaluation Version"
    0044E96D  |. 68 30D34C00    PUSH MMPro.004CD330                      ; |Text = "You can't save file in evaluation version."
    0044E972  |. 6A 00          PUSH 0                                   ; |hOwner = NULL
    0044E974  |. FF15 00A54B00  CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
    0044E97A  |. E9 FB030000    JMP MMPro.0044ED7A
    0044E97F  |> 8B8D 14D4FFFF  MOV ECX,DWORD PTR SS:[EBP-2BEC]
    0044E985  |. 81C1 70030000  ADD ECX,370
    Теперь когда EAX увеличиться на 1, условный переход кинет нас на 0044E93D, но там нас подстеригает вторая проверка (как я понял это проверка комманды "Save Ass..."). C ней поступаем аналогично, только вместо EAX, у нас теперь фигурирует EDX! Оставлю это вам, ничего сложного в этом нет, просто сделать всё тоже, но с EDX! Итак, первые две проверки мы обошли! Осталать трейтия!

    Не закрывая отладчик, запустите копию программы и попробуйте сконвертировать что-нибудь... Вы увидите сообщение:

    "In evaluation version only 10 notes will be converted!"

    Вот эту сроку мы и найдём в отладчике. Перейдём по ней и увидим код:


    Code:
    0048CEC3     0FBE08         MOVSX ECX,BYTE PTR DS:[EAX]
    0048CEC6  |. 85C9           TEST ECX,ECX
    0048CEC8  |. 75 42          JNZ SHORT MMPro.0048CF0C
    0048CECA  |. 817D 08 100C00>CMP DWORD PTR SS:[EBP+8],0C10
    0048CED1  |. 74 09          JE SHORT MMPro.0048CEDC
    0048CED3  |. 817D 08 110C00>CMP DWORD PTR SS:[EBP+8],0C11
    0048CEDA  |. 75 19          JNZ SHORT MMPro.0048CEF5
    0048CEDC  |> 6A 30          PUSH 30
    0048CEDE  |. 68 60F94C00    PUSH MMPro.004CF960                ;  ASCII "Evaluation version limit"
    0048CEE3  |. 68 7CF94C00    PUSH MMPro.004CF97C                ;  ASCII "Note: In evaluation version, only 4 whole notes duration will be converted.
    If you want whole song will be converted. Please register Mobile Music Pro.
    Thanks."
    0048CEE8  |. 8B8D D0FDFFFF  MOV ECX,DWORD PTR SS:[EBP-230]
    0048CEEE  |. E8 50F40100    CALL MMPro.004AC343
    0048CEF3  |. EB 17          JMP SHORT MMPro.0048CF0C
    0048CEF5  |> 6A 30          PUSH 30
    0048CEF7  |. 68 20FA4C00    PUSH MMPro.004CFA20                ;  ASCII "Evaluation version limit"
    0048CEFC  |. 68 3CFA4C00    PUSH MMPro.004CFA3C                ;  ASCII "Note: In evaluation version, only 10 notes will be converted.
    If you want whole song will be converted. Please register Mobile Music Pro.
    Thanks."
    0048CF01  |. 8B8D D0FDFFFF  MOV ECX,DWORD PTR SS:[EBP-230]
    0048CF07  |. E8 37F40100    CALL MMPro.004AC343
    0048CF0C  |> 6A 20          PUSH 20
    0048CF0E  |. 6A 00          PUSH 0
    0048CF10  |. 8D95 8CFEFFFF  LEA EDX,DWORD PTR SS:[EBP-174]
    0048CF16  |. 52             PUSH EDX
    0048CF17  |. E8 A48C0000    CALL MMPro.00495BC0
    Как вы догадались наверное, тут нужно сделать тоже самое, но с регистром ECX, а именно по адресу 0048CEC3 нужно вписать INC ECX вместо MOVSX ECX,BYTE PTR DS:[EAX], и тогда условный переход JNZ по адресу 0048CEC8 кинет нас на 0048CF0C, тем самым мы обойдём проверку 4 или 10 нот! Кстати комманда JNZ означает Jump if Not Zero (прыгнуть, если не нуль). После всех манипуляций у меня получилось вот так:


    Code:
    0048CEC3     41             INC ECX                           ; ПРОПАТЧИЛ ТУТ <----------
    0048CEC4     90             NOP                               ; //---//
    0048CEC5     90             NOP                               ; //---//
    0048CEC6  |. 85C9           TEST ECX,ECX
    0048CEC8  |. 75 42          JNZ SHORT MMPro.0048CF0C
    0048CECA  |. 817D 08 100C00>CMP DWORD PTR SS:[EBP+8],0C10
    0048CED1  |. 74 09          JE SHORT MMPro.0048CEDC
    0048CED3  |. 817D 08 110C00>CMP DWORD PTR SS:[EBP+8],0C11
    0048CEDA  |. 75 19          JNZ SHORT MMPro.0048CEF5
    0048CEDC  |> 6A 30          PUSH 30
    0048CEDE  |. 68 60F94C00    PUSH MMPro.004CF960                ;  ASCII "Evaluation version limit"
    0048CEE3  |. 68 7CF94C00    PUSH MMPro.004CF97C                ;  ASCII "Note: In evaluation version, only 4 whole notes duration will be converted.
    If you want whole song will be converted. Please register Mobile Music Pro.
    Thanks."
    0048CEE8  |. 8B8D D0FDFFFF  MOV ECX,DWORD PTR SS:[EBP-230]
    0048CEEE  |. E8 50F40100    CALL MMPro.004AC343
    0048CEF3  |. EB 17          JMP SHORT MMPro.0048CF0C
    0048CEF5  |> 6A 30          PUSH 30
    0048CEF7  |. 68 20FA4C00    PUSH MMPro.004CFA20                ;  ASCII "Evaluation version limit"
    0048CEFC  |. 68 3CFA4C00    PUSH MMPro.004CFA3C                ;  ASCII "Note: In evaluation version, only 10 notes will be converted.
    If you want whole song will be converted. Please register Mobile Music Pro.
    Thanks."
    0048CF01  |. 8B8D D0FDFFFF  MOV ECX,DWORD PTR SS:[EBP-230]
    0048CF07  |. E8 37F40100    CALL MMPro.004AC343
    0048CF0C  |> 6A 20          PUSH 20
    0048CF0E  |. 6A 00          PUSH 0
    0048CF10  |. 8D95 8CFEFFFF  LEA EDX,DWORD PTR SS:[EBP-174]
    0048CF16  |. 52             PUSH EDX
    0048CF17  |. E8 A48C0000    CALL MMPro.00495BC0
    Вот все исправления которые получились у меня:


    Code:
    0048CEC3     41             INC ECX
    0048CEC4     90             NOP
    0048CEC5     90             NOP
    0044E91D     40             INC EAX
    0044E91E     90             NOP
    0044E91F     90             NOP
    0044E95F     42             INC EDX
    0044E960     90             NOP
    0044E961     90             NOP



    Итак мы сделали все необходимые исправления в бинарнике, теперь необходимо всё сохранить в файл! Делаем через Olly, чтоб не заморачиваться с хексерами. Пкм--> Copy To Executable --> All Modifications --> Copy All --> Пкм --> Save File

    Далее вводим имя для файла, желательно отличное от оригинала, чтоб можно было поправить потом что-нибудь например "patched.exe" и жмём OK! Запускаем, проверяем, работает??? Ну и слава богу!

    Вот так вот обходяться разного рода ограничения в таких прогах.


    Спасибо за внимание с вами был и буду (теперь не отвяжитесь ;) ) robo9 aka KindEcstasy. Пока!
     
    1 person likes this.