Pull to refresh

Comments 57

Таких символов много, но есть нюанс. Он заключается в том, что многие символы все равно отображаются в том или ином редакторе. Подобрать «правильный» набор — это не такая уж и простая задача.
В данном случая я думал о браузерах — можно «подписывать» текст в закрытых системах, а потом смотреть кто стырил.
Приношу извинения, пробежался по ссылке очень быстро в поисках предложенного вами символа и не уловил основной идеи поста. На самом очень интересное предложение, спасибо за идею!
Спасибо, очень интересно, сам копаю с разной периодичностью тему скрытия javascript'a от отладчиков (не потому что алгоритмы прямо такие особые или какой-нибудь вредонос, а просто открывать исходники всяким кулцхакерам в моем случае не хочется), но далеко увы не ушел. Обычно если спросить на эту тему людей — все скажут в один голос — нельзя ничего скрыть. Но это конечно не совсем правда и скрыть можно, правда с невеликой эффективностью.
Первая проблема — это скрыть от отладчика, ибо из исходников код убрать не представляет никакой сложности.
Ну а вторая проблема — это не дать влезать в процесс исполнения кода. Потому что есть простая хитрость — берем и прерываем выполнения кода в отладчике. И все, весь код сразу как на ладони, при условии что какой-то скрипт выполняется постоянно (у меня — отрисовка графики).
Действительно, самая большая проблема — отладчик, он позволяет подсмотреть все, что происходит. Но тут вопрос в том, какая задача перед вами стоит. Если вы не хотите показывать как реализована та или иная функция — это одно, но если вы хотите сделать так, чтобы скопированный код был бы не поддерживаем, имел встроенные «закладки» в виде, например, «демо-версия, купить тут» — то места для маневра становится больше.

Можно, например, разделить модуль на несколько файлов и чтобы основной модуль загружал оставшиеся части закодированные в битом base64, а с помощью невидимого кода «восстанавливать» код и дальше его распаковывать. (Пробовал такой вариант, но он очень сырой вышел). При этом сервер может каждый раз передавать разные варианты файла, что еще больше осложнит «сборку» вашего модуля на другом сервере. Да и в результате «кулхацкеры» все равно получат в руки кусок неподдерживаемого кода, который еще надо «завести» практически вслепую.
Угу, примерно так я и собираюсь делать.
У меня задача — скрыть насколько это возможно реализацию протокола обмена с сервером (игра у меня сетевая), чтобы усложнить создание консольных клиентов. На код отрисовки графики или большую часть игровой логики (которой на клиенте почти нет) мне вообщем-то плевать, ничего особо ценного в нем нет.

Но да, самый лучший вариант — это и правда осложнить капитально сборку кода на другом сервере.

Я однажды этим занимался, восстанавливал вслепую обфусцированый код одного китайского проекта и скажу по опыту, что это ололо как сложно, особенно если в этот код еще подмешаны все внешние библиотеки, включая графику (там был three.js — я смог восстановить почти весь код только потому что хорошо знаю эту библиотеку, названия методов, классов и прочее).

Буквально приходилось догадываться что где что — так что даже просто хорошая обфускация затрудняет взлом очень сильно. А если еще навесить скрытый код, еще прикрутить правила для сервера на отдачу скриптов только с определенного url и домена (если копипастишь — копипастить придется из браузера) и так далее, то разобрать это все конечно возможно, но становится явно сложно.
Сам когда-то пытался восстановить обфусцированный от души код… Несколько часов ковыряния в коде позволили убрать (именно вырезать) проблемную часть. При этом как-то модифицировать функционал — едва возможно без нервного срыва.

А если еще навесить скрытый код, еще прикрутить правила для сервера на отдачу скриптов только с определенного url и домена (если копипастишь — копипастить придется из браузера) и так далее, то разобрать это все конечно возможно, но становится явно сложно.

