Как стать автором
Обновить
33
0
Алексей Скурыдин @Anakonda

Пользователь

Отправить сообщение

Не увидел в статье/комментариях самого главного: сколько в солнечную и в "среднюю" погоду вся конструкция выдает мощности на выходе в ваттах

И с дисплеем все прекрасно получиться, пример: github.com/anakod/Sming/tree/master/LiquidCrystal_44780
ESP8266 для таких штук как раз оптимален, т.к. его цена ~3$.
Но хотелось бы не просто защищать, а именно обфусцировать проект.

Здесь почти наверняка проблема именно в переименовании.

Если у самого не получится решить проблему, тогда к Вам обращусь. А если решу сам — напишу как решил.

Да, обязательно напишите что получится. И, в любом случае, мы будем рады помочь Вам советом.
Все дело в том, что в WPF используется множество механизмов неявного связывания по имени. Наш обфускатор распознает и корректно обрабатывает многие из этих случаев, но во-первых, разумеется, мы могли что-то и упустить, а во-вторых местами неявное связывание слишком уж неявное чтобы его выявить и обработать :) Особенно в этом плане опасны случаи генерации WPF содержимого непосредственно из кода приложения.

Чтобы выявить проблемную область, мы рекомендуем перенаправить поток ошибок в текстовый файл (по типу: you.exe 2> log.err), а затем скормить его стек трейс декодеру. Он подскажет с чем связана ошибка, дальше как правило достаточно добавить атрибут ObfuscationAttribute.

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

Спасибо за отзыв!
Кстати, я думаю, что генерация мусора вообще не обязательна. В не выполняемых ветках предиката можно просто вставить переход на непредсказуемый участок пользовательского кода (точнее передвинуть этот участок под предикат, чтобы скрытно было). Это также убережёт от раздувания екзешника. В текущей реализации мы так и делаем: выглядит очень ествественно как на уровне IL так и в декомпилированном виде.
Неразрешимость будет, если память бесконечна.

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

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

Я уверен, что подавляющее большинство случайных предикатов решается на ура.

Если сделать генератор, который создаёт предикаты и отсеивает те, которые решились на ура, то уже большинство предикатов не будут так просты.

Возможно я не совсем правильно понял Ваш вариант с хэшом. Как мне кажется эмулятор как раз сделан для того, чтобы проэмулировать вычисление sha1 и понять, что значение всегда такое-то. В этом предложении отсутствует элемент псевдослучайности входных параметров без которого задача решается эмуляцией.
Не забывайте что программа, кроме обеспечения непосредственно защиты, должна еще продолжать полноценно работать. Приложение сплошь покрытое предикатами по 20..50 операций умножения\деления\возведения в степень каждый, вряд ли будет приемлемо в использовании.

На самом деле, очень перспективной на будущее, видится реализация Opaque Predicates на базе указателей. В статье говориться о том, что эта задача, как и проблема останова, в общем случае, является неразрешимой. А неразрешимая задача всегда лучше NP полной :) Думаю что в ближайшее время мы продолжим наши исследования в этом направлении.
Не забывайте что программа, кроме непосредственно обеспечения самой защиты, должна еще продолжать работать :) Приложение, которое сплошь покрыто предикатами по 20..50 операций умножения\деления\возведения в степень каждый, вряд ли будет приемлемо в использовании.

На самом деле, очень перспективной на будущее, видится реализация Opaque Predicates на базе указателей. В статье упоминается, что эта задача считается неразрешимой, что еще лучше NP полноты :) Думаю в ближайшее время мы продолжим наши исследования в этом направлении.
В коде таких предикатов сотни тысяч, 3-5 секунд на штуку — заведомо не приемлимое время (в случае реального применения).

Кроме того, предикат еще надо выявить в размазанном коде и, при этом, не зарезать реальные if'ы (даже с 99% вероятностью невыполнимые).
Некоторые примеры предикатов из первой версии генератора:

"(x3 | x2 | !x0) & (x3 | x2 | x1) & (x3 | x2 | x4) & (x3 | !x0 | x1) & (x3 | !x0 | x4) & (x3 | x1 | x4) & (x2 | !x0 | x1) & (x2 | !x0 | x4) & (x2 | x1 | x4) & (!x0 | x1 | x4) & (!x2 | !x1 | !x4) & (!x2 | !x1 | !x3) & (!x2 | !x1 | x0) & (!x2 | !x4 | !x3) & (!x2 | !x4 | x0) & (!x2 | !x3 | x0) & (!x1 | !x4 | !x3) & (!x1 | !x4 | x0) & (!x1 | !x3 | x0) & (!x4 | !x3 | x0)",

"(x2 | x1 | x0) & (x2 | x1 | x4) & (x2 | x1 | x3) & (x2 | x0 | x4) & (x2 | x0 | x3) & (x2 | x4 | x3) & (x1 | x0 | x4) & (x1 | x0 | x3) & (x1 | x4 | x3) & (x0 | x4 | x3) & (!x2 | !x4 | !x0) & (!x2 | !x4 | !x1) & (!x2 | !x4 | !x3) & (!x2 | !x0 | !x1) & (!x2 | !x0 | !x3) & (!x2 | !x1 | !x3) & (!x4 | !x0 | !x1) & (!x4 | !x0 | !x3) & (!x4 | !x1 | !x3) & (!x0 | !x1 | !x3)",

"(x1 | !x0 | !x2) & (x1 | !x0 | x4) & (x1 | !x0 | x3) & (x1 | !x2 | x4) & (x1 | !x2 | x3) & (x1 | x4 | x3) & (!x0 | !x2 | x4) & (!x0 | !x2 | x3) & (!x0 | x4 | x3) & (!x2 | x4 | x3) & (x0 | !x1 | !x4) & (x0 | !x1 | x2) & (x0 | !x1 | !x3) & (x0 | !x4 | x2) & (x0 | !x4 | !x3) & (x0 | x2 | !x3) & (!x1 | !x4 | x2) & (!x1 | !x4 | !x3) & (!x1 | x2 | !x3) & (!x4 | x2 | !x3)",

"(x0 | !x3 | x4) & (x0 | !x3 | x1) & (x0 | !x3 | x2) & (x0 | x4 | x1) & (x0 | x4 | x2) & (x0 | x1 | x2) & (!x3 | x4 | x1) & (!x3 | x4 | x2) & (!x3 | x1 | x2) & (x4 | x1 | x2) & (!x0 | !x2 | x3) & (!x0 | !x2 | !x1) & (!x0 | !x2 | !x4) & (!x0 | x3 | !x1) & (!x0 | x3 | !x4) & (!x0 | !x1 | !x4) & (!x2 | x3 | !x1) & (!x2 | x3 | !x4) & (!x2 | !x1 | !x4) & (x3 | !x1 | !x4)",

"(!x0 | !x3 | x1) & (!x0 | !x3 | x4) & (!x0 | !x3 | !x2) & (!x0 | x1 | x4) & (!x0 | x1 | !x2) & (!x0 | x4 | !x2) & (!x3 | x1 | x4) & (!x3 | x1 | !x2) & (!x3 | x4 | !x2) & (x1 | x4 | !x2) & (x0 | x2 | !x1) & (x0 | x2 | !x4) & (x0 | x2 | x3) & (x0 | !x1 | !x4) & (x0 | !x1 | x3) & (x0 | !x4 | x3) & (x2 | !x1 | !x4) & (x2 | !x1 | x3) & (x2 | !x4 | x3) & (!x1 | !x4 | x3)",

"(!x0 | x1 | x3) & (!x0 | x1 | x4) & (!x0 | x1 | x2) & (!x0 | x3 | x4) & (!x0 | x3 | x2) & (!x0 | x4 | x2) & (x1 | x3 | x4) & (x1 | x3 | x2) & (x1 | x4 | x2) & (x3 | x4 | x2) & (x0 | !x4 | !x3) & (x0 | !x4 | !x1) & (x0 | !x4 | !x2) & (x0 | !x3 | !x1) & (x0 | !x3 | !x2) & (x0 | !x1 | !x2) & (!x4 | !x3 | !x1) & (!x4 | !x3 | !x2) & (!x4 | !x1 | !x2) & (!x3 | !x1 | !x2)"
Спасибо за Ваш комментарий, ответил на вопрос atd чуть выше
В статье говориться
Наша реализация генератора, к сожалению, не совсем идеальна

Мы не претендуем на NP-полноту задачи распознавания наших предикатов (именно поэтому не показываем реализацию). Но например, если бы генерировали тождественно истинные 3-КНФ (коньюктивные нормальные формы с тремя операндами в коньюнктах, типа: x==null & y!=null & z==null || x!= null & y==null в таком духе), то гарантировано не получилось бы написать распознаватель. Но когда мы реализовали это на практике, то оказалось, что в программе вставленный код сразу сильно бросается в глаза. Тогда мы задумались о скрытности предикатов, и в качестве временного решения, создали данный генератор. С учетом Control Flow обфускации выявление и удаление таких предикатов из кода будет достаточно затруднительно.

Статья же, охватывает тему Opaque Predicates намного более широко. Здесь поднимается вопрос о видах предикатов и разработке NP полного генератора. Мы планируем продолжать двигаться в эту сторону.
Замедление на нашем синтетическом тесте с большим объемом кода примерно в 1.2 раза, в реальной программе должно получиться еще меньше. Потребление памяти фактически никак не меняется, т.к. в предикатах используются переменные из пользовательского кода.
В примере if ((x*x & 1) == 0) надо заменить на if ((x+x & 1) == 0) я опечатался и вместо плюс написал умножить
Даже не знаю что могло не понравиться Bitdefender. Неужели Яндекс метрика (кросдоменный запрос)?
Да, речь, в первую очередь, шла именно про SenseLock. С ним у нас есть опыт работы.
Про Guardant Code слышу впервые, спасибо, обязательно посмотрю на досуге.
Но это не гарантирует что никто не догадается :) Как минимум, можно заметить что меняется иконка при отправки на обфускацию типового пустого приложения. Второй минус метода — вместимость хранения данных ограничена.

Но никто не мешает совмещать несколько методов ватермарков. Шанс что хакер вычислит их все, существенно меньше. Статья как раз направлена на всестороннее рассмотрение данной проблемы.
Можно, но если кто-то об этом узнает то удалить ее будет крайне просто :)
Да, аппаратные ключи — хорошее решение, когда клиентов не много и продукт большой. Мы скорее всего добавим их поддержку в Appfuscator в будущем. Но утечку дистрибутива они идентифицировать не помогут, в отличии от Watermark.
Место как раз не точное, каждый раз среди функций, отвечающих критериям «крупности» и вероятности выполнения, выбирается N случайных, в которые внедряется ватермарк. Соответственно в разных программах место так же будет отличаться. Коме того, в усиленном варианте на данные ватермарка буде завязано множество других функций и выпилить его будет весьма проблематично.

Информация

В рейтинге
Не участвует
Откуда
Екатеринбург, Свердловская обл., Россия
Дата рождения
Зарегистрирован
Активность