Как сделать код нечитаемым
Перейти к содержимому

Как сделать код нечитаемым

  • автор:

Можно ли сделать python код нечитаемым?

sim3x

dospayne2, так уберите пароль от базы из скрипта и сделайте возможность при запуске скрипта указывать путь к конфигурационному файлу через параметр командной строки. Те, кто знает пароль от базы, создадут такой файл, впишут в него пароль от базы — и без проблем запустят скрипт. Если же надо давать людям скрипт на питоне, но при этом скрывать прямо внутри него пароль от базы, то это вообще не безопасный вариант — что-то делаете не так. Надо тогда, чтобы с базой взаимодействовал api-сервис, а ваш питон-скрипт делал к нему обращения по http, а не напрямую в базу ходил. А пароли в клиентских приложениях хранить вообще не безопасно. Даже если вы как-то круто обфусцируете код — все равно не безопасно.

kshnkvn

dospayne2, сколько вы еще будете задавать этот вопрос? Вы не скроете от любопытных глаз код написанный на интерпретируемом языке, любопытные глаза всегда его найдут.
P.S. Сделайте read-only аккаунт к вашей БД и давайте его вместе со скриптом, если боитесь что кто-то что-то вам удалит.

Нужно превратить C++ код в нечитаемое месиво

Собственно сабж. Защита от реверса не нужна, надо просто чтобы сам код выглядел как оно самое. Что-то вроде astyle, только чтоб работало в обратную сторону. Есть такое?

WRG ★★★★
26.05.15 15:39:45 MSK

shuck ★★★
( 26.05.15 15:40:05 MSK )

Удали пробелы и до первой директивы пропроцессора в строке если она есть. В строках которые не завершаются директивой препроцессора удали окончание строки

vertexua ★★★★★
( 26.05.15 15:41:25 MSK )
Ответ на: комментарий от vertexua 26.05.15 15:41:25 MSK

Тоже думал про sed, но может уже есть что-то готовое.

WRG ★★★★
( 26.05.15 15:44:21 MSK ) автор топика

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

Если считаешь, что внятно пишеш на полюсах, то ты себе льстиш.

anonymous
( 26.05.15 15:54:24 MSK )

Лорчую первого анона, приплюснутый код и так лютое нечитаемое говно.

anonymous
( 26.05.15 15:58:04 MSK )

Первый камент и аноны красавчики +100500

deep-purple ★★★★★
( 26.05.15 15:59:17 MSK )
aol ★★★★★
( 26.05.15 15:59:56 MSK )

а ещё можешь на боярский язык перевести

IvS ★
( 26.05.15 16:02:01 MSK )
Последнее исправление: IvS 26.05.15 16:04:46 MSK (всего исправлений: 1)

Ответ на: комментарий от IvS 26.05.15 16:02:01 MSK

Прошел по всем этим ссылкам еще до того, как писать сюда.

WRG ★★★★
( 26.05.15 16:15:21 MSK ) автор топика

Просто ничего не меняй, оставь код на C++, получится нечитаемое месиво

stevejobs ★★★★☆
( 26.05.15 16:17:47 MSK )

EXL ★★★★★
( 26.05.15 16:18:27 MSK )
Ответ на: комментарий от stevejobs 26.05.15 16:17:47 MSK

есть такой тезис: «жабу придумали для того, чтобы аккумулировать ту массу низкоквалифицированных программистов, которая не способна красиво, быстро и качественно писать код на c++», а остальная часть программистов способна, так что худей дальше, сайтекопейсатель

anonymous
( 26.05.15 16:25:27 MSK )
Ответ на: комментарий от stevejobs 26.05.15 16:17:47 MSK

Ну не у всех же руки из жопы, как у тебя.

anonymous
( 26.05.15 16:35:00 MSK )
Ответ на: комментарий от deep-purple 26.05.15 15:59:17 MSK

Да, теперь я понимаю проприетарщиков. Им просто стыдно!

Hurenweibel ★★
( 26.05.15 16:43:20 MSK )
Ответ на: комментарий от anonymous 26.05.15 16:35:00 MSK

Тогда они могут переписать свое нечитаемое C++ говно на Эрланг. Это гарантированно будет финиш.

stevejobs ★★★★☆
( 26.05.15 16:44:49 MSK )
Ответ на: комментарий от stevejobs 26.05.15 16:17:47 MSK

Просто ничего не меняй, оставь код на C++, получится нечитаемое месиво

Я знал, что ява атрофирует мозг 🙂

andreyu ★★★★★
( 26.05.15 16:48:52 MSK )

Первый коммент и аноны жгут.
А вообще, еще добавлю: комментарии и переменные на боярском. Еще можно пробелы и прочее убрать

sehellion ★★★★★
( 26.05.15 17:08:14 MSK )

С моей точки зрения, ничего делать не нужно. Просто пиши код на С++. И он уже будет нечитаемым месивом.

Eddy_Em ☆☆☆☆☆
( 26.05.15 17:16:36 MSK )

Я бы просто заменил имена всех именованных объектов, ключая переменную цикла ‘i’ на sha512 от имени этих объетов. Форматирование-то восстановить не проблема.

anonymous
( 26.05.15 17:36:38 MSK )
Ответ на: комментарий от stevejobs 26.05.15 16:44:49 MSK

Если любое говно перевести на ерланг — будет эталон читабельности

Oxdeadbeef ★★★
( 26.05.15 17:44:33 MSK )
Ответ на: комментарий от EXL 26.05.15 16:18:27 MSK

Если тебе с этим кодом приходится работать, то соболезную.

kravich ★★★★
( 26.05.15 17:51:44 MSK )
Ответ на: комментарий от EXL 26.05.15 16:18:27 MSK

Stil ★★★★★
( 26.05.15 19:03:18 MSK )
Ответ на: комментарий от Stil 26.05.15 19:03:18 MSK

Вот что то такое я и хочу получить на выходе. Меня бы устроила расстановка случайных отступов, удаление переносов строк, и вообще наведение безобразия. Да, astyle исправит всё это, но тот кому надо передать код не знает про astyle, и, скорее всего, никогда не узнает, ровно как и не разберется в нём. Готового решения пока не отыскалось, придется велосипедить что нибудь на коленке.

WRG ★★★★
( 26.05.15 19:23:54 MSK ) автор топика
Последнее исправление: WRG 26.05.15 19:24:43 MSK (всего исправлений: 1)

Ответ на: комментарий от Oxdeadbeef 26.05.15 17:44:33 MSK

Эталон читабельности – это лиспы (CL, Схема, Кложура), и семейство ML.
Изучаю C#, я не могу. Хорошие языки развратили до того, что C-подобный код вызывает отвращение.
Так и изучаю, через не могу.

Hertz ★★★★★
( 26.05.15 19:27:32 MSK )
Последнее исправление: Hertz 26.05.15 19:27:46 MSK (всего исправлений: 1)

Прячем JavaScript-код на фронтенде от посторонних

Как защитить ваш уникальный код от копирования с помощью веб-сокетов, крипторов, обфускации и других методов? Разбираемся, как защитить код на JavaScript.

Обложка поста Прячем JavaScript-код на фронтенде от посторонних

Рассказывает веб-разработчик Денис Лисогорский

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

Давайте представим ситуацию, когда вы и ваша команда пишете интересный и сложный код на JavaScript. Причём этот код в кратчайшие сроки нужно использовать в проекте. Если его функциональность действительно уникальна, то в процессе разработки и у вас, и у членов команды вполне резонно возникнет вопрос: «Как защитить код от копирования?».

Как защитить код: веб-сокеты, крипторы и обфускация

Разумеется, все мы прекрасно понимаем, что JavaScript выполняется на стороне браузера. И любой зашифрованный код всегда можно расшифровать, если знать принципы работы браузера. Поэтому можно попробовать лишь затруднить понимание данного кода, а это, в свою очередь, очень сильно помешает злоумышленнику модифицировать его под свои нужды.

