stihl не предоставил(а) никакой дополнительной информации.
Представь: открываешь файл с кодом в текстовом редакторе — и видишь абсолютно пустое место, хотя скрипт прекрасно выполняется. Такая обфускация действительно существует. В этой статье мы изучим магические приемы, заставляющие код исчезать прямо у нас перед глазами. Ты увидишь, как современные обфускаторы используют эту идею, чтобы превратить обычный скрипт в пустоту, сохраняя его работоспособность.
Ты, вероятно, читал Для просмотра ссылки Войдиили Зарегистрируйся про различные способы обфускации. Среди описанных мною методов встречаются даже Для просмотра ссылки Войди или Зарегистрируйся. Понятное дело, самый лучший способ скрыть код — когда в итоге его не видно вообще или он замаскирован внутри ложной отвлекающей информации.
Второй случай называется Для просмотра ссылки Войдиили Зарегистрируйся. Сегодня же я хочу рассказать о первом случае: когда, открыв код в текстовом редакторе, непосвященный юзер видит на его месте... пустое ничего. Да, такое действительно бывает: существуют методы обфускации, после которых вместо привычной мешанины случайных символов получается визуально пустое место, как будто код отсутствует вовсе.
Немного поразмыслив, легко догадаться, как достичь подобного эффекта: существует множество служебных символов, визуально не отображаемых текстовыми редакторами, — пробелы, табуляции, всевозможные переводы строк и так далее. Конечно, хакеры, вооруженные шестнадцатеричными редакторами, смеются над подобными ограничениями, но простому пользователю, у которого Hex-редактор вызывает благоговейный ужас и для просмотра по умолчанию настроен какой‑нибудь Wordpad, Notepad или, в самом продвинутом случае, cat, такое кажется своеобразной магией. Особенно если этот самый пользователь привык к модным ныне скриптовым языкам с текстовым кодом типа Python или JavaScript, для которых обфускация как раз наиболее актуальна.
Считается, что впервые подобная идея была высказана в качестве шутки еще в 1997 году создателем С++ Бьёрном Страуструпом, как абсурдный путь эволюции языка С++. Однако в наш безумный век любая странная идея воплощается в реальность, и спустя пять лет Эдвин Брэди и Крис Моррис создали эзотерический язык программирования Для просмотра ссылки Войдиили Зарегистрируйся. Собственно, в этом языке впервые и была воплощена концепция невидимости кода в текстовом редакторе.
Для ее реализации в языке оставили всего три значимых символа: пробел (код символа 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 на многих популярных языках: например, на Для просмотра ссылки Войдиили Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся и даже на Для просмотра ссылки Войди или Зарегистрируйся.
Вернемся все‑таки к реальным обфускаторам‑невидимкам. Идея, заложенная в Whitespace, приглянулась очень многим. Было бы здорово преобразовать произвольный текстовый код в вид, не отображаемый в текстовом редакторе, чтобы сам файл оставался исполняемым и, по возможности, самодостаточным и содержащим минимальное количество исполняемого кода. Наиболее простой и быстрый вариант реализации подобной хотелки — посимвольное преобразование текста скрипта в двоичный код с последующей заменой единиц и нулей неотображаемыми символами. Например, для Perl существует проект Для просмотра ссылки Войдиили Зарегистрируйся. Он не совсем самодостаточен, требует подключения соответствующей библиотеки, хотя кода в ней немного и при желании его можно внедрить в исполняемый модуль. После обфускации код (в этом примере print "Hello world"
в текстовом редакторе выглядит следующим образом.
Для просмотра ссылки Войдиили Зарегистрируйся
При просмотре в шестнадцатеричном формате видно, что содержимое файла — побитово закодированный текст, где 0 — табуляция, а 1 — пробел, символы разделены переводом строки.
Для просмотра ссылки Войдиили Зарегистрируйся
Этот алгоритм прекрасно подходит для стеганографии, что показывает пример внедрения его в псевдофайл на C.
Для просмотра ссылки Войдиили Зарегистрируйся
Естественно, идею подхватили и адепты других языков — шутники умудрились внедрить код расшифровщика на JavaScript в исполняемый файл и минимизировать его аж до 116 байт! Встречаем проект Для просмотра ссылки Войдиили Зарегистрируйся. Как видишь, расшифровщик совсем простой, занимает всего одну верхнюю строку, а остальной код невидим.
Алгоритм кодировки текста такой же, как и в предыдущем случае, однако тут разработчики исхитрились еще сильнее — в качестве 0 и 1 вместо банальных табуляции и пробела они использовали стандартный и полуширинный заполнители хангыля (1 - U+FFA0 HALFWIDTH HANGUL FILLER; 0 U+3164 HANGUL FILLER).
Для просмотра ссылки Войдиили Зарегистрируйся
Выглядит это прикольно, однако такой код уже нельзя использовать для стеганографии (на самом деле можно, но несколько сложнее; подумай сам на досуге, как это сделать). А главное, кодировка стала 16-битной, то есть в неюникодных текстовых редакторах код уже отображается, да и занимать стал в два раза больше. Что, впрочем, для нас скорее плюс, чем минус.
Надо отметить, что, похоже, вирусописатели уже давно взяли этот прием обфускации на вооружение. Косвенным подтверждением этому служит то, что я изрядно намучился со встроенным в Windows защитником, пытаясь скопировать и сохранить в файл код с последнего скриншота. Глупый виндовый антивирус упорно видел в куске текста объемом 600 с лишним байт критическую угрозу (Trojan:HTML/Msphish.GX!MTB) и сразу помещал его в карантин, что как бы намекает на существование троянов, обфусцированных подобным образом.
Если такой фокус можно провернуть на JavaScript, то почему нельзя на Python? Подобным вопросом вдохновился Келси Хайтауэр и через год создал проект Для просмотра ссылки Войдиили Зарегистрируйся. В нем эксплуатируется одна из специфических особенностей Python — этот язык позволяет создавать и подключать собственные обработчики кодировки символов. Кодировка указывается в самой первой строке файла директивой # coding:, после чего следует код в выбранной кодировке.
Автор создал собственную кодировку no, состоящую на этот раз из «нулеширинных пробелов» (Zero Wide Spaces) Для просмотра ссылки Войдиили Зарегистрируйся и Для просмотра ссылки Войди или Зарегистрируйся. Эти символы имеют серьезное преимущество перед используемыми в проекте INVISIBLE.js заполнителями хангыля — они не только не отображаются визуально, но и не выделяются курсором, что производит на неокрепшие умы полное впечатление пустого файла (разумеется, этот эффект наблюдается только в юникодных текстовых редакторах).
Для просмотра ссылки Войдиили Зарегистрируйся
Как видишь, файл получается со смешанной кодировкой, что еще сильнее увеличивает его размер, однако позволяет прятать невидимые куски кода между открытыми.
Для просмотра ссылки Войдиили Зарегистрируйся
К сожалению, как ты уже, наверное, догадался, главный недостаток такого способа — код получается несамодостаточный, для его работоспособности придется устанавливать в Python пакет no-code, что, конечно, сильно демаскирует эффект от обфускации. Впрочем, как я уже писал в Для просмотра ссылки Войдиили Зарегистрируйся, все упомянутые проекты, как и эзотерические языки, делались не для практического применения, а «для души», как оригинальное и остроумное произведение искусства. Что, впрочем, не мешает нам при их разборе набираться практического опыта для создания собственных обфускаторов. Или борьбы с ними.
Ты, вероятно, читал Для просмотра ссылки Войди
Второй случай называется Для просмотра ссылки Войди
Немного поразмыслив, легко догадаться, как достичь подобного эффекта: существует множество служебных символов, визуально не отображаемых текстовыми редакторами, — пробелы, табуляции, всевозможные переводы строк и так далее. Конечно, хакеры, вооруженные шестнадцатеричными редакторами, смеются над подобными ограничениями, но простому пользователю, у которого Hex-редактор вызывает благоговейный ужас и для просмотра по умолчанию настроен какой‑нибудь Wordpad, Notepad или, в самом продвинутом случае, cat, такое кажется своеобразной магией. Особенно если этот самый пользователь привык к модным ныне скриптовым языкам с текстовым кодом типа Python или JavaScript, для которых обфускация как раз наиболее актуальна.
Считается, что впервые подобная идея была высказана в качестве шутки еще в 1997 году создателем С++ Бьёрном Страуструпом, как абсурдный путь эволюции языка С++. Однако в наш безумный век любая странная идея воплощается в реальность, и спустя пять лет Эдвин Брэди и Крис Моррис создали эзотерический язык программирования Для просмотра ссылки Войди
Для ее реализации в языке оставили всего три значимых символа: пробел (код символа 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 на многих популярных языках: например, на Для просмотра ссылки Войди
Вернемся все‑таки к реальным обфускаторам‑невидимкам. Идея, заложенная в Whitespace, приглянулась очень многим. Было бы здорово преобразовать произвольный текстовый код в вид, не отображаемый в текстовом редакторе, чтобы сам файл оставался исполняемым и, по возможности, самодостаточным и содержащим минимальное количество исполняемого кода. Наиболее простой и быстрый вариант реализации подобной хотелки — посимвольное преобразование текста скрипта в двоичный код с последующей заменой единиц и нулей неотображаемыми символами. Например, для Perl существует проект Для просмотра ссылки Войди
Для просмотра ссылки Войди
При просмотре в шестнадцатеричном формате видно, что содержимое файла — побитово закодированный текст, где 0 — табуляция, а 1 — пробел, символы разделены переводом строки.
Для просмотра ссылки Войди
Этот алгоритм прекрасно подходит для стеганографии, что показывает пример внедрения его в псевдофайл на C.
Для просмотра ссылки Войди
Естественно, идею подхватили и адепты других языков — шутники умудрились внедрить код расшифровщика на JavaScript в исполняемый файл и минимизировать его аж до 116 байт! Встречаем проект Для просмотра ссылки Войди
Алгоритм кодировки текста такой же, как и в предыдущем случае, однако тут разработчики исхитрились еще сильнее — в качестве 0 и 1 вместо банальных табуляции и пробела они использовали стандартный и полуширинный заполнители хангыля (1 - U+FFA0 HALFWIDTH HANGUL FILLER; 0 U+3164 HANGUL FILLER).
Для просмотра ссылки Войди
Выглядит это прикольно, однако такой код уже нельзя использовать для стеганографии (на самом деле можно, но несколько сложнее; подумай сам на досуге, как это сделать). А главное, кодировка стала 16-битной, то есть в неюникодных текстовых редакторах код уже отображается, да и занимать стал в два раза больше. Что, впрочем, для нас скорее плюс, чем минус.
Надо отметить, что, похоже, вирусописатели уже давно взяли этот прием обфускации на вооружение. Косвенным подтверждением этому служит то, что я изрядно намучился со встроенным в Windows защитником, пытаясь скопировать и сохранить в файл код с последнего скриншота. Глупый виндовый антивирус упорно видел в куске текста объемом 600 с лишним байт критическую угрозу (Trojan:HTML/Msphish.GX!MTB) и сразу помещал его в карантин, что как бы намекает на существование троянов, обфусцированных подобным образом.
Если такой фокус можно провернуть на JavaScript, то почему нельзя на Python? Подобным вопросом вдохновился Келси Хайтауэр и через год создал проект Для просмотра ссылки Войди
Автор создал собственную кодировку no, состоящую на этот раз из «нулеширинных пробелов» (Zero Wide Spaces) Для просмотра ссылки Войди
Для просмотра ссылки Войди
Как видишь, файл получается со смешанной кодировкой, что еще сильнее увеличивает его размер, однако позволяет прятать невидимые куски кода между открытыми.
Для просмотра ссылки Войди
К сожалению, как ты уже, наверное, догадался, главный недостаток такого способа — код получается несамодостаточный, для его работоспособности придется устанавливать в Python пакет no-code, что, конечно, сильно демаскирует эффект от обфускации. Впрочем, как я уже писал в Для просмотра ссылки Войди
