Сейчас на форуме: (+6 невидимых)

 eXeL@B —› Протекторы —› Denuvo - мнение\опыт\обсуждение
<< . 1 . 2 . 3 . 4 .
Посл.ответ Сообщение

Ранг: 80.6 (постоянный), 194thx
Активность: 0.10.04
Статус: Участник

Создано: 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


Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 11 октября 2016 16:48 · Поправил: Bronco
· Личное сообщение · #2

oldman пишет:
"Мы не молчим, мы работаем"

Респект, хучить црц и ловить инструкции на передаче управления из вм - рациональное решение.
Оффтоп: "Нас мало, но мы в тельняшках"

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 17 октября 2016 12:00 · Поправил: difexacaw
· Личное сообщение · #3

Я не вникал в суть вопроса, но если цель - отследить cpuid, то можно исходить из следующих соображений. Хардверно мы отключить эту инструкцию не можем(установить ловушку). Поэтому есть два варианта - либо найти код с этой инструкцией, что фактически невозможно, так как код может формироваться в динамике, по этой же причине и как второй вариант - отследить инструкцию из их потока, запустив эмуляцию(динамическую - частичную). Для этого не нужно разворачивать какие то вм, достаточно локальной для потока, стековой вм, тоесть надстройки над кодом. Это в данный момент годная технология. Из плюсов - высокое быстродействие и невозможность детекта обычного типа(гипервизора, так как его нет). Детект фактически может быть по NPX-раскрытию указателя, что фиксится на уровне этой вм, в остальном очевидных проблем не возникает.

Забыл привести пример, такого типа вм применялась для отладки тяжёлых приложений(DBI - автоматика), к примеру гугл хроме.

-----
vx




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 17 октября 2016 12:15
· Личное сообщение · #4

difexacaw пишет:
но если цель - отследить cpuid


Эта задача решена полностью, проблема в другой области, а она требует всё таки вникать в работу вм. Хотя есть
и другие варианты.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 17 октября 2016 12:20
· Личное сообщение · #5

oldman

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

-----
vx




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 17 октября 2016 12:28
· Личное сообщение · #6

difexacaw пишет:
Но в любом случае способа есть два - трассировать весь код


Беда в том, что с существующими в паблике инструментами (трасер в x64dbg) скорость трассинга низкая,
порядка 10-15 тысяч инструкций в секунду. А чтобы был какой то результат за разумное время , эту
скорость надо бы раз в 5-10 увеличить

difexacaw пишет:
про то как устроена вм я не говорил и хз


Подключайся, кино посмотри и вперёд




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 17 октября 2016 12:37 · Поправил: difexacaw
· Личное сообщение · #7

oldman

> скорость трассинга низкая, порядка 10-15 тысяч инструкций в секунду

Так я говорил не про железячную, а про стековую вм. На x86 профайлинг даёт в 10 раз ниже скорость, по сравнению с прямым исполнением(причем с плохой оптимизацией кода, повторная раскодировка инструкций етц), что можно считать очень хорошим показателем. Под отладочным портом скорость падает до не приемлемой. TF уже не пригоден для отладки.

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

-----
vx




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 17 октября 2016 13:39
· Личное сообщение · #8

difexacaw пишет:
Подробно что бы было понятна суть


Идея понятна. Реализация какая-нибудь существует?




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 17 октября 2016 14:08 · Поправил: difexacaw
· Личное сообщение · #9

oldman

Используется уже давно для множества задач - защиты, обхода CFG/CFI, VM, будет использоваться для поиска целевых ссылок в приложении.

-----
vx




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 17 октября 2016 14:26
· Личное сообщение · #10

difexacaw пишет:
Используется уже давно для множества задач


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



Ранг: 0.8 (гость), 2thx
Активность: 0.020
Статус: Участник

Создано: 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.

Какие аналогии блаукович делает. Сейчас бы хороший анализ защиты, расписать о вреде для легальных пользователей с последующим её распространением, нужна хорошая драма ради веселья.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 18 октября 2016 01:43
· Личное сообщение · #12

oldman

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

-----
vx




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 18 октября 2016 02:20 · Поправил: oldman
· Личное сообщение · #13

difexacaw пишет:
Не хочу приводить ссыли


Линк не надо, слова для гугля напиши, можешь в личку




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 26 октября 2016 15:24
· Личное сообщение · #14

oldman

Смотрите, опишу фундаментальный механизм трассировки подробно. Это робит очень шустро, никакой другой способ не может дать такой профайл.

Если заполнить буфер последовательностью EB90EB90.., то в зависимости от смещения в буфере будет инструкция jmp near rel или nop/jmp. -110 байт смещение на блок, заполненный короткими релатив jmp на near jmp, который вызывает трассировщик.

Тогда мы можем взять просто скопировать инструкцию в такой буфер и передать на него управление. Используем следующую особенность. Вероятность страничной ошибки при копировании инструкции мала, так код в модулях никогда не занимает секцию целиком, имеется место из за выравнивания страницы. Поэтому можно не юзать дизасм длин для копирования инструкции. Можно её копировать через mosd etc как 16 байт и при событии #AV(для модулей не будет) прекращать копирование. Это даст профайл больший, чем копирование длины через rep movsb.