Итак, есть несколько вариантов защиты кода:

  1. Использовать веб-сокеты.
  2. Использовать крипторы.
  3. Сделать обфускацию кода.

Крипторы приводят код в нечитаемый вид, используя, как правило, base64 (что неизбежно приводит к увеличению объёма кода примерно на 30%). Затем к полученному результату прибавляется так называемая «соль» — набор символов, который при разборе кода функцией-дешифровщиком используется в качестве ключа. Ну а потом вся строка кода обычно выполняется через eval(). Проблема крипторов в том, что если понять принцип их работы, отсечь «соль» и декодировать, то сразу становится доступен весь код в его исходном виде.

Обфускаторы же изменяют сам код, вставляя между операторами нечитаемые символы, меняя имена переменных и функций на набор визуально непонятных символов. При этом объём кода также сильно увеличивается из-за вставки дополнительного псевдокода, а также замены символов на hex, когда любые символы переводятся в их hex-значения (например, латинская буква ‘e’ может быть записана как ‘\x65’, причём это прекрасно интерпретируется любым браузером). Можете посмотреть, как работает перевод в hex через любой сервис Text To Hex, например на Crypt Online.

Применение обфускаторов сильно усложняет дальнейшую отладку кода, поскольку это необратимый процесс. К тому же в некоторых случаях они могут повлиять на функциональность кода. Попробовать обфускаторы можно на любом сервисе обфускации, к примеру этом или этом. Также в Сети можно найти платные крипторы-обфускаторы, в настройках которых вы сможете указывать степень защиты, время жизни скрипта и прочее, при этом скрипт будет намертво привязан к вашему домену, т.е. для дешифровки будет использоваться уникальное для вашего хоста значение. Стоимость таких крипторов начинается от 45 $. Кроме этого, перед обфускацией вы можете предварительно минимизировать код, заменив все имена переменных и функций на их односимвольные синонимы. Отличный и очень популярный инструмент на Node.js — UglifyJS, который работает как в автоматическом режиме (скажем, через Gulp), так и в режиме командной строки.

Также есть всем известный Closure Compiler от Google, который кроме минимизации анализирует JavaScript-код, удаляет мёртвый код, переписывает и сводит к минимуму то, что осталось. Он также проверяет синтаксис, ссылки на переменные и типы и предупреждает об общих ошибках JavaScript. Имеет хорошо документированный API.

Кроме предложенных методов можно сделать следующее:

  • использовать WebStorage и скрывать там JavaScript код;
  • прятать часть кода в отдельном файле на сервере и вызывать его через XMLHttpRequest ;
  • использовать побитовые операторы для замены чисел на наборы скобок и знака ~ ;
  • делать субституцию стандартных функций и методов JavaScript.

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

Зашифровка кода на примере JavaScript-калькулятора

Не так давно я разработал JavaScript-калькулятор для расчёта стоимости услуг, с большим количеством взаимосвязанных параметров. Руководство поставило задачу защитить данный скрипт от копирования, чтобы конкуренты не смогли использовать его на своих сайтах. Искал различные решения, ничего подходящего не нашёл, поэтому начал писать собственное. Представляю его ниже.

Обращаю ваше внимание на то, что любой код можно расшифровать, просто для этого нужно время. Поэтому данное решение, разумеется, не идеально. Тем не менее, чтобы его раскрыть, требуется время, внимательность и усидчивость. И это может оттолкнуть ваших конкурентов от идеи скопировать ваш скрипт. Большинство из них после нескольких неудачных попыток просто будут искать аналог похожего скрипта на других ресурсах.

По итогам работ в браузере вы увидите нечто такое:

При этом все зашифрованные скрипты будут работать корректно. Опытный взгляд программиста сразу визуально определит кодирование через base64. Но при попытке расшифровать строку любым base64 декодером, будет ошибка. Если вставить скрипт в alert (такой метод также рекомендуют на форумах для дешифровки кода), то результат также будет нулевым.

При этом никто ведь не знает, что здесь зашифрован именно скрипт. Это может оказаться какой-то параметр, текст или изображение. Через base64 можно зашифровать всё что угодно.

Поищем в коде функцию glob() , которой передаётся шифрованная строка. Вот она: glob=function(s)

Видим ещё несколько функций sfd() и rty() . Ищем эти функции. Вот они:

sfd=this["\x65\x76\x61\x6C"];rty=this["\x61\x74\x6F\x62"]; 

На этом месте многие закончат попытки расшифровки и оставят ваш сайт в покое.

Рассмотрим алгоритм подробнее.

Как защитить JavaScript от копирования на своём сайте

Первым делом указываем в футере сайта путь на скрипт и тут же кодируем его:

В строке выше мы говорим интерпретатору PHP взять файл script.js, далее закодировать его через base64, прибавить строку ‘K’ и всё это записать в переменную $filebase64 .

Добавление строки ‘K’ (это может быть любая латинская буква или комбинация букв или цифр) защищает нас от того, что желающий скопировать ваш скрипт расшифрует его с помощью alert() или онлайн-дешифратора. Ведь с дополнительными символами скрипт не будет работоспособен.

Затем где-то дальше в коде вызываем скрипт:

Пусть этот скрипт вызывается отдельно, подальше от других скриптов и ссылок на скрипты.

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

sfd=this["\x65\x76\x61\x6C"];rty=this["\x61\x74\x6F\x62"];glob=function(s)

Разбираем подробно что здесь происходит.

Наша основная функция glob() принимает один параметр s . Он сразу передаётся функции substring() с параметром -~[] (это равно 1 в зашифрованном виде), которая извлекает из s строку начиная с первого символа и до конца. Следовательно, если мы в PHP-коде в качестве строки прибавляли более одного символа, скажем три, то нам нужно будет в функции substring() указать 2+(-~[]) . Либо путём шифрования цифр через побитовые операторы мы можем создать запутанную формулу, часть переменных которой мы можем прятать в cookies или sessionStorage, что сделает крайне затруднительным понимание того, какое количество символов необходимо отбросить для дешифровки кода.

Пример замены цифр через побитовый оператор ~ :

  • -1 можно заменить на ~[]
  • 1 можно заменить на -~[]
  • 0 можно заменить на ~~[]

Далее полученный результат принимает функция rty() . Эта функция представляет собой набор символов, в частности: this[«\x61\x74\x6F\x62»] ;

Попробуйте ввести это в консоли браузера и вы увидите, что на самом деле делает эта функция. Например, вы увидите:

Т.е. набор символов — это зашифрованная функция atob() , которая, согласно описанию на MDN, декодирует строку, закодированную с использованием base64.

Результат декодирования получает функция sfd() . Она также представляет собой набор символов: this[«\x65\x76\x61\x6C»]; .

Вы уже догадались, что нужно сделать? ? Выполните в консоли браузера и вы увидите:

Здесь, думаю, уже объяснять ничего не надо. Все мы знаем, что функция eval() выполняет скрипт, полученный из строки. «Плохая практика», как сказали бы многие, для обычного кода, но в нашем случае это безопасная и нужная функция для реализации нашей идеи. К тому же напрямую к этой функции пользователь не сможет получить доступ.

Наверное, вы задались вопросом, а каким же образом функции зашифрованы в наборе символов? Очень просто: набор символов — это текст, преобразованный в шестнадцатеричную систему счисления. Т.е. это текст в формате hex (hexadecimal), в котором можно зашифровать любые символы.

Таким образом, наша расшифрованная функция выглядит так (специально разбил по строчкам, чтобы было наглядно):

glob = function(s)

В итоге отбрасываем первый символ шифрованной строки (при этом символов может быть хоть 353, и об этом никто не сможет быстро догадаться), потом дешифруем, потом выполняем через eval() .

