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

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Mobile Music Pro 1.0.0.1. Убираем ограничения! (https://forum.antichat.xyz/showthread.php?t=49061)

KindEcstasy 14.09.2007 22:24

Mobile Music Pro 1.0.0.1. Убираем ограничения!
 
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-взлома, ну да ладно, видим такую картину:


Код:

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 инструкции мусорные байты). Должна получиться такая вот картина:


Код:

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!"

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


Код:

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 (прыгнуть, если не нуль). После всех манипуляций у меня получилось вот так:


Код:

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

Вот все исправления которые получились у меня:


Код:

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. Пока!


Время: 21:36