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