У меня вопрос к администратору форума. Можно на этом форуме печатать такие темы в Разделе Исследование программ. Я хотел снять протектор с MetaTrader 4, 2014г, но он запакован VMProtector-ом Задача оказалась не из легких и меня поперли с екзелаба (х им теперь). Но на моем компе неслучайно завалялись версии 2007-2010, запакованные другими протекторами. 2007 - DotFix.Nice 2.1-2.5 и я его сегодня распаковал! Могу разместить туториал. Набор программ: Windows XP SP3 или Windows 8.1 x64 (на W7 все или часть запускается в режиме совместимости и долго копать импорт из apihelp.dll). PEiD.exe 0.95 пропатченный OLLYDBG 1.10 (Parcheado 4.EXE); плугины CmdBar.dll, OllyDump.dll, PhantOm.dll PETools.exe 1.5.800 и выше ImportREC 1.7e Литература и обучающие ролики. 1. Введение в крэкинг с нуля, используя OllyDbg, Рикардо Нарваха (сборник) 2. Ручная распаковка DotFix Nice Protect 2.хх https://exelab.ru/f/index.php?action=vthread&forum=2&topic=9115 3. Препарируем DotFix NiceProtect _ ANTICHAT https://forum.antichat.ru/threads/45446/ Предисловие. DotFix обнаруживает отладчик, ворует до 102 байт с OEP, мешает их с мусором в новой секции, стирает код из ложной EP. Импорт восстанавливается быстро после прибытия в первую строчку после ворованного кода и дампа программы. Восстановление ворованного кода. В комплекте идет незапакованный MetaEditor.exe. Я предположил, что в терминале аналог-й код. ротектор не эмулирует инструкции, поэтому можно искать опкоды по бинарной строке. Получится похожий код, но есть отличия. Надо просеять код, чтобы выбрать все байты ворованного кода. Скопировать коды, сделать бинарную вставку и сохранить изменения, отрезать в анпаке 3 предпоследние секции, отремонтировать файл в PETools. Я еще пишу туториал.
Поперли скорей всего потому что программа мягко говоря не утилитарная, если создаешь тему, там обязательный пункт демонстрация собственной проделанной работы. Иначе получается, что ты на чужих плечах решил прокатиться. Выкладывать варез во вложениях на форумах тоже сомнительная мера, лучше использовать ссылки на файлообменники.
00BD0DD8 push 0055B746 00BD0DDD ret Переход из отморфленной EP на распакованный образ. --- Сообщение объединено, 8 апр 2019 --- trsoft, Я почитал по вашей ссылки на ачат: Как раз таки это основная задача, а распаковывать нечего - семпл сам себя распаковывает. Поэтому раз вы пришли сюда, то надеюсь увидеть решение по свёртке отморфленной EP. Остальных задач нет в данном случае.
Программного решения нет. Пока что свёртка возможна в ручном режиме, если известно, что искать. В данном случае программа слинкована с библиотеками mfc и mvcrt. OEP из образа MetaEditor.exe : 0044BDB6 >/$ 55 PUSH EBP 0044BDB7 |. 8BEC MOV EBP,ESP 0044BDB9 |. 6A FF PUSH -1 0044BDBB |. 68 80734500 PUSH MetaEdit.00457380 0044BDC0 |. 68 3CBF4400 PUSH <JMP.&MSVCRT._except_handler3> ; Ввод адреса; Установка дескриптора SE 0044BDC5 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0] 0044BDCB |. 50 PUSH EAX 0044BDCC |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP 0044BDD3 |. 83EC 68 SUB ESP,68 0044BDD6 |. 53 PUSH EBX 0044BDD7 |. 56 PUSH ESI 0044BDD8 |. 57 PUSH EDI 0044BDD9 |. 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP 0044BDDC |. 33DB XOR EBX,EBX 0044BDDE |. 895D FC MOV DWORD PTR SS:[EBP-4],EBX 0044BDE1 |. 6A 02 PUSH 2 0044BDE3 |. FF15 DCDB4400 CALL DWORD PTR DS:[<&MSVCRT.__set_app_ty>; MSVCRT.__set_app_type 0044BDE9 |. 59 POP ECX 0044BDEA |. 830D 40274600>OR DWORD PTR DS:[462740],FFFFFFFF 0044BDF1 |. 830D 44274600>OR DWORD PTR DS:[462744],FFFFFFFF 0044BDF8 |. FF15 D0DB4400 CALL DWORD PTR DS:[<&MSVCRT.__p__fmode>] ; MSVCRT.__p__fmode 0044BDFE |. 8B0D 24274600 MOV ECX,DWORD PTR DS:[462724] 0044BE04 |. 8908 MOV DWORD PTR DS:[EAX],ECX 0044BE06 |. FF15 D4DB4400 CALL DWORD PTR DS:[<&MSVCRT.__p__commode>; MSVCRT.__p__commode 0044BE0C |. 8B0D 20274600 MOV ECX,DWORD PTR DS:[462720] 0044BE12 |. 8908 MOV DWORD PTR DS:[EAX],ECX 0044BE14 |. A1 D8DB4400 MOV EAX,DWORD PTR DS:[<&MSVCRT._adjust_f> 0044BE19 |. 8B00 MOV EAX,DWORD PTR DS:[EAX] 0044BE1B |. A3 3C274600 MOV DWORD PTR DS:[46273C],EAX 0044BE20 |. E8 16010000 CALL MetaEdit.0044BF3B 0044BE25 |. 391D 70174600 CMP DWORD PTR DS:[461770],EBX 0044BE2B |. 75 0C JNZ SHORT MetaEdit.0044BE39 Код из ложной OEP terminal.exe : 004AE800 55 PUSH EBP ; Real entry point of SFX code 004AE801 8BEC MOV EBP,ESP 004AE803 6A FF PUSH -1 004AE805 68 B2164000 PUSH terminal.004016B2 004AE80A 68 B2164000 PUSH terminal.004016B2 004AE80F 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 004AE815 50 PUSH EAX 004AE816 64:8925 00000000 MOV DWORD PTR FS:[0],ESP дальше мусор 004AE81D 83C4 10 ADD ESP,10 004AE820 B8 00000000 MOV EAX,0 004AE825 8BE5 MOV ESP,EBP 004AE827 5D POP EBP ... Вначале я трассировал вручную, но через несколько минут понял, что это займет несколько дней. Поэтому я еще раз проанализировал код из Метаедитора. По структуре код должен быть одинаков, но адреса ячеек памяти для хранения переменных и адреса переходов на ПП будут отличаться. Остальные опкоды должны совпадать. Поэтому, находясь в секции 00BDxxxxx я выполнил поиск бинарной строки 83 EC 68 и такая нашлась. Ставлю брйкпоинт и нажимаю F9. Найденные команды я копировал поверх блока из МетаЕдитора. Вызовы вида FF15 D0DB4400 CALL DWORD PTR DS:[<&MSVCRT.__p__fmode>] ; MSVCRT.__p__fmode я искал перед самым их вызовом через поиск Search for... Name in all modules -> Sort by section, двойной щелчок для перехода в код. В итоге получилось следующий код для вставки в OEP терминала: 004AE800 55 PUSH EBP ; Real entry point of SFX code 004AE801 8BEC MOV EBP,ESP 004AE803 6A FF PUSH -1 004AE805 68 B2164000 PUSH terminal.004016B2 004AE80A 68 B2164000 PUSH terminal.004016B2 ; SE handler installation 004AE80F 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 004AE815 50 PUSH EAX 004AE816 64:8925 00000000 MOV DWORD PTR FS:[0],ESP 00BD02FA 83EC 68 SUB ESP,68 0044BDD6 |. 53 PUSH EBX 0044BDD7 |. 56 PUSH ESI 0044BDD8 |. 57 PUSH EDI 00BD04E3 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP 00BD054B 33DB XOR EBX,EBX 0044BDDE |. 895D FC MOV DWORD PTR SS:[EBP-4],EBX ; код отсутствует, но я оставил 00BD064D 6A 02 PUSH 2 00BD06B0 FF15 B8CC5500 CALL DWORD PTR DS:[55CCB8] ; msvcrt.__set_app_type 00BBD8EC 59 POP ECX 00BD07B9 830D 90975900 FF OR DWORD PTR DS:[599790],FFFFFFFF 00BD0826 830D 94975900 FF OR DWORD PTR DS:[599794],FFFFFFFF 00BD0895 FF15 A8CC5500 CALL DWORD PTR DS:[55CCA8] ; msvcrt.__p__fmode 00BD0903 8B0D 84975900 MOV ECX,DWORD PTR DS:[599784] 00BD096E 8908 MOV DWORD PTR DS:[EAX],ECX 00BD09DB FF15 ACCC5500 CALL DWORD PTR DS:[55CCAC] ; msvcrt.__p__commode 00BD0A7B 8B0D 80975900 MOV ECX,DWORD PTR DS:[599780] 00BD0AE2 8908 MOV DWORD PTR DS:[EAX],ECX 00BD0B49 A1 B0CC5500 MOV EAX,DWORD PTR DS:[55CCB0] ;[<&MSVCRT._adjust_f> 00BD0B8D 8B00 MOV EAX,DWORD PTR DS:[EAX] 0044BE1B |. A3 3C274600 MOV DWORD PTR DS:[46273C],EAX ; код отсутствует, исключен 0044BE20 |. E8 16010000 CALL MetaEdit.0044BF3B ; код отсутствует, исключен 00BD0D67 391D A0A65800 CMP DWORD PTR DS:[58A6A0],EBX { // для справки 0055B747 75 0C JNZ SHORT terminal.0055B755 0055B749 68 54B85500 PUSH terminal.0055B854 0055B74E FF15 B4CC5500 CALL DWORD PTR DS:[55CCB4] ; msvcrt.__setusermatherr } Бинарная строка с адреса 0055B6DC: 558BEC6AFF68B216400068B216400064A100000000506489250000000083EC685356578965E833DB895DFC6A02FF15B8CC550059830D90975900FF830D94975900FFFF15A8CC55008B0D849759008908FF15ACCC55008B0D809759008908A1B0CC55008B00391DA0A65800 --- Сообщение объединено, 9 апр 2019 --- Indy_, есть некоторые соображения, как отсеять мусор. Однотипные операции, которые обычно не встречаются в обычном коде, группа операций не изменяющая значения регистров, памяти (push ecx, pop ecx), джампы и колы, на близколежащие адреса и тд можно заменить NOP-ми. Останется исполнимый украденный код, хотя джампы могут быть перекрестными, те мусорный код может прыгать по одним и тем же джампам как по накатанной трассе (а там уже установлены нопы). --- Сообщение объединено, 9 апр 2019 --- Общая задача оптимизации кода, карты Карно.
trsoft, Ветвления лишние можно просто удалить пересборкой на другой адрес. Вот пример, оно пару минут покрутит приложение и создаст дамп gp.bin, там пересобранный с оптимизацией код.
это пока сложно. https://exelab.ru/f/index.php?action=vthread&forum=5&topic=25244&page=0 ps Я хотел пропатчить терминал, чтобы торговать на криптобирже (без маржи, со всей аналитикой) Для этого нужно найти цикл опроса сервера: прием и обработка свечных данных, и заменить функции их аналогами из прикрученной длл. С чего бы начать поиск?
trsoft, Это самый норм вариант, те зачем распаковывать, что бы изменить, если можно дождаться когда апп само распакуется и сделать всё что нужно. --- Сообщение объединено, 9 апр 2019 --- trsoft, Вам наверно интересно как я это сделал ? Как и все остальные, данный протектор не исключение, для него применим общий критерий EP https://wasm.in/threads/oep-protektory.33242/ На скрине слева лог абсолютных выборок. Справа EP, на неё выполняется переход из отморфленного кода. Это событие сохраняется в трассировочном логе инструкций, те передача управления из области 0xBD0. Почему не видно первой выборки [55CCB4] - страница 55C помечена как уже выбранная, к ней была выборка из морфа. Почему вторая выборка в логе 55A6C - страница кода впервые исполнена. Это можно как угодно менять на уровне условных конструкций в следящей функции. Самое сложное это деморфить EP, но практически это вовсе не нужно.
Indy_, общий критерий EOP ? Я пока изучаю матчасть, поэтому отвечу в этой теме. Может быть все еще проще? Кто использует протекторы для своих программ? Разработчики программ, использующие штатные средства разработки, компиляции и линковки. Имеют начальные сведения о защите программ. Какие стандартные инструменты используют разработчики? MS VC++, Дельфи, Масм, Фасм, меньше 10-ки. Все эти инструменты генерируют стандартный код в OEP, но разработчики могут потратить доп. время на изменение кода в точке старта, перенос части кода в тлс и тд. Как часто разработчикии накрывают программу 2-3 протекторами? Редко. Как правило, так защищают только мальварь, время запуска которой не имеет значения. Надеюсь, ясно, почему протекторы воруют код из OEP? В принципе, рантайм, импорт и тд, можно исследовать после отображения окна приложения в отладчике. Дальше делать выводы о компиляторе и линкере. Основной критерий OEP - стандартный код в начале программы. А состояние стека - не критерий. См состояние стека в терминале для вариантов до и после распаковки.
trsoft, > Основной критерий OEP - стандартный код в начале программы Чушь пишешь, даже в твоём случае EP отморфлена. Причём ты на ручной разбор единичного семпла потратил хз сколько времени, раз решил что это столь важная тема, что её можно создать тут.