Сейчас на форуме: (+6 невидимых) |
eXeL@B —› Протекторы —› Denuvo - мнение\опыт\обсуждение |
<< . 1 . 2 . 3 . 4 . |
Посл.ответ | Сообщение |
|
Создано: 31 августа 2016 18:24 · Поправил: v00doo · Личное сообщение · #1 Мы тут обещали: Готовый пример на 50 мин. видео по распаковке Denuvo и обходу CPUID [RUS] Зеркала: https://mega.nz/#!XdtDGbCS!qdAemhodvvVq5_2gVhpaN4RMFB0sK0xCq42OCezKnDM Уже найдено в сети: https://youtu.be/M4-8VLGQWnY https://www.youtube.com/watch?v=4LlVenBI1WE Английский вариант будет позже ближе к ночи, еще не рендерили. Мы так же знаем, о наличии x86 билда Denuvo, который уже повесили на игры, интрига остается... Принимаем критику\идеи\опыт. Два основных условия топика: 1. Не просить кряки! Топик создан для исследования принципов и механизмов работы защиты. 2. Флуд в теме не приветствуется, но допускается в разумных количествах, всех нарушителей, кто перейдет черту - будут удалять. По активности темы можно будет понять насколько это интересует людей. | Сообщение посчитали полезным: Bronco, HandMill, SReg, sem0374, WildGoblin, SER[G]ANT, Johnatalbi, mkdev, red0x, verdizela, Haoose-GP, Qbik, zNob, exit_2, Groul, kurorolucifer, Nightshade, gloom, apan, Styx, 4kusNick, Veliant, 6oTBa, nv, rus935, oldman, Mast3r, Sexist, kassane, kouljaboy, JabukeGrada, ZLOFENIX, Voices_of_the_BULG |
|
Создано: 11 октября 2016 16:48 · Поправил: Bronco · Личное сообщение · #2 |
|
Создано: 17 октября 2016 12:00 · Поправил: difexacaw · Личное сообщение · #3 Я не вникал в суть вопроса, но если цель - отследить cpuid, то можно исходить из следующих соображений. Хардверно мы отключить эту инструкцию не можем(установить ловушку). Поэтому есть два варианта - либо найти код с этой инструкцией, что фактически невозможно, так как код может формироваться в динамике, по этой же причине и как второй вариант - отследить инструкцию из их потока, запустив эмуляцию(динамическую - частичную). Для этого не нужно разворачивать какие то вм, достаточно локальной для потока, стековой вм, тоесть надстройки над кодом. Это в данный момент годная технология. Из плюсов - высокое быстродействие и невозможность детекта обычного типа(гипервизора, так как его нет). Детект фактически может быть по NPX-раскрытию указателя, что фиксится на уровне этой вм, в остальном очевидных проблем не возникает. Забыл привести пример, такого типа вм применялась для отладки тяжёлых приложений(DBI - автоматика), к примеру гугл хроме. ----- vx |
|
Создано: 17 октября 2016 12:15 · Личное сообщение · #4 |
|
Создано: 17 октября 2016 12:20 · Личное сообщение · #5 oldman Ну я тока про одну целевую инструкцию написал, про то как устроена вм я не говорил и хз. Но в любом случае способа есть два - трассировать весь код или найти сигнатурно в памяти инструкцию. Аналогичные методы могут применяться и для анализа вм - имея трассу можно выделить автоматикой из неё макросы, фактически выполнить деморф. ----- vx |
|
Создано: 17 октября 2016 12:28 · Личное сообщение · #6 difexacaw пишет: Но в любом случае способа есть два - трассировать весь код Беда в том, что с существующими в паблике инструментами (трасер в x64dbg) скорость трассинга низкая, порядка 10-15 тысяч инструкций в секунду. А чтобы был какой то результат за разумное время , эту скорость надо бы раз в 5-10 увеличить difexacaw пишет: про то как устроена вм я не говорил и хз Подключайся, кино посмотри и вперёд |
|
Создано: 17 октября 2016 12:37 · Поправил: difexacaw · Личное сообщение · #7 oldman > скорость трассинга низкая, порядка 10-15 тысяч инструкций в секунду Так я говорил не про железячную, а про стековую вм. На x86 профайлинг даёт в 10 раз ниже скорость, по сравнению с прямым исполнением(причем с плохой оптимизацией кода, повторная раскодировка инструкций етц), что можно считать очень хорошим показателем. Под отладочным портом скорость падает до не приемлемой. TF уже не пригоден для отладки. Подробно что бы было понятна суть - инструкция выбирается из потока, копируется в буфер и там исполняется, затем прямым ветвлением получает управление вм, которая выбирает следующую инструкцию и так на каждой итерации; ветвления эмулируются. Стековая вм - потому что не происходит изоляция стека, он общий для вм и для трассируемого кода. ----- vx |
|
Создано: 17 октября 2016 13:39 · Личное сообщение · #8 |
|
Создано: 17 октября 2016 14:08 · Поправил: difexacaw · Личное сообщение · #9 |
|
Создано: 17 октября 2016 14:26 · Личное сообщение · #10 |
|
Создано: 17 октября 2016 23:23 · Личное сообщение · #11 “The procedure [after a crack] is the same every time. We analyze how the crack was done and then we update our protection. It’s a game of cat and mouse that we play,” Blaukovitsch says. Какие аналогии блаукович делает. Сейчас бы хороший анализ защиты, расписать о вреде для легальных пользователей с последующим её распространением, нужна хорошая драма ради веселья. |
|
Создано: 18 октября 2016 01:43 · Личное сообщение · #12 |
|
Создано: 18 октября 2016 02:20 · Поправил: oldman · Личное сообщение · #13 |
|
Создано: 26 октября 2016 15:24 · Личное сообщение · #14 oldman Смотрите, опишу фундаментальный механизм трассировки подробно. Это робит очень шустро, никакой другой способ не может дать такой профайл. Если заполнить буфер последовательностью EB90EB90.., то в зависимости от смещения в буфере будет инструкция jmp near rel или nop/jmp. -110 байт смещение на блок, заполненный короткими релатив jmp на near jmp, который вызывает трассировщик. Тогда мы можем взять просто скопировать инструкцию в такой буфер и передать на него управление. Используем следующую особенность. Вероятность страничной ошибки при копировании инструкции мала, так код в модулях никогда не занимает секцию целиком, имеется место из за выравнивания страницы. Поэтому можно не юзать дизасм длин для копирования инструкции. Можно её копировать через mosd etc как 16 байт и при событии #AV(для модулей не будет) прекращать копирование. Это даст профайл больший, чем копирование длины через rep movsb. Для обработки понадобятся две структуры(масм дефейны), это машинный фрейм с состоянием задачи, имеющий одну особенность. Структура, описывает сохраняемые регистры(pushad): Code:
Структуры необходимые для возврата через iret/retf: Code:
Профайл между iret и retf - последняя выполняется в два раза быстрее(если юзать в виде IFRAME -> pushfd/popfd/retf 8). Наконец две основные рабочие структуры: Code:
Code:
Как это работает. Все инструкции, которые не передают управление выполняются непосредственно в буфере. Инструкции передачи управления эмулируются, возможно и некоторые другие. При эмуляции может ложится в стек значение, для этого необходимо некоторое пространство(Space) максимальный размер которого для произвольной инструкции - размер RGP. К примеру Call занимает 4 байта. При входе в трассировщик формируется структура ESTATE. Далее IFRAME переносится в Space и ESTATE уже не существует, используется рабочая TSTATE. При возрате используется поле Stack. Это указатель на IFRAME, который перемещается на низ стека(после эмуляции TSTATE.Rgp.rEsp это новый стек) и выполняется popad/pop esp/iret. Адрес возврата изменён на трассировочный стаб, тоесть это рекурсивный вызов, нужно использовать маркер рекурсии. При входе в трассировщик формируется ESTATE и приводится к TSTATE. Затем эмулируются ветвления или выбирается новая инструкция и исполняется в буфере, для этого нужен дизасм длин. Две фичи - не копирование через movs и отсутствие необходимости смещать стек(из за ESTATE.Stack) даёт профайл(первое только в теории, у меня юзается rep movs). Но именно на дизасме длин образуется затыка по скорости, нужен быстрый. ----- vx | Сообщение посчитали полезным: oldman |
|
Создано: 27 октября 2016 09:12 · Личное сообщение · #15 difexacaw пишет: Смотрите, опишу фундаментальный механизм трассировки подробно. Спасибо за развернутый ответ, но к сожалению практической пользы для меня никакой, я сам все равно такое не напишу, жалко времени, я уже достаточно потратил на денуву "for fun". Поэтому хотелось бы ограничиться скриптами для x64dbg или готовыми решениями в виде плагинов к тому же x64dbg или какими-то прогами сторонними. Во-вторых, игра под денувой совершенно не рада, что ее трассируют. Ты мне выше про dbi рассказал, ну я нагуглил готовые решения, типа rio, pin, еще там что-то было. Под всеми ними тот же томб райдер просто закрывается через некоторое время, думаю где-то в стартовом коде стима, даже не отрисовав начальное меню с настройками. Дампы, со своим стартовым кодом, стартуем уже с винмайна фактически, пусть и обмазанного вм - то же самое, под dbi-трассером падают с ошибкой. Разбираться изза чего это так - тоже уже совершенно лень, проще дальше без разбора вм ковырять защиту, цель там вообщем поставлена, просто утомляет массовость всего - в томб райдере проверки привязки к версии ОС происходят порядка 8000 раз с более чем 140 уникальных мест, от момента запуска до игрового процесса. |
|
Создано: 27 октября 2016 09:25 · Поправил: difexacaw · Личное сообщение · #16 oldman Тут не в методе проблема, а в софте. Тот же drio переписывает весь нэйтив на свои костыли, удивительно как оно вообще в принципе такое может функционировать. Пин так же требует масштабного развёртывания, это фактически подсистема. Не удивительно что такой жир не робит с защитой. Свой тулз я есчо не доделал, возникает масса задач, на решение которых нужно время. ----- vx |
|
Создано: 27 октября 2016 09:35 · Личное сообщение · #17 difexacaw пишет: Тут не в методе проблема, а в софте. Ну это классическое.. в теории всё хорошо, а в реале выходит вот так как выходит На тот же рио есть в гитхабе эксплоит как выйти из под контроля трассера, выполнить код, и вернутся под контроль трассера - ну чисто цирк Если поставят цель, думаю твой тулз пострадает тоже difexacaw пишет: Свой тулз я есчо не доделал, возникает масса задач, на решение которых нужно время. Удачи, затея конечно хорошая. Пишешь как отдельную прогу, или плагин к дебагерам? |
|
Создано: 27 октября 2016 09:42 · Поправил: difexacaw · Личное сообщение · #18 oldman Мотор давно использовался, но оно под частные задачи(обход CFI etc). И есчо кривое всё сырое, поэтому было решено перепилить с нуля, проработав подробно все механизмы. Но это весьма маштабный прожект, где нужно учесть огромное число возможных механизмов, каждый из которых в свою очередь порождает есчо кучу. Вот например если не использовать полну трассировку приложения - пометить нужную страницу как NX, то придётся использовать механизм типо "trace over", что бы не генерить паразитные фолты. Это в свою очередь требует введение стека вызовов, это работало, но механизм передачи управления между частями кода может быть произвольным, что в свою очередь становится сложной задачей(и не совместим с тем же CFI). И так на каждом этапе. В принципе если получится это всё реализовать, то тулз будет мощным, можно будет в реалтайме анализить всё. ----- vx |
<< . 1 . 2 . 3 . 4 . |
eXeL@B —› Протекторы —› Denuvo - мнение\опыт\обсуждение |