Вы можете пойти и дальше. Если каким-то образом кто-то всё же расшифрует ваш скрипт, немного усложните его, чтобы людям было сложнее модифицировать его. Например, можно поговорить о побитовом операторе ^ , c помощью которого можно творить чудеса. Например, a^b^b будет равно a . В качестве b может быть использован ключ, который мы зашифруем где-то выше…

Всё будет работать как и раньше, но собьёт с толку нехороших копипастеров.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

За материал благодарим нашего подписчика Дениса Лисогорского

Следите за новыми постами по любимым темам

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

Как сделать код нечитаемым

Введение
Не ищите злой умысел там, где все можно объяснить глупостью.
Наполеон

В интересах создания рабочих мест в области Java-программирования я передаю эти подсказки мастеров о том, как писать код, настолько трудный для поддержки, что у людей, пришедших после вас, уйдут годы на внесение даже малейших изменений. Более того, скрупулезно следуя всем этим правилам, вы гарантируете себе пожизненное рабочее место, так как никто кроме вас не сможет разобраться в этом аду. При достаточной дотошности, использовав все правила, даже вы не сможете поддерживать собственный код.
Тем не менее, не стоит увлекаться. Ваш код должен не выглядеть безнадежным, а всего лишь быть таким. Иначе есть опасность, что код перепишут или устроят ему рефакторинг.

Общие принципы
Quidquid latine dictum sit, altum sonatur.
(Что угодно, сказанное по-латински, звучит как мудрость.)

Чтобы помешать программисту, поддерживающему ваш код, вы должны понять способ его мышления. У него есть ваша гигантская программа. У него нет времени даже прочесть ее, не то чтобы понять хоть что-то. Он хочет быстро найти место, где надо сделать изменение, сделать его и добиться отсутствия побочных эффектов от этого.
Он видит ваш код через замочную скважину. Он может видеть только малую часть вашей программы. Вы должны удостовериться, что он никогда не сможет составить из этих частей общую картину. Вы хотите сделать поиск нужного кода для него как можно более сложным. Более того, вы хотите сделать так, чтобы он не мог спокойно игнорировать остальной код.
Программистам упрощают жизнь соглашения. Каждый раз, понемногу нарушая их, вы заставляете его читать каждую строку вашего кода через увеличительное стекло.
Любой языковой конструкцией можно злоупотребить так, чтобы она сделала код нечитаемым.

Имена
— Когда _я_ беру слово, оно означает то, что я хочу, не больше и не меньше, — сказал Шалтай-Болтай презрительно.
Льюис Кэрролл, «Алиса в Зазеркалье», Глава 6.

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

Новое применение детских имен.Купите книгу для выбора имени ребенка, и у вас никогда не будет проблемы «как назвать переменную». Fred — отличное имя и печатается легко. Так же можно использовать другие простые для клавиатуры названия — asdf или aoeu, если вы используете DSK-клавиатуру.

Однобуквенные названия переменных.Если вы назовете ваши переменные a, b, c, их упоминания в коде будет невозможно найти с помощью поиска в текстовом редакторе. Кроме того, никто не сможет догадаться, для чего они нужны. Если кто-нибудь намекнет вам, что можно нарушить традицию времен FORTRAN-а именовать переменные-индексы i, j, k, заменив их ii, jj и kk — напомните им, что с еретиками делала Инквизиция.

Творческое использование ошибок.Если вы вынуждены использовать осмысленные названия переменных и функций, делайте в них орфографические ошибки. Делая ошибки в одних названиях и не делая в других (например, SetPintleOpening и SetPintalClosing), можно сделать невозможным использование grep и поиска в IDE. Это работает на удивление хорошо. Можно также использовать слова на разных языках или разные варианты написания одного и того же слова.

Используем абстракции.Придумывая названия функций и переменных, часто используйте абстрактные слова, такие как it, everything, data, handle, stuff, do, routine, perform, а так же цифры, например routineX48, PerformDataFunction, DoIt, HandleStuff и do_args_method.
.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *