Это вы про обфускацию видимо, это все ерунда. Дело не в сложности, как я писал выше, а соотношении сложности последующего кряка/скорости работы.
Ну в этом плане, я думаю, виртуализация с JIT-компиляцией в рантайме будет хорошим решением. Ты не сможешь пропатчить, пока не разберешься в формате байт-кода вм, плюс на уровне JIT-компиля можно встроить проверки каких-то контрольных сумм байт-кода и компилировать некорректный код, если контрольные суммы не сходятся.
Кстати, смотрел недавно исходники рантайма дотнетовского, оказывается, у них JIT со всеми фазами оптимизации на плюсах написан. Поехавшие товарищи, однако. Чет даже грустно стало.
Практически 90% софта можно ломануть инлайн патчем, имхо все они юзают в том или ином случае либо шадов, либо ntdll. Пока существуют API (native API, сисколы) все можно подменить/крякнуть.
При всем желании нельзя написать гц, на языке, который требует наличия гц. Всякие метациркулярные JIT-компили, как например PyPy, жульничают за счет того, что используют низкоуровневые собственные сабсеты языка (в случае PyPy - это RPython), на которых уже кодят и гц и компиль. Просто мелкомягкие не стали заморачиваться такой штукой. --- Сообщение объединено, 23 фев 2021 --- Ну можно защиту на криптографии строить и не использовать тот же встроенный CryptoAPI, bcrypt и тд.
При любом раскладе ограничение функционала всяких триалов и т.п., как правило сводится к вызову/не вызову определённых API или запросами на сервер активации через те же API. Без дров защита - не защита, и то обходится, если софт стоящий - сломать можно, дело в цене вопроса как всегда.
если ключевой функционал на облаке, то от ломания клиентской софтины толку Зеро иль ключевые функи в железку мб впихнуты.
Если я правильно понял эту глубокую метафору, то и сама OEP может быть абстракцией. Чисто технически она же не нужна, для того, чтобы абстрактный процессор исполнял абстрактную задачу: программа же не обязательно должна быть продуктом компилятора, есть мизерная возможность, что программа самозародилась, как мыши в шкафу у Аристотеля. И такую возможность тоже следует закладывать в сраный алгоритм поиска OEP.
Есть проблема которая нерешаема - данные не отличимы от кода. Можно графом описать процедуру и вложенные, но там встретится указатель по которому никак в статике не узнать это процедура или данные, таким образом нельзя покрыть весь код. Поэтому криптуется только прямые указатели, на небольшой глубине cf. По этой причине крипта не разбирает cf, блок(секция) кодовая это неделимый обьект. Если его разделить изменятся адресные смещения он будет нерабочим. А если такой обьект целостный, то только он может с собой работать, такая работа есть абсолютная адресация. Есть протекторы которые в одну секцию с исходным кодом добавляют образ с абсолютной выборкой(те есть несколько EP). Но это легко отсекается в динамике по активности(блоки с выборкой разделены всегда последний и есть oep).
Indy_, Да, это так, пайлоад обычно (у меня) размазывается по кодовой и по секции данных, отличить оч трудно, ихо если юзаешь сепшены и самотрассировку это вообще задача конечно решаемая оч. долго и трудоёмко. По облаку -не согласен, дело в том что если предположить гипотетически, что там какой либо суперкомпьютер с N невъе...бенных - количеством процессоров и ресурсов, то по Теореме о бесконечных обезьянах (https://ru.wikipedia.org/wiki/Теорема_о_бесконечных_обезьянах#:~:text=Теоре́ма о бесконе́чных обезья́нах (в,напечатает любой наперёд заданный текст.) оно будет взломано/сдамплено и задетектировано. (Про объезъян к сожалению с нынешними мощностями это близко к правде).
Да хватит уже эту мантру повторять. Все там отличимо. Если тебе показать рандомный буфер в иде и нажать C, ты за долю секунды поймешь, код это или мусор. И у тебя при этом нет никаких сверхспособностей. Примитивный анализ, надо только формализовать ход своего мышления при этом и получишь заветный алгоритм. Причем, в реальном коде ты имеешь дело не с рандомными буферами, если у тебя есть указатель, то он гарантированно указывает на данные или начало инструкции. Вероятность встретить данные, которые декодируются в реальный валидный cfg КРАЙНЕ МАЛА
https://wasm.in/threads/morfing-x86-i-x64.34100/page-2#post-426557 rmn, 000047A1 03 - Это данные или код?
R81..., Начинаешь декодировать инструкции с 0x000047a1 и если пройдешь все control-flow ветки без ошибок декодирования или семантики, то это код.
А если к примеру есть такой код который генерирует ассемблерные вставки? Взять тот же VB6, в нем есть такие данные: Олька и IDA определяют его как код (и то неправильно, с погрешностями), но на самом деле это данные которые используются на этапе построения переходников.
Thetrik, Да в бейсике и дельфях столько дополнительной инфы, что там весь образ по байтам разложить можно. Вангую, что код, что ты привел, детальнейше описан в какой-нибудь rtti-структуре.