Русский / Russian English / Английский

Сейчас на форуме: Atlant1111, yashechka, user99, 3ton (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Протекторы —› Создание сигнатуры для мутированного VMProtect'ом кода
<< . 1 . 2 . 3 . 4 .
Посл.ответ Сообщение

Ранг: 0.5 (гость)
Статус: Участник

Создано: 26 марта 2020 18:25 New!
Цитата · Личное сообщение · #1

Здравствуйте!
Есть защищенный мутированный VMProtect'ом код(без виртуализации), версия 3+, нужно сделать сигнатуру для этого кода, при этом каждый билд программы генерирует рандомный мусор и рандомные регистры кода, но алгоритм остается тем же. Каждый билд программы сигнатура перестает быть рабочей, а нужно сделать ее универсальной, алгоритм кода не меняется.
Может быть, есть какие нибудь решения для моей проблемы?
Заранее спасибо!

Ранг: 248.6 (наставник)
Статус: Участник

Создано: 30 марта 2020 01:34 · Поправил: cppasm New!
Цитата · Личное сообщение · #2

difexacaw пишет:
Логика у тебя кривая. Во первых если нужен ориг код, то и адреса или есчо что то нужно до мутации.

У кого логика кривая и так ясно.
Нафиг ему адрес в оригинальном образе если у него этого образа нет?

Ещё раз для тех кто на бронепоезде.
Есть некий автор, у него есть оригинальный бинарь.
У нас его нет.
Он его протектит без упаковки, без ВМ, просто морф (мутация части функций, включая интересную нам).
Получаем морф версия 1.
Он попал к нам в руки, мы его разобрали, нашли интересующую нас функцию и допустим пропатчили.
Автор взял свой бинарь (всё тот же) и снова запротектил, получили морф версия 2.
Он попадает к нам в руки.
Задача - быстро найти где пропатчить, без полного повторного разбора.
Т.е. найти адрес той же функции в этом бинаре, при том что код после морфа абсолютно разный, сохраняется только логика работы функции.
Нам нафиг не нужен адрес этой функции в оригинальном образе, потому что у нас его нет.
Так понятно?

Ранг: 44.3 (посетитель)
Статус: Участник

Создано: 30 марта 2020 07:50 · Поправил: _MBK_ New!
Цитата · Личное сообщение · #3

Извиняюсь, что встреваю в столь пикантные весенние брачные игры, но разве задача имеет решение? Упомянутый выше RC4 и то можно реализовать бесконечным числом способов и понять, что это именно он без искусственного интеллекта невозможно. Ну разве что, взять некую уникальную константу и трассировать код до тех пор, пока в одном из регистров она не почвится, да и то, при желании, можно и это обойти.


Ранг: 329.6 (мудрец)
Статус: Участник

Создано: 30 марта 2020 10:04 New!
Цитата · Личное сообщение · #4

difexacaw
RVA 0x246647 - 0x100000 это вход в кодовую секцию после крипто мусора, на этой EP ориг код. До него исполнение вм мусора.

Результат близок к истине, это вторая "чистая" функция
Code:
  1. 00546647 | push ebp                               | _scrt_initialize_crt
  2. 00546648 | mov ebp,esp                            |
  3. 0054664A | cmp dword ptr ss:[ebp+8],0             |

после ОЕП, которая вызывается из вм, а первая "чистая" функция SEH Prolog
Code:
  1. 00546C10 | push <hellooep.except_handler4>        | _SEH_prolog4
  2. 00546C15 | push dword ptr fs:[0]                  |
  3. 00546C1C | mov eax,dword ptr ss:[esp+10]          |


В принципе этой точки RVA 0x146647 достаточно чтобы поставить на неё хард бряк, сделать полный дамп распакованной проги и начать его изучать.
ОЕП в данной программе найти невозможно потому что его нет, при виртуализации/мутации кода на ОЕП вмпрот полностью затирает это место без каких-либо признаков.
Реальный ОЕП RVA 0x146599 - тут будет просто мусор вместо оригинального кода
Code:
  1. 00546599 | call <hellooep._security_init_cookie>  | wWinMainCRTStartup
  2. 0054659E | jmp <hellooep._scrt_common_main_seh>   |

Функция _security_init_cookie и _scrt_common_main_seh виртуализованы, вот начало оригинальной функции _scrt_common_main_seh
Code:
  1. 0054641D | push 14                                | _scrt_common_main_seh
  2. 0054641F | push hellooep.5C0020                   |
  3. 00546424 | call <hellooep._SEH_prolog4>           |
  4. 00546429 | push 1                                 |
  5. 0054642B | call <hellooep._scrt_initialize_crt>   |
  6. 00546430 | pop ecx                                | ecx:wWinMainCRTStartup
  7. 00546431 | test al,al                             |

Визор выдал адрес функции _scrt_initialize_crt.

В начале всех остальных виртуализованных/мутированных функций, кроме ОЕП, вмпрот всегда оставляет jmp на вход в вм или в мутированный код, даже если он никогда не исполняется. Таким образом начало каждой защищенной функции можно распознать в оригинальном образе и восстановить в этом месте код после прота.
Можете убедиться в этом взглянув на адреса RVA 00147291 (_security_init_cookie) и 0014641D (_scrt_common_main_seh) - там будут jmp на вход в вм.

Добавлено спустя 24 минуты
_MBK_
Извиняюсь, что встреваю в столь пикантные весенние брачные игры, но разве задача имеет решение?
Почти любая задача в программировании/реверсе может иметь приемлимое решение, если она правильно сформулирована. В данном случае, если юзеру требуется локализовать мутированную вмпротом функцию в разных версиях одного и того же приложения, то зная особенности вмпрота можно сказать что любая сигнатура в данном случае бесполезна.
Задача решается следующим образом:
- первый раз функция деобфусцируется до нужной степени и выявляется её алгоритм
- находится jmp на начало этой функции из оригинального кода (он всегда будет)
- далее 2 пути в зависимости от защиты:
1. jmp исполняемый - в этом случае на нем можно брякнуться и мы запоминаем все ссылки на него из других функций и само место этой функции относительно других. Стартуем, брякаемся - видим откуда.
2. jmp не исполняемый (данная мутированная функция вызывается из другой защищенной функции). В этом случае ориентируемся только на место этой функции относительно других.

Все, этой информации достаточно, чтобы довольно быстро определить адрес нужной функции в новом билде. Конечно при условии, что разработчик билда не перетасует все функции в исходниках, но такого на своей практике я не встречал.


Ранг: 556.5 (!)
Статус: Участник
оптимист

Создано: 30 марта 2020 11:40 New!
Цитата · Личное сообщение · #5

Vamit пишет:
Этот код не может быть ОЕП, т.к. расположен в секции прота, это какой-то вход в вм. ОЕП всегда должен быть в секции кода программы, а не прота защищающего её.

Vamit пишет:
ОЕП в данной программе найти невозможно потому что его нет, при виртуализации/мутации кода на ОЕП вмпрот полностью затирает это место без каких-либо признаков.

Ты там определись есть ли он или его нет, то что я выше указал и есть начало OEP которое под вм

Ранг: -9.0 (нарушитель)
Статус: Участник

Создано: 30 марта 2020 11:49 New!
Цитата · Личное сообщение · #6

Vamit пишет:
Визор выдал адрес функции _scrt_initialize_crt.


Vamit, о каком визоре идет речь? Это подарок от Инди, PIN или свои визоры имеют уже два человека на этом форуме?

Ранг: 248.6 (наставник)
Статус: Участник

Создано: 30 марта 2020 12:47 New!
Цитата · Личное сообщение · #7

ex_DMA
Чукча не читатель, чукча - писатель.
Vamit комментировал пост difexacaw и его результаты, соответственно и визор имелся ввиду его, мега приватный.


Ранг: 86.0 (постоянный)
Статус: Участник

Создано: 30 марта 2020 14:55 New!
Цитата · Личное сообщение · #8

Vamit пишет:
Почти любая задача в программировании/реверсе может иметь приемлимое решение

Как насчет распознавания виртуализированных инструкций, когда их реализация разбита на множество примитивов и строки шаблона перемешаны / смешаны с реализацией других инструкций?


Ранг: 288.8 (наставник)
Статус: Участник
Advisor

Создано: 30 марта 2020 15:41 New!
Цитата · Личное сообщение · #9

Boostyq пишет:
и строки шаблона перемешаны / смешаны с реализацией других инструкций

+1
млять, и вроде же разный материал, а приёмы схожи.
упорядочить "беспорядок", или вычленить полезную датафлоу, инфо мало. под асм исходник ни одни "пузырьки" не подходят..))
как нагадить вроде есть, но найти матрицу перестановок, кажется не реально.


