Загрузка...

Абстрактный вопрос, крякаю рендер возникли трудности, нужен совет

Тема в разделе Реверсинг / Assembler создана пользователем yumebp 11 июл 2021. 289 просмотров

Загрузка...
  1. yumebp
    yumebp Автор темы 11 июл 2021 Заблокирован(а) 0 26 май 2021
    В общем кто знаком с 3D графикой думаю знает, что существуют сторонние плагины-рендеры, в демо версии обычно на выходное изображение накладываются водяные знаки. Полная версия после установки требует лицензию и не дает получить никакое изображение даже с водяными знаками. В полной версии я пропатчил проверку лицензии и заставил рендер вывести изображение(я банально заменил call на mov eax, 1, так как опытным путем было вычислено, что если функция отрабатывает с легальной лицензией, то в конце в eax заносится 1, в противном случае 0 и дальнейший ход программы зависит от этого значения), но увидел, что изображение все испорчено и на него наложен шум помимо водяных знаков, далее я определил, что там стоит защита кода от модификации, если более просто - контрольная сумма байтов некоторых критичных к изменениям функций. Это мне тоже удалось обойти, я брякнулся после вычисления суммы на месте где она сравнивается с той, что должна быть и просто пропатчил старый хеш на новый. Шум убрался но остались водяные знаки. Как я предполагаю, внутри функции, которая проверяет лицензию, устанавливаются какие-то значения, которые в дальшейшем при старте рендера проверяются некой условной конструкцией, и она уже определяет будут ли добавлены водяные знаки или нет. Так как вызов функции я просто заменяю на другую инструкцию, то следовательно и переменные эти не инициализируются нужными значениями. Отследить какие именно значения и куда именно заносятся не предполагается возможным, потому что функция проверки многопоточная и каждый из потоков совершает сотни и тысячи операций записи\чтения в память приложения, и найти нужное значение в этой каше все равно, что искать иголку в стоге сена. Далее я попытался найти конструкцию, которая проверяет эти переменные и принимает решение о добавлении водяных знаков. Во время рендера паттерн водяных знаков меняется, это не просто какой-то текст поверх изображения, а процедурно-генерируемый полупрозрачный шум, который накладывается на изображение в виде текстового логотипа компании и во время рендера постоянно меняется, меняется сам паттерн, а буквы остаются на своих местах. Я нашел цикл, и вроде бы как могу предположить, что водяные знаки генерируются и добавляются внутри него, я поставил бряк на начало цикла и каждый раз когда я давал ему сделать один проход этот паттерн(шум) на водяных знаках менялся, значит он генерируется и добавляется внутри цикла ? Поправьте меня, если я ошибаюсь касательно этого умозаключения. У меня было еще предположение, что шум может генерироваться в отдельном потоке, а конструкция внутри цикла всего лишь принимает решение добавить его или нет, но сути это не меняет, если эта конструкция внутри цикла, то ее можно поменять и тогда независимо от генерации шума он не будет добавляться. Не может же этот процесс контролироваться извне, за пределами цикла ? Заметка. И первая функция, которая проверяет лицензию и вот этот цикл достаточно большие по объему кода, трассировка со скоростью 5к инструкций в секунду длится на них примерно минут по 15 и занимает на диске по 1.5 гб места, это достаточно много кода, что бы анализировать его в лоб, но нет никаких зацепок, что бы приблизиться ближе к месту, где добавляются эти водяные знаки. Может кто знает, какие-то еще методы сужения круга поиска ? Методом исключения и отсечения лишнего я вроде бы как определил, что это нужный мне цикл, но он большой как я писал выше, внутри него происходит много взаимодействия с другими dll, некоторые из них используют видеокарту для графических вычислений, некоторые выводят картинку в окно рендера, в общем очень много суеты в этом цикле, и я пока не понимаю, как мне приблизиться к месту, которое принимает решение о добавлении водяных знаков. Понятное дело, что многие из вас не знакомы с рендером и с механизмами его работы, но я постарался расписать все абстрактно, что бы это было применимо к каким-то схожим ситуациям, и хочу получить от вас такие же абстрактные ответы и советы, возможно они мне помогут.
     
  2. Brother121
    Интересненько, правда лень читать
     
  3. M1h4n1k
    M1h4n1k 15 июл 2021 Ответы skysmart - t.me/SkyAnsBot 272 4 май 2021
    Интересненько, правда лень читать
     
  4. LLCPPC_inactive4415647
    LLCPPC_inactive4415647 21 авг 2021 Не мир пришел Я принести на землю, но меч 245 15 авг 2021
    Насчёт контрольной суммы - не нужно патчить проверку. Контрольная сумма это всего-лишь один из элемента структуры PE файла. Ты можешь его сохранить, а после изменения файла - вернуть на исходное, с помощью любого PE редактора - CFF Explorer, или LordPE.
    И решение ты ищешь не там.
    На всякий случай проверь - не является ли водяной знак - всего лишь битмап-ресурсом, которое после рисуется поверх изображения - любым редактором ресурсов.
    Если же это bitmap - достаточно будет затереть его прозрачными пикселями.

    Если же это всё-таки какая-то нативная отрисовка, тогда тебе достаточно будет поставить бряк на функцию отрисовки (я думаю, ты уже нашёл функции, которые вызываются). Когда дошёл - проведи любой другой программой поверх водяного знака - если это нужная функция, которая отрисовывает водяной знак, тогда водяной знак должен будет стереться, потому что ОС поверх него отрисует окно приложения, а т.к водяной знак больше не рисуется - он должен будет исчезнуть. Если он исчезнет, достаточно будет дойти до RET этой функции (к слову, после ret - водяной знак должен будет снова появиться), попасть туда, где она вызывалась, и пропатчить вызов (можно так же вместо неё вставить mov eax на нужный результат)
     
    1. yumebp Автор темы
      LLCPPC_inactive4415647, ага, если бы все было так банально и просто как хешсумма в заголовке ПЕ))))) Там куча потоков запускается с множеством защитных механизмов, и в одном из них крутится проверка целостности кода во время его же выполнения, если замечены изменения - тобишь патч - все атас. Поэтому без патча контрольной суммы не обходится дело, по поводу водяных знаков это не просто картинка которая накладывается сверху, это процедурно генерируемый шум в виде логотипа, который каждую долю секунды генерирует новый паттерн, не получится так просто решить эту задачу
Top