Для обработки понадобятся две структуры(масм дефейны), это машинный фрейм с состоянием задачи, имеющий одну особенность.

Структура, описывает сохраняемые регистры(pushad):
Code:
  1. RGP struct
  2. rEdi         DWORD ?
  3. rEsi         DWORD ?
  4. rEbp         DWORD ?
  5. rEsp         DWORD ?
  6. rEbx         DWORD ?
  7. rEdx         DWORD ?
  8. rEcx         DWORD ?
  9. rEax         DWORD ?
  10. RGP ends


Структуры необходимые для возврата через iret/retf:
Code:
  1. IFRAME struct
  2. rEip            PVOID ?
  3. rCs               ULONG ?
  4. rEFlags   DWORD ?
  5. IFRAME ends
  6.  
  7. RFRAME struct
  8. rEip            PVOID ?
  9. rCs               ULONG ?
  10. RFRAME ends


Профайл между iret и retf - последняя выполняется в два раза быстрее(если юзать в виде IFRAME -> pushfd/popfd/retf 8).

Наконец две основные рабочие структуры:
Code:
  1. TSTATE struct
  2. Rgp               RGP <>
  3. Stack         PIFRAME ?
  4. Control   IFRAME <>
  5. TSTATE ends


Code:
  1. ESTATE struct
  2. Rgp               RGP <>
  3. Stack         PIFRAME ?
  4. Space       RGP <>
  5. Control   IFRAME <>
  6. ESTATE ends


Как это работает. Все инструкции, которые не передают управление выполняются непосредственно в буфере. Инструкции передачи управления эмулируются, возможно и некоторые другие. При эмуляции может ложится в стек значение, для этого необходимо некоторое пространство(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

Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 27 октября 2016 09:12
· Личное сообщение · #15

difexacaw пишет:
Смотрите, опишу фундаментальный механизм трассировки подробно.


Спасибо за развернутый ответ, но к сожалению практической пользы для меня никакой, я сам все равно
такое не напишу, жалко времени, я уже достаточно потратил на денуву "for fun". Поэтому хотелось бы
ограничиться скриптами для x64dbg или готовыми решениями в виде плагинов к тому же x64dbg или
какими-то прогами сторонними.

Во-вторых, игра под денувой совершенно не рада, что ее трассируют. Ты мне выше про dbi рассказал,
ну я нагуглил готовые решения, типа rio, pin, еще там что-то было. Под всеми ними тот же томб райдер
просто закрывается через некоторое время, думаю где-то в стартовом коде стима, даже не отрисовав
начальное меню с настройками. Дампы, со своим стартовым кодом, стартуем уже с винмайна фактически,
пусть и обмазанного вм - то же самое, под dbi-трассером падают с ошибкой.

Разбираться изза чего это так - тоже уже совершенно лень, проще дальше без разбора вм ковырять
защиту, цель там вообщем поставлена, просто утомляет массовость всего - в томб райдере проверки
привязки к версии ОС происходят порядка 8000 раз с более чем 140 уникальных мест, от момента
запуска до игрового процесса.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 27 октября 2016 09:25 · Поправил: difexacaw
· Личное сообщение · #16

oldman

Тут не в методе проблема, а в софте. Тот же drio переписывает весь нэйтив на свои костыли, удивительно как оно вообще в принципе такое может функционировать. Пин так же требует масштабного развёртывания, это фактически подсистема. Не удивительно что такой жир не робит с защитой.
Свой тулз я есчо не доделал, возникает масса задач, на решение которых нужно время.

-----
vx




Ранг: 30.2 (посетитель), 31thx
Активность: 0.060
Статус: Участник

Создано: 27 октября 2016 09:35
· Личное сообщение · #17

difexacaw пишет:
Тут не в методе проблема, а в софте.


Ну это классическое.. в теории всё хорошо, а в реале выходит вот так как выходит

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

difexacaw пишет:
Свой тулз я есчо не доделал, возникает масса задач, на решение которых нужно время.


Удачи, затея конечно хорошая. Пишешь как отдельную прогу, или плагин к дебагерам?




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 27 октября 2016 09:42 · Поправил: difexacaw
· Личное сообщение · #18

oldman

Мотор давно использовался, но оно под частные задачи(обход CFI etc). И есчо кривое всё сырое, поэтому было решено перепилить с нуля, проработав подробно все механизмы. Но это весьма маштабный прожект, где нужно учесть огромное число возможных механизмов, каждый из которых в свою очередь порождает есчо кучу. Вот например если не использовать полну трассировку приложения - пометить нужную страницу как NX, то придётся использовать механизм типо "trace over", что бы не генерить паразитные фолты. Это в свою очередь требует введение стека вызовов, это работало, но механизм передачи управления между частями кода может быть произвольным, что в свою очередь становится сложной задачей(и не совместим с тем же CFI). И так на каждом этапе. В принципе если получится это всё реализовать, то тулз будет мощным, можно будет в реалтайме анализить всё.

-----
vx



<< . 1 . 2 . 3 . 4 .
 eXeL@B —› Протекторы —› Denuvo - мнение\опыт\обсуждение
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати