Сейчас на форуме: (+5 невидимых) |
eXeL@B —› Протекторы —› Создание сигнатуры для мутированного VMProtect'ом кода |
<< . 1 . 2 . 3 . 4 . |
Посл.ответ | Сообщение |
|
Создано: 26 марта 2020 18:25 · Личное сообщение · #1 Здравствуйте! Есть защищенный мутированный VMProtect'ом код(без виртуализации), версия 3+, нужно сделать сигнатуру для этого кода, при этом каждый билд программы генерирует рандомный мусор и рандомные регистры кода, но алгоритм остается тем же. Каждый билд программы сигнатура перестает быть рабочей, а нужно сделать ее универсальной, алгоритм кода не меняется. Может быть, есть какие нибудь решения для моей проблемы? Заранее спасибо! |
|
Создано: 30 марта 2020 01:34 · Поправил: cppasm · Личное сообщение · #2 difexacaw пишет: Логика у тебя кривая. Во первых если нужен ориг код, то и адреса или есчо что то нужно до мутации. У кого логика кривая и так ясно. Нафиг ему адрес в оригинальном образе если у него этого образа нет? Ещё раз для тех кто на бронепоезде. Есть некий автор, у него есть оригинальный бинарь. У нас его нет. Он его протектит без упаковки, без ВМ, просто морф (мутация части функций, включая интересную нам). Получаем морф версия 1. Он попал к нам в руки, мы его разобрали, нашли интересующую нас функцию и допустим пропатчили. Автор взял свой бинарь (всё тот же) и снова запротектил, получили морф версия 2. Он попадает к нам в руки. Задача - быстро найти где пропатчить, без полного повторного разбора. Т.е. найти адрес той же функции в этом бинаре, при том что код после морфа абсолютно разный, сохраняется только логика работы функции. Нам нафиг не нужен адрес этой функции в оригинальном образе, потому что у нас его нет. Так понятно? |
|
Создано: 30 марта 2020 07:50 · Поправил: _MBK_ · Личное сообщение · #3 Извиняюсь, что встреваю в столь пикантные весенние брачные игры, но разве задача имеет решение? Упомянутый выше RC4 и то можно реализовать бесконечным числом способов и понять, что это именно он без искусственного интеллекта невозможно. Ну разве что, взять некую уникальную константу и трассировать код до тех пор, пока в одном из регистров она не почвится, да и то, при желании, можно и это обойти. |
|
Создано: 30 марта 2020 10:04 · Личное сообщение · #4 difexacaw RVA 0x246647 - 0x100000 это вход в кодовую секцию после крипто мусора, на этой EP ориг код. До него исполнение вм мусора. Результат близок к истине, это вторая "чистая" функция Code:
после ОЕП, которая вызывается из вм, а первая "чистая" функция SEH Prolog Code:
В принципе этой точки RVA 0x146647 достаточно чтобы поставить на неё хард бряк, сделать полный дамп распакованной проги и начать его изучать. ОЕП в данной программе найти невозможно потому что его нет, при виртуализации/мутации кода на ОЕП вмпрот полностью затирает это место без каких-либо признаков. Реальный ОЕП RVA 0x146599 - тут будет просто мусор вместо оригинального кода Code:
Функция _security_init_cookie и _scrt_common_main_seh виртуализованы, вот начало оригинальной функции _scrt_common_main_seh Code:
Визор выдал адрес функции _scrt_initialize_crt. В начале всех остальных виртуализованных/мутированных функций, кроме ОЕП, вмпрот всегда оставляет jmp на вход в вм или в мутированный код, даже если он никогда не исполняется. Таким образом начало каждой защищенной функции можно распознать в оригинальном образе и восстановить в этом месте код после прота. Можете убедиться в этом взглянув на адреса RVA 00147291 (_security_init_cookie) и 0014641D (_scrt_common_main_seh) - там будут jmp на вход в вм. Добавлено спустя 24 минуты _MBK_ Извиняюсь, что встреваю в столь пикантные весенние брачные игры, но разве задача имеет решение? Почти любая задача в программировании/реверсе может иметь приемлимое решение, если она правильно сформулирована. В данном случае, если юзеру требуется локализовать мутированную вмпротом функцию в разных версиях одного и того же приложения, то зная особенности вмпрота можно сказать что любая сигнатура в данном случае бесполезна. Задача решается следующим образом: - первый раз функция деобфусцируется до нужной степени и выявляется её алгоритм - находится jmp на начало этой функции из оригинального кода (он всегда будет) - далее 2 пути в зависимости от защиты: 1. jmp исполняемый - в этом случае на нем можно брякнуться и мы запоминаем все ссылки на него из других функций и само место этой функции относительно других. Стартуем, брякаемся - видим откуда. 2. jmp не исполняемый (данная мутированная функция вызывается из другой защищенной функции). В этом случае ориентируемся только на место этой функции относительно других. Все, этой информации достаточно, чтобы довольно быстро определить адрес нужной функции в новом билде. Конечно при условии, что разработчик билда не перетасует все функции в исходниках, но такого на своей практике я не встречал. ----- Everything is relative... |
|
Создано: 30 марта 2020 11:40 · Личное сообщение · #5 Vamit пишет: Этот код не может быть ОЕП, т.к. расположен в секции прота, это какой-то вход в вм. ОЕП всегда должен быть в секции кода программы, а не прота защищающего её. Vamit пишет: ОЕП в данной программе найти невозможно потому что его нет, при виртуализации/мутации кода на ОЕП вмпрот полностью затирает это место без каких-либо признаков. Ты там определись есть ли он или его нет, то что я выше указал и есть начало OEP которое под вм ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 30 марта 2020 11:49 · Личное сообщение · #6 |
|
Создано: 30 марта 2020 12:47 · Личное сообщение · #7 |
|
Создано: 30 марта 2020 14:55 · Личное сообщение · #8 |
|
Создано: 30 марта 2020 15:41 · Личное сообщение · #9 Boostyq пишет: и строки шаблона перемешаны / смешаны с реализацией других инструкций +1 млять, и вроде же разный материал, а приёмы схожи. упорядочить "беспорядок", или вычленить полезную датафлоу, инфо мало. под асм исходник ни одни "пузырьки" не подходят..)) как нагадить вроде есть, но найти матрицу перестановок, кажется не реально. ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
|
Создано: 30 марта 2020 16:54 · Личное сообщение · #10 Boostyq Как насчет распознавания виртуализированных инструкций, когда их реализация разбита на множество примитивов и строки шаблона перемешаны / смешаны с реализацией других инструкций? Данная задача у меня решена на 98%. А оставшиеся 2% проще руками поправить в девиртуализованном коде. ----- Everything is relative... |
|
Создано: 30 марта 2020 18:53 · Личное сообщение · #11 Vamit > после ОЕП, которая вызывается из вм, а первая "чистая" функция SEH Prolog Так она ведь первой и найдена была. Из за того что обёрнута мусором, то толку от этой функции никакого. > ОЕП в данной программе найти невозможно потому что его нет В морф/вирт предполагается что EP нет, есть ближайшее место без морфа. Находится EP общим критерием Никто больше не решил.. чувак тот что утверждал что найдёт EP тоже пропал cppasm > Задача - быстро найти где пропатчить, без полного повторного разбора. Чья это задача ? ТС нужно сигнатуру составить, а не патчить что либо. Примером должны быть два бинаря, в которых весь код полностью отморфлен. И найти общее между ними. А не два одинаковых бинаря не криптованных, в которых кому то нужно найти функцию и что то с ней сделать. ----- vx |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 30 марта 2020 21:00 · Личное сообщение · #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 |
|
Создано: 30 марта 2020 21:11 · Поправил: difexacaw · Личное сообщение · #13 ELF_7719116 > какие-то инструкции останутся открытыми (после распаковки). В данном случае после анпака часть кода криптована. А может быть что весь код криптован, после анпака будет всё тот же крипт. Нетронутыми остануться лишь данные. По той простой причине, что их невозможно криптовать в том же аппаратном моде рекурсия #6 > кроме сигнатур есть эвристика По простой причине - ограничение на число итераций вирты, это тайминг. А есчо есть вторая причина, крипт это не метаморфы и прочие виксы, где вообще статик кода/данных нет(тк входные данные для крипта бинарь с не известным покрытием, а викс моторы изначально не содержат статик). ----- vx |
|
Создано: 30 марта 2020 22:36 · Поправил: Bronco · Личное сообщение · #14 ELF_7719116 пишет: что filename.exe накрыт Denuvo. пиздец выводы, с каких это пор дунька пакером стала? ну читает дворды для завязки с примитивным шифрованием, так их все читают, да же чистые аппы. -------------- сигнатура не панацея, но в большинстве случаев в динамике нет необходимости. ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
|
Создано: 30 марта 2020 22:49 · Поправил: Boostyq · Личное сообщение · #15 difexacaw пишет: В морф/вирт предполагается что EP нет, есть ближайшее место без морфа Бредовое заявление. Допустим вся программа от и до находится под виртуальной машиной, все вызываемые функции тоже под вм, поэтому не происходит выхода из нее вовсе. В таком случае что у проги нет OEP? Вот тебе на, а если она вызывает например 1 winapi функцию, тогда что адрес этой функции и будет OEP? Конечно нет, в случае виртуализации OEP выглядит иначе, это адрес начала первого примитива, которым реализуется первая инструкция OEP, но одного адреса мало, примитив может вызываться кучу раз с разным контекстом еще до OEP, поэтому логичным дополнением будет соответствующий указатель ленты вм. И никакой автоматикой это невозможно решить, до тех пор пока явно не научить обрабатывать это, ни о какой универсальности не может быть и речи. Еще повторюсь, если OEP для тебя это ближайшее чистенькое место, то нахрена нужен dbi, если это можно найти руками за 5 минут, да пиво в руках не подержишь, но и 4 часа околачиваться не надо насилуя свой пэка. Ставишь сбор трассы и запускаешь прогу, потом листаешь с начала и находишь первое такое место, но опять же это ерунда, еще до OEP может вызываться незащищенный код. ELF_7719116 пишет: С хочет создать сигнатуру на два и более файла Вы как и клерк прицепились к этому слову, сигнатура это формальность, потому что для обычного статического кода это так называется. Естественно тс нужно локализовать определенную функцию, ему плевать на обнаружение файла, он и так знает что это нужная программа, в ней есть нужная мутированая функция, он и так знает что там вмпрот, а что ему неизвестно так это как ее находить в каждой новой сборке программы, после того как над ней постарался вмпрот. Если у вас есть эвристический метод это хорошо, допустим функция единственная вызывает какую-нибудь winapi, и поставив хук на нее, можно вытащить адрес возврата из стека и точно найти адрес принадлежащий этой функции. А если (никаких если, точно) тсу нужно определенное место в функции, что ваша эвристика будет делать? Приведение примера ав это вообще абсурд, у них другая задача, ав нужно найти хотя бы один признак нужного поведения где-бы он ни был, и чем надежнее, тем лучше, тсу же нужно точное место. ----- В облачке многоточия |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 30 марта 2020 22:52 · Поправил: ELF_7719116 · Личное сообщение · #16 Вообще это всё полная фигня! На 98й винде explorer 5 и opera крашатся при просмотре exelab.ru, вот это проблема! Небось, читают, как все, dword'ы из KUSER_SHARED_DATA, да никак не прочитают. А opera.dll Блаукович забыл упаковать с 2014 года. | Сообщение посчитали полезным: dosprog |
|
Создано: 31 марта 2020 13:08 · Личное сообщение · #17 ELF_7719116 пишет: Небось, читают, как все, dword'ы из KUSER_SHARED_DATA угомонись ты с этими привязками, нет способа отлома, без наличия легальной копии. исходные данные для декрипта аргумента в инструкции лежат в лицензии. с ней можно пошарить сервак на 5 актив в день, но какой от этого интерес конечному пользователю? ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 31 марта 2020 13:53 · Личное сообщение · #18 Bronco пишет: нет способа отлома, без наличия легальной копии... И к чему это? Способы отлома обсуждаются в теме "Crack SecuROM & DENUVO". Была озвучена точка зрения по детектированию вмп-подобных файлов с колокольни av engine. ТС мог бы выложить два-три файла для примера, что внесло конкретику в обсуждение. |
|
Создано: 31 марта 2020 14:09 · Поправил: Bronco · Личное сообщение · #19 ELF_7719116 пишет: Была озвучена точка зрения по детектированию вмп-подобных файлов с колокольни av engine. ну во первых, фейса дуни в паблике нет. разрабы солидные люди, у аверов к ним вопросов нет. нах им снифеть дуню, мне не ясно. вот вторых, признаки вторичные, не уникальные, детект только в динамике, а без лицензии ....бла-бла-бла по кругу. в третьих, нет ничего впм подобного в дуньке, кроме того что есть примитивная вирта. обфускация вм? так она то же разная ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
<< . 1 . 2 . 3 . 4 . |
eXeL@B —› Протекторы —› Создание сигнатуры для мутированного VMProtect'ом кода |