Ранг: 329.6 (мудрец)
Статус: Участник

Создано: 30 марта 2020 16:54 New!
Цитата · Личное сообщение · #10

Boostyq
Как насчет распознавания виртуализированных инструкций, когда их реализация разбита на множество примитивов и строки шаблона перемешаны / смешаны с реализацией других инструкций?
Данная задача у меня решена на 98%. А оставшиеся 2% проще руками поправить в девиртуализованном коде.


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 30 марта 2020 18:53 New!
Цитата · Личное сообщение · #11

Vamit

> после ОЕП, которая вызывается из вм, а первая "чистая" функция SEH Prolog

Так она ведь первой и найдена была. Из за того что обёрнута мусором, то толку от этой функции никакого.

> ОЕП в данной программе найти невозможно потому что его нет

В морф/вирт предполагается что EP нет, есть ближайшее место без морфа. Находится EP общим критерием --> Link <-- на основе особенности крипторов - они не покрывают весь код, что было сказано в самом начале топика, а поэтому начало AI и есть выборка из кода после EP.

Никто больше не решил.. чувак тот что утверждал что найдёт EP тоже пропал

cppasm

> Задача - быстро найти где пропатчить, без полного повторного разбора.

Чья это задача ?
ТС нужно сигнатуру составить, а не патчить что либо. Примером должны быть два бинаря, в которых весь код полностью отморфлен. И найти общее между ними. А не два одинаковых бинаря не криптованных, в которых кому то нужно найти функцию и что то с ней сделать.

Ранг: 411.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 30 марта 2020 21:00 New!
Цитата · Личное сообщение · #12

Почитал топик. По существу, у меня пара вопросов:
1. С чего вы так к сигнатурам привязывайтсь?? Сигнатуры не всегда дают true positive Взять тот-же антивирус Ка... (ну не важно! рекламы тут не будет): кроме сигнатур есть эвристика, модуль BSS, машинное обучение. Оно комбинируется и гибридизируется сейчас и активно идет по данному пути. К примеру, опуская технические детали, возьмем тот-же DENUVO. Мы знаем, что защита читает в определенные поля из KUSER_SHARED_DATA, PEB, IMAGE_DATA_DIRECTORY и cpuid. Находим примитив в вмпроте READ_DS_DWORD, хукаем и смотрим, обращается ли он к перечисленным полям. Одновременно ожидаем, что на выходе из VM мы попадем на cpuid. В сумме, если указанные условия выполняются, считаем, что filename.exe накрыт Denuvo.
2. В случае, если ТС хочет создать сигнатуру на два и более файла, накрытых одной версией денуво (вмп и тд. Плюс, к ещё к одному вопросу, озвученному ранее): как минимум, их можно тривиально сравнить. Одинаковые версии защиты могут содержать цепочку из таких же одинаковых байт, водяные знаки. Исходим из того, что. Exe файл вряд-ли виртуализирован на 100%, а значит, какие-то инструкции останутся открытыми (после распаковки). Развивая эту тему - асм инструкции SSE.., AVX вирт машины в подавляющем большинстве случаев исполнят "вживую", т.е. условно будет "начальная" сигнатура, которую можно скомбинировать с методами из п.1

| Сообщение посчитали полезным: difexacaw



Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 30 марта 2020 21:11 · Поправил: difexacaw New!
Цитата · Личное сообщение · #13

ELF_7719116

> какие-то инструкции останутся открытыми (после распаковки).

В данном случае после анпака часть кода криптована. А может быть что весь код криптован, после анпака будет всё тот же крипт. Нетронутыми остануться лишь данные. По той простой причине, что их невозможно криптовать в том же аппаратном моде рекурсия #6 --> Link <--

> кроме сигнатур есть эвристика

По простой причине - ограничение на число итераций вирты, это тайминг. А есчо есть вторая причина, крипт это не метаморфы и прочие виксы, где вообще статик кода/данных нет(тк входные данные для крипта бинарь с не известным покрытием, а викс моторы изначально не содержат статик).


Ранг: 288.8 (наставник)
Статус: Участник
Advisor

Создано: 30 марта 2020 22:36 · Поправил: Bronco New!
Цитата · Личное сообщение · #14

ELF_7719116 пишет:
что filename.exe накрыт Denuvo.

пиздец выводы, с каких это пор дунька пакером стала?
ну читает дворды для завязки с примитивным шифрованием, так их все читают, да же чистые аппы.
--------------
сигнатура не панацея, но в большинстве случаев в динамике нет необходимости.


Ранг: 86.0 (постоянный)
Статус: Участник

Создано: 30 марта 2020 22:49 · Поправил: Boostyq New!
Цитата · Личное сообщение · #15

difexacaw пишет:
В морф/вирт предполагается что EP нет, есть ближайшее место без морфа

Бредовое заявление.
Допустим вся программа от и до находится под виртуальной машиной, все вызываемые функции тоже под вм, поэтому не происходит выхода из нее вовсе.
В таком случае что у проги нет OEP? Вот тебе на, а если она вызывает например 1 winapi функцию, тогда что адрес этой функции и будет OEP?
Конечно нет, в случае виртуализации OEP выглядит иначе, это адрес начала первого примитива, которым реализуется первая инструкция OEP, но одного адреса мало, примитив может вызываться кучу раз с разным контекстом еще до OEP, поэтому логичным дополнением будет соответствующий указатель ленты вм.
И никакой автоматикой это невозможно решить, до тех пор пока явно не научить обрабатывать это, ни о какой универсальности не может быть и речи.
Еще повторюсь, если OEP для тебя это ближайшее чистенькое место, то нахрена нужен dbi, если это можно найти руками за 5 минут, да пиво в руках не подержишь, но и 4 часа околачиваться не надо насилуя свой пэка.
Ставишь сбор трассы и запускаешь прогу, потом листаешь с начала и находишь первое такое место, но опять же это ерунда, еще до OEP может вызываться незащищенный код.

ELF_7719116 пишет:
С хочет создать сигнатуру на два и более файла

Вы как и клерк прицепились к этому слову, сигнатура это формальность, потому что для обычного статического кода это так называется.
Естественно тс нужно локализовать определенную функцию, ему плевать на обнаружение файла, он и так знает что это нужная программа, в ней есть нужная мутированая функция, он и так знает что там вмпрот, а что ему неизвестно так это как ее находить в каждой новой сборке программы, после того как над ней постарался вмпрот.
Если у вас есть эвристический метод это хорошо, допустим функция единственная вызывает какую-нибудь winapi, и поставив хук на нее, можно вытащить адрес возврата из стека и точно найти адрес принадлежащий этой функции.
А если (никаких если, точно) тсу нужно определенное место в функции, что ваша эвристика будет делать?
Приведение примера ав это вообще абсурд, у них другая задача, ав нужно найти хотя бы один признак нужного поведения где-бы он ни был, и чем надежнее, тем лучше, тсу же нужно точное место.

Ранг: 411.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 30 марта 2020 22:52 · Поправил: ELF_7719116 New!
Цитата · Личное сообщение · #16

Вообще это всё полная фигня!
На 98й винде explorer 5 и opera крашатся при просмотре exelab.ru, вот это проблема!

Небось, читают, как все, dword'ы из KUSER_SHARED_DATA, да никак не прочитают. А opera.dll Блаукович забыл упаковать с 2014 года.

| Сообщение посчитали полезным: dosprog



Ранг: 288.8 (наставник)
Статус: Участник
Advisor

Создано: 31 марта 2020 13:08 New!
Цитата · Личное сообщение · #17

ELF_7719116 пишет:
Небось, читают, как все, dword'ы из KUSER_SHARED_DATA

угомонись ты с этими привязками, нет способа отлома, без наличия легальной копии.
исходные данные для декрипта аргумента в инструкции лежат в лицензии.
с ней можно пошарить сервак на 5 актив в день, но какой от этого интерес конечному пользователю?

Ранг: 411.8 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 31 марта 2020 13:53 New!
Цитата · Личное сообщение · #18

Bronco пишет:
нет способа отлома, без наличия легальной копии...

И к чему это? Способы отлома обсуждаются в теме "Crack SecuROM & DENUVO". Была озвучена точка зрения по детектированию вмп-подобных файлов с колокольни av engine.

ТС мог бы выложить два-три файла для примера, что внесло конкретику в обсуждение.


Ранг: 288.8 (наставник)
Статус: Участник
Advisor

Создано: 31 марта 2020 14:09 · Поправил: Bronco New!
Цитата · Личное сообщение · #19

ELF_7719116 пишет:
Была озвучена точка зрения по детектированию вмп-подобных файлов с колокольни av engine.

ну во первых, фейса дуни в паблике нет. разрабы солидные люди, у аверов к ним вопросов нет. нах им снифеть дуню, мне не ясно.
вот вторых, признаки вторичные, не уникальные, детект только в динамике, а без лицензии ....бла-бла-бла по кругу.
в третьих, нет ничего впм подобного в дуньке, кроме того что есть примитивная вирта. обфускация вм? так она то же разная
<< . 1 . 2 . 3 . 4 .
 eXeL@B —› Протекторы —› Создание сигнатуры для мутированного VMProtect'ом кода

Видеокурс ВЗЛОМ