Ты, вероятно, читал мои статьи про различные способы обфускации. Среди описанных мною методов встречаются даже весьма курьезные. Понятное дело, самый лучший способ скрыть код — когда в итоге его не видно вообще или он замаскирован внутри ложной отвлекающей информации.
Второй случай называется стеганографией. Сегодня же я хочу рассказать о первом случае: когда, открыв код в текстовом редакторе, непосвященный юзер видит на его месте... пустое ничего. Да, такое действительно бывает: существуют методы обфускации, после которых вместо привычной мешанины случайных символов получается визуально пустое место, как будто код отсутствует вовсе.
Немного поразмыслив, легко догадаться, как достичь подобного эффекта: существует множество служебных символов, визуально не отображаемых текстовыми редакторами, — пробелы, табуляции, всевозможные переводы строк и так далее. Конечно, хакеры, вооруженные шестнадцатеричными редакторами, смеются над подобными ограничениями, но простому пользователю, у которого Hex-редактор вызывает благоговейный ужас и для просмотра по умолчанию настроен какой‑нибудь Wordpad, Notepad или, в самом продвинутом случае, cat, такое кажется своеобразной магией. Особенно если этот самый пользователь привык к модным ныне скриптовым языкам с текстовым кодом типа Python или JavaScript, для которых обфускация как раз наиболее актуальна.
Считается, что впервые подобная идея была высказана в качестве шутки еще в 1997 году создателем С++ Бьёрном Страуструпом, как абсурдный путь эволюции языка С++. Однако в наш безумный век любая странная идея воплощается в реальность, и спустя пять лет Эдвин Брэди и Крис Моррис создали эзотерический язык программирования Whitespace. Собственно, в этом языке впервые и была воплощена концепция невидимости кода в текстовом редакторе.
Для ее реализации в языке оставили всего три значимых символа: пробел (код символа 0x20, обозначаемый создателями как L), табуляция (0x9, T) и перевод строки, Line feed (0xA, S). Остальные символы используются в качестве комментариев, что делает возможным применение кода Whitespace в стеганографии. Как видишь, значимые символы действительно не отображаются в текстовом редакторе, хотя выделяются и редактируются, я уж не говорю про шестнадцатеричные редакторы. Поэтому для наглядности программы на Whitespace записывают последовательностью символов S, T, L или графически, выделяя пробелы от табуляций разными цветами.

Как и все нормальные языки программирования, Whitespace имеет свой синтаксис и свою систему команд: шесть команд манипуляции со стеком (push, dup, copy, swap, discard и slide), пять арифметических команд (add, sub, mul, div и mod), две команды доступа к пулу переменных heap (store и retrieve), семь управляющих команд — куда ж без них (label, call, jmp, jz, jn, ret, exit). Еще есть четыре команды ввода‑вывода (outchar, outnum, readchar и readnum). У команд имеются аргументы — числа и строки в двоичном представлении, где пробел интерпретируется как ноль, а табуляция — единица.
Не буду сильно углубляться в подробности особенностей языка, про него и так написано достаточно статей, с которыми ты можешь ознакомиться самостоятельно, например на Хабре, я же хочу рассказать несколько о другом.
Если называть вещи своими именами, Whitespace — это даже не язык программирования, а байт‑код некоего упрощенного стекового ассемблера. Понятное дело, при всем количестве специализированных IDE, созданных для любителей странного, на полном серьезе писать программу в пробелах, табуляциях и переводах строки ни один психически здоровый человек не сможет (хотя это, похоже, создателями и не задумывалось изначально).
Даже для преобразования с птичьего кода LSSSTSTTS требуется простейший транслятор, а по‑хорошему для «программирования» на таком языке нужен ассемблер. Да и в качестве обфускатора эта концепция не особо подходит, в первую очередь тем, что трансляция с любого современного высокоуровневого объектно ориентированного скриптового языка на подобный стековый ассемблер достаточно трудоемка и требует большого объема кода (который, к несчастью, прекрасно видим в текстовом редакторе и неиллюзорно тормозит при работе).
Тем не менее программистская общественность в свое время была так впечатлена этим языком, что создала реализации интерпретатора Whitespace на многих популярных языках: например, на JavaScript, Python и даже на Ruby.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