Разобрать, конечно, возможно. Но это когда «кулхацкер» разберется во всех премудростях и хитросплетениях. И когда он поймет, что открытый через строку браузера файл /js/awesome-module.js уже давно не такой, с которым умеет работать /js/awesome-init.js — задумается, стоит ли все это разбирать или может лучше написать все самому с нуля?
Есть другая проблема, которую я пока не знаю как решить — как сделать обфускацию, которая _не будет_ ломать весь код? Если точнее сказать, какие участки кода наиболее подвержены поломки обфускацией. У меня последний раз — строки. Обфускатор ломал строковые литералы, меняя что-то в них. И разные другие пакости творил. Сделать обфускатор, который сожмет helloworld — одно, обфусцировать проект далеко не на одну тысячу строк (весь мой движок к примеру) — совсем другое.
Попробуйте использовать для литералов этот самый invisibleJS? Хотя могут возникнуть проблемы при обфускации самой функции «исчезации» — но ведь можно этого и не делать, зато весь остальной код будет работать.
Спасибо за ссылку, действительно — очень похоже, практически на грани, так сказать. Только добавить невидимость.
Похожие методы использовались еще в ZX Spectrum`е — в BASIC-загрузчиках программ (для защиты от взлома).
Делалось это следующим образом:
10 REM [код перехода на символ с координатами 0,0]Текст копирайта, привет от программистов[код белого цвета фона][код белого цвета чернил]: RANDOMIZE USR адрес_куска_машинных_кодов: REM [куча пробелов для последующей записи вместо них машинных кодов]
Далее с помощью прямой записи в память (POKE) строка делалась нулевой, чтоб нельзя было ее вызвать на редактирование, а вместо пробелов записывалась программа в машинном коде — чтоб нельзя было остановить с клавиатуры ее выполнение, и можно было считать следующий файл без заголовка.
В результате если пользователю таки удавалось остановить выполнение загрузчика (например преждевременной остановкой магнитофона) — при попытке сделать LIST он получал только текст-приветствие.
черт! Так вот что это было! Спасибо за разьяснение!
О, да! Там много таких приёмов было. Так как в Бейсике все числа записывались два раза — в человекочитаймой (для быстрого отображения и редактирования) и в машинной (для выполнения), то можно было, исправив «человеческую» запись и не тронув машинную, создавать код в виде:

POKE 0, 0: POKE 0, 0: POKE 0, 0: POKE 0, 0: RANDOMIZE USR 0

записывались не нули и не в нули, естественно.
Любопытно. Хм, интересно, а есть ли такие же «фишки» в других языках программирования?
Собственно, это еще одна из «ловушек» — наравне с нулевой строкой. Потому что даже если попадется пользователь, знающий про нулевые строки и попробует отредактировать такую строку — после редактирования скрытое значение числовой константы перезапишется нулевыми значениями.
Дополню, что это делалось не только для защиты от взлома — в TR-DOS таким образом «упаковывались» все кодовые блоки программы и загрузчик в один BASIC-файл. Машинный код, спрятанный в нулевой строке, грузил данные с дискеты не как файлы, а как блоки секторов — при этом головке дисковода не приходилось ездить на нулевую дорожку за каталогом файлов, чтобы узнать физический адрес начала нужного файла, потом за этим файлом, потом снова на нулевую дорожку за адресом следующего файла… а файлов могло быть много. Вместо этого последовательно грузились сектора в память по нужным адресам. При этом в файловом каталоге создавался только один файл типа B (BASIC) с размером в секторах, равным суммарному объёму всех спрятанных в нём файлов, который было удобно копировать (не потеряешь случайно нужный файл с 10 уровнем игры, например).
Использовался тот факт, что TR-DOS считал такой файл обычным BASIC-файлом и грузил в память не все 200-250 секторов, а только нужные 1-2, ориентируясь на фактический размер BASIC-программы в байтах (один из атрибутов файла), оставалось только взять из его переменных адрес следующего сектора (ещё одна удача, он хранил эту информацию для своих целей!) и вызвать соответствующую низкоуровневую процедуру.

Почти до всего сам догадался в детстве (нулевая строка, трансляция ассемблера в строку комментариев — до сих пор помню адрес — 23872 (если без украшательств, сразу после 0 REM), управляющие символы для форматированного вывода CRACKED BY BILL GILBERT в той же строке комментариев, упаковка игры в «раздутый» B-файл), вот только PRINT USR 0 (выше про него есть комментарий) вводил меня в ступор. Каково же было разочарование, когда узнал, что ничего нового я не придумал, и другие делали задолго до меня точно так же :)
Кто знает, может быть весь интернет уже давно напичкан такими сообщениями? :)
После этого ожидал увидеть такое сообщение в посте — проверил, но не нашёл.

⁡‏‌‍⁡⁡‍⁡⁡‏‏‍⁡‏‎⁡⁡‏‎⁡‏‎⁡‏‎⁡⁡‍⁡⁡‏‏‌⁡‏‎⁡‏‏‎⁡‏‏‬⁡‏‎⁡⁡‏‎‪⁡⁡‍⁡⁡‏‎⁡‏‏‌⁡‏‏‍⁡‏‎⁡⁡‏‪‌⁡‏‏‍⁡‏‏‌⁡‏‏⁡⁡‍⁡⁡‏‎⁡‏‎‭⁡‏‏‭⁡‏‏⁡⁡‍⁡⁡‏‎⁡‏‏‌⁡‏‏‍⁡‏‎⁡⁡‏‎‍⁡‏‎‭⁡‏‏‍⁡‏‏⁡⁡‍⁡⁡‏‏‌⁡‏‎‍⁡‏‎⁡‏‪‌⁡⁡‍⁡⁡‏‏‌⁡‏‎⁡‏‎‌⁡‏‏‌⁡‏‏‍⁡‏‎‍⁡‏‎‪⁡‏‎⁡‏‎⁡‏‎⁡‏‎‪⁡⁡‍⁡⁡‏‎⁡‏‎⁡‏‏‌⁡‏‎⁡‏‎⁡⁡‏‎⁡‏‎‭⁡‏‎‪⁡⁡‎⁡⁡‍⁡⁡⁡‏‭⁡⁡‫‪⁡⁡‫⁡⁡‫⁡⁡‫⁡⁡‍⁡⁡⁡‍‭⁡⁡‫‭⁡⁡‫‮⁡⁡‫‏⁡⁡‫‏⁡⁡‫‪⁡⁡‫⁡⁡‍‮⁡⁡‍⁡⁡⁡‬‬⁡⁡‫⁡⁡‬‍⁡⁡‫⁡⁡‫‏⁡⁡‍‌
Специально закладку не делал, но в примере «Привет, как дела⁡⁡‍⁡⁡‍⁡⁡‏‏‌⁡‏‎‪⁡‏‎‎⁡‏‎⁡‏‎‏⁡‏‎⁡‏‏⁡⁡‍⁡⁡‏‎‍⁡⁡‍⁡⁡‏‎⁡‏‏⁡‏‏‍⁡‏‏⁡⁡‍⁡⁡‍⁡⁡‏‎⁡‏‏⁡⁡‏‎‭⁡‏‏‪⁡‏‎⁡‏‎‏⁡‏‎‭⁡⁡‍⁡⁡‏‎⁡‏‎‏⁡‏‎‭⁡‏‎?» — все есть. Даже в этом комменте.
Опера 12 показывает, что что-то не так (слишком большое расстояние между «а» и "?"):
Хорошее наблюдение, значит надо вставлять невидимые символы в конце строк, чтобы не было заметно подвоха.
Если эти символы будут в конце строки, высока вероятность того, что при выделении они не будут захвачены. Думаю, лучше всего ставить их перед или после пробела в середине предложения.
Нечто похожее наблюдается и в FF на маке (в FF на линуксе всё ок), только гораздо заметней

В коде
В комменте

Это ещё зависит от шрифта, потому что в примерах кода лишнее свободное пространство не появляется.
Похоже, это зависит от шрифтов в ОС, а не от браузера. У меня Опера 12 под Win 7 ничего необычного не показывает.
Я тоже так считаю: у меня OS X, а так же, судя по комментариям, многие, у кого появляются пробелы, используют OS X.
IE показывает 12 странных квадратиков с непонятным содержимым перед знаком вопроса. Тоже самое показывает в посте. Я еще долго понять не мог, где же тут невидимость.

П.С.О̻͓̹̟͇̺̫ͅн̶̱̮̝͙͔̪̥͖и̲̘̥̣̥͎͚̱͔ ̵͔͈̝̦̺͇͎͙͚п̴̺͙р̡̭͇̥̯̭͖͟͡и̬̜͘д̡̦̦̙͚̳͎̺у̛̻͇̘̩̼̳͉̺т̵̙͍͙̣̪̫̲͍̕ ̵̩̟̯͔̗̗з̝̠͞а̧̡̛̱̹̦̣̩̖̞ͅ ̸̦̰͔̟͘͟т҉͚̥̹̦̳̘͚̀о̢̼б̲͉͝о̸̺̕й̢̨̘̙̦̞̣̠̙̲!̷̪̜̝̟̺̟̬͉ ̷̡̦͈̻̠͓̟С̭͈̙л̴̬̩͔̞̖̭̤͝ͅа̺в̦͈̩̖̻̣͎͇̘̕͟а͘҉̷̮̯̖͓͕̬͓̯ ̳̦͎̝͉̕͘͘ͅю̬̞͉̯̟̲̜͞н̴̼͖̼͍̤͎и̨͓̰к̛̲̭͕̦͕͍̝͢͠о̡̡̤̺̥͉д̘ͅу̶̥̯̮͚̝͔ͅ!̡̘͇͉̀͢ͅ
читаю в мобильном клиенте, и таких квадратиков куча. видимо надо на ноуте потом посмотреть, чтобы понять.
Спасибо за наблюдения! Все возможные варианты браузеров проверить не удалось, виноват.
Интересно, что 12 квадратиков — это только лишь 3 закодированных буквы, а значит все же среди этих квадратиков должны были «затесаться» и невидимые символы. Думаю, что кому захочется сделать все идеально — найдет такую комбинацию, при которой ничего не будет появляться.
Дико извиняюсь за двойной коммент, но в глаза не сразу бросилась пустая строка, а редактировать предыдущий коммент уже поздно. Сам же и попался, что называется. Расшифровал ваше послание. Отправляю ответ: ⁡‏‌⁡‏‎‭⁡‏‏⁡⁡⁡‍⁡⁡‏‎‍⁡⁡‍⁡⁡‏‎⁡‏‎⁡‏‎⁡⁡‏‏‌⁡‏‎⁡‏‎⁡‏‏‌⁡‏‏‍⁡‏‎‪⁡⁡‍‌
Моя винда в юникод не может и все портит, хе-хе.
Скрытый текст
image

Хотя на ноутбуке с линуксом все окей, там юникод настроен.
Оффтоп
А почему Вам предлагают пожаловаться на мой комментарий и только на него?
А я на него случайно курсор навел во время скриншота.
Не могу у себя повторить. Вас не затруднит посмотреть — все ли символы проявились, или все таки есть какие-то, которые остались невидимые? Спасибо.
Для этого надо скопировать все эти квадраты (желательно тройной клик — чтобы выделить всю строку) в какой-нибудь редактор, поставить курсор вначале строки и последовательно, стрелочкой вправо на клавиатуре, двигаться до конца. Если при очередном нажатии вы обнаружите, что мигающий курсор остался на месте — значит там прячется невидимый символ.
Да, много таких. А еще из некоторых позиций курсор не переходит на следующий символ, а перескакивает в начало или конец строки. Или на несколько символов.
Большое спасибо. По поводу перескакивания — интересный эффект, но ничего об этом не знаю, а вот тот факт, что все таки не все символы стали «квадратами» — радует. Возможность остается.
На другой системе (также линукс) у меня на месте ваших невидимых символов появляется палочка:
Скрытый текст
Спасибо за ссылку, но я уже упомянул этот пост в статье, посмотрите внимательно. Кроме того, я указал, что там похожий подход, но без изюминки. В чем заключаются отличия? Собственно, об этом и статья.
ммм… закладки в open-source проектах? ждем волну разоблачений :)
Билл Гилберт и нулевая строка в действии. Теперь на Javascript =))
>Таким образом есть возможность скрытного общения на открытых площадках.
А майоры госбез^W^W кураторы из ZOG точно читают мою почту через веб-клиент? Точно-точно?
Один мой знакомый применял более простой способ скрытия текста в браузере. Установил цвет текста такой же как цвет фона. Таким образом разместил на своей страничке кучу левых кейвордов, чтобы повысить выдачу страницы в поисковиках. В итоге яндекс его вычислил и забанил.
UFO landed and left these words here
А я на мониторе заклеил текст изолентой, тоже ничего не видно. С первого раза получилось, причем я сам это придумал!
Кстати, в Москве многие скрывают текст на автомобильных номерах похожим способом.
Т.е. вы полагаетесь на то, что у тех, кто будет читать код редактор не умеет отображать текст как набор символов?
Минимальные телодвижения в редакторе, и…
Что вы, ни в коем случае. Я в общем-то и не утверждал, что это 100%-ный способ скрыть все и ото всех.

Отвечу несколько на иной вопрос: а зачем это надо вообще? Как правило, те, кто, простите, воруют код, — они либо не обладают должным уровнем опыта и знаний, либо не обладают достаточным временем для реализации того или иного функционала. При первом типе «разработчиков» велика вероятность того, что они даже до вашего примера не дойдут, если вообще поймут что к чему — ведь при первом взгляде — ничего не бросается в глаза, особенно скрытый код. Если говорить о вторых, будут ли они тратить время на исследование кода, расшифровку всех хитросплетений, частичную деобфускацию и так далее, чтобы в результате получить неподдерживаемый код для своего проекта? Не уверен.
Но если у вас стоит цель «распотрошить таки этот код» — вы это, безусловно, сделаете. И ничто вам не помешает. :)
Странно, что никто еще не упомянул JSFuck

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
В принципе, если заменить эти шесть используемых символов на невидимые, то можно получить что-то вроде invisibleJSFuck. Одно плохо, что очень большой объем занимает такой код.
Думаю, пока наиболее актуальным является выкладывание фотографий со скрытым текстом (есть готовое ПО) во всякие галереи, бесплатные хостинги. Потом просто присылаешь ссылочку другу: посмотри, как мы отдыхали в Тайланде. Только очень внимательный параноик будет качать фотки. Если не ошибаюсь, есть еще дополнительная возможность шифрования, когда без знания кода вообще никто не поймет, что внутри что то есть.
Only those users with full accounts are able to leave comments. Log in, please.