Распаковка программ, снятие протекторов

Тема в разделе "WASM.HEAP", создана пользователем trsoft, 8 апр 2019.

  1. trsoft

    trsoft Member

    Публикаций:
    0
    Регистрация:
    18 июл 2018
    Сообщения:
    115
    У меня вопрос к администратору форума. Можно на этом форуме печатать такие темы в Разделе Исследование программ.

    Я хотел снять протектор с 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. Я еще пишу туториал.
     

    Вложения:

    Последнее редактирование: 8 апр 2019
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.020
    Поперли скорей всего потому что программа мягко говоря не утилитарная, если создаешь тему, там обязательный пункт демонстрация собственной проделанной работы. Иначе получается, что ты на чужих плечах решил прокатиться. Выкладывать варез во вложениях на форумах тоже сомнительная мера, лучше использовать ссылки на файлообменники.
     
    Mikl___ нравится это.
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    00BD0DD8 push 0055B746
    00BD0DDD ret

    Переход из отморфленной EP на распакованный образ.
    --- Сообщение объединено, 8 апр 2019 ---
    trsoft,

    Я почитал по вашей ссылки на ачат:

    Как раз таки это основная задача, а распаковывать нечего - семпл сам себя распаковывает. Поэтому раз вы пришли сюда, то надеюсь увидеть решение по свёртке отморфленной EP. Остальных задач нет в данном случае.
     
  4. trsoft

    trsoft Member

    Публикаций:
    0
    Регистрация:
    18 июл 2018
    Сообщения:
    115
    Программного решения нет. Пока что свёртка возможна в ручном режиме, если известно, что искать.
    В данном случае программа слинкована с библиотеками 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 ---
    Общая задача оптимизации кода, карты Карно.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    trsoft,

    Ветвления лишние можно просто удалить пересборкой на другой адрес. Вот пример, оно пару минут покрутит приложение и создаст дамп gp.bin, там пересобранный с оптимизацией код.
     

    Вложения:

    • dump.7z
      Размер файла:
      286,8 КБ
      Просмотров:
      242
  6. trsoft

    trsoft Member

    Публикаций:
    0
    Регистрация:
    18 июл 2018
    Сообщения:
    115
    это пока сложно.
    https://exelab.ru/f/index.php?action=vthread&forum=5&topic=25244&page=0

    ps
    Я хотел пропатчить терминал, чтобы торговать на криптобирже (без маржи, со всей аналитикой) Для этого нужно найти цикл опроса сервера: прием и обработка свечных данных, и заменить функции их аналогами из прикрученной длл. С чего бы начать поиск?
     
    Последнее редактирование: 9 апр 2019
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    trsoft,

    Это самый норм вариант, те зачем распаковывать, что бы изменить, если можно дождаться когда апп само распакуется и сделать всё что нужно.
    --- Сообщение объединено, 9 апр 2019 ---
    trsoft,

    Вам наверно интересно как я это сделал ?

    Как и все остальные, данный протектор не исключение, для него применим общий критерий EP https://wasm.in/threads/oep-protektory.33242/

    На скрине слева лог абсолютных выборок. Справа EP, на неё выполняется переход из отморфленного кода. Это событие сохраняется в трассировочном логе инструкций, те передача управления из области 0xBD0. Почему не видно первой выборки [55CCB4] - страница 55C помечена как уже выбранная, к ней была выборка из морфа. Почему вторая выборка в логе 55A6C - страница кода впервые исполнена. Это можно как угодно менять на уровне условных конструкций в следящей функции.

    Самое сложное это деморфить EP, но практически это вовсе не нужно.
     

    Вложения:

    • d.png
      Размер файла:
      2 МБ
      Просмотров:
      564
  8. trsoft

    trsoft Member

    Публикаций:
    0
    Регистрация:
    18 июл 2018
    Сообщения:
    115
    Indy_, общий критерий EOP ?
    Я пока изучаю матчасть, поэтому отвечу в этой теме. Может быть все еще проще?
    Кто использует протекторы для своих программ? Разработчики программ, использующие штатные средства разработки, компиляции и линковки. Имеют начальные сведения о защите программ.
    Какие стандартные инструменты используют разработчики? MS VC++, Дельфи, Масм, Фасм, меньше 10-ки. Все эти инструменты генерируют стандартный код в OEP, но разработчики могут потратить доп. время на изменение кода в точке старта, перенос части кода в тлс и тд.
    Как часто разработчикии накрывают программу 2-3 протекторами? Редко. Как правило, так защищают только мальварь, время запуска которой не имеет значения.
    Надеюсь, ясно, почему протекторы воруют код из OEP?

    В принципе, рантайм, импорт и тд, можно исследовать после отображения окна приложения в отладчике. Дальше делать выводы о компиляторе и линкере.

    Основной критерий OEP - стандартный код в начале программы. А состояние стека - не критерий. См состояние стека в терминале для вариантов до и после распаковки.
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    trsoft,

    > Основной критерий OEP - стандартный код в начале программы

    Чушь пишешь, даже в твоём случае EP отморфлена. Причём ты на ручной разбор единичного семпла потратил хз сколько времени, раз решил что это столь важная тема, что её можно создать тут.
     
    Последнее редактирование модератором: 10 апр 2019