The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Mimic - утилита для подмены похожих символов, делающая отладку кошмаром

25.10.2015 10:03

В рамках проекта Mimic реализована утилита для замены символов из набора ASCII на схожие по начертанию символы из таблиц Unicode. Утилита воплощает идею, высказанную одним из разработчиков из компании Twitter, что замена в исходном тексте программы символа точки с запятой (;) на визуально идентичный символ вопроса в греческом алфавите (;) превращает отладку программы в кошмар из-за того, что компилятор начинает указывать на ошибки в, на первый взгляд, корректных участках кода.

Таблицы Unicode содержат множество омоглифов - похожих по начертанию символов. Подобные символы-двойники присутствуют для пробела, восклицательного знака, кавычек, запятых, тире, математических операций, некоторых цифр и различных букв. После обработки утилитой текста, он остаётся визуально идентичен исходному варианту, но на уровне кодов символов содержимое меняется. Кроме режима полной замены, утилитой поддерживается выборочная замена определённого символа и восстановление текста в исходный вид.

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

Дополнение: для Vim подготовлен плагин, подсвечивающий подмену символов в коде.



  1. Главная ссылка к новости (http://developers.slashdot.org...)
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/43196-mimic
Ключевые слова: mimic
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (76) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, bOOster (ok), 10:19, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    Хе. Ну сделаем обратный парсер. Делов то на 5 минут ))
     
     
  • 2.5, A.Stahl (ok), 10:23, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +8 +/
    А нихрена не 5 минут. Слишком от контекста зависит. Вот и думай что было в тексте изначально: точка с запятой и греческий вопросительный знак.
    Обратная задача в общем виде не решаема вообще.
     
     
  • 3.21, виндотролль (ok), 11:34, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    в общем виде — да. Но если известны  начальные условия — имели код с символами ASCII — то решается элементарно.
     
  • 3.23, тоже Аноним (ok), 11:40, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Да ладно. Если речь об исходниках, то обратную замену можно смело делать везде, кроме литералов.
    Внутри них можно применить эвристику: тот греческий знак, например, не имеет смысла, если другой эллиники в документе нет. И слова, в которых кириллица перемешана с латиницей, даже в литералах крайне маловероятны.
     
     
  • 4.61, Аноним (-), 10:51, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > И слова, в которых кириллица перемешана с латиницей, даже в литералах крайне маловероятны.

    https://translate.google.com/#ru/sr/%D1%8F%D0%B7%D1&#

     
     
  • 5.62, тоже Аноним (ok), 11:41, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Хм... туше.
    Однако замена "JE3ИK" на "JЕЗИК" критична только в двух случаях: когда нужен точный битовый паттерн и когда в шрифте нет поддержки кириллицы. Да, согласен, такие случаи вполне возможны.

    С другой стороны, я, признаться, не понял сущности юз-кейса. Как в реальной жизни мне в руки может попасть код, испохабленный таким образом? Да еще и с неизвестным заранее языком на борту?

     
     
  • 6.66, . (?), 16:57, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Да всё правильно. Ну будет у тебя трэш в строках, неприятно, но отладке не помешает никак.
     
  • 6.70, Sinot (ok), 19:11, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Например в примерах на каких-нибудь сайтах-учебниках с "уникальным" контентом. Иногда встречаются сайты с подобной защитой от копирования.
     
  • 3.30, Аноним (-), 12:57, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +18 +/
    надо сначала распечатать, а потом - распознать.
     
  • 3.42, vit (??), 18:22, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    а какая хрен разница. ну заменишь греческий впрос на точку запятой.
    Человек прочитает и не заметит
    а программа скомпилиться

    П_р_им_е_нить

    П_p_им_e_нить

     
     
  • 4.43, vit (??), 18:26, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    //человек разницы не увидет
    a:='Ποιος είσαι εσύ;';
    a:='Ποιος είσαι εσύ;';
     
     
  • 5.64, тоже Аноним (ok), 14:16, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Тот редкий случай, когда действительно имеет смысл поиграть шрифтами ;)
     
  • 3.55, pavlinux (ok), 02:19, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > А нихрена не 5 минут. Слишком от контекста зависит.
    > Вот и думай что было в тексте изначально: точка с запятой и греческий вопросительный знак.

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

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

     
  • 2.69, Elhana (ok), 18:17, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Так в самой утилите есть режим обратной замены.
     

  • 1.2, Аноним (-), 10:21, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А диссернет так можно обойти?
     
     
  • 2.17, serega (??), 11:05, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Зачем?
     
  • 2.20, Аноним (-), 11:31, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > А диссернет так можно обойти?

    Мысли читаешь. Но их представитель говорил, они распознают и похожие.

     
     
  • 3.31, Аноним (-), 12:58, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +4 +/
    После введения запрета на пиратское ПО распознание проводится аспирантами.
     

  • 1.3, A.Stahl (ok), 10:21, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    >может применяться для

    Блин... Теперь придётся писать систему, которая будет приводить всё в нормальный вид из этого говна. А это задачка посложнее будет. На много порядков сложнее.

     
     
  • 2.6, bOOster (ok), 10:23, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    В чем она сложнее то? Тыж не с визуальным отображениями работаешь а с ASCII/UNICODE..
     
     
  • 3.7, A.Stahl (ok), 10:24, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Задача контекстнозависима. Как ты определишь нужен здесь греческий вопрос или точка с запятой?
     
     
  • 4.8, bOOster (ok), 10:28, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Задача контекстнозависима. Как ты определишь нужен здесь греческий вопрос или точка с
    > запятой?

    Аааа, ты в общем контексте? Ну тады да. Я остановился на заголовке новости и применимости этого для исходого кода. А для языков программирования семантика строгая.

     
  • 4.9, Знающий Истину (?), 10:46, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    везде точка с запятой
    .!.  .!.
     
     
  • 5.45, Michael Shigorin (ok), 19:23, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > везде точка с запятой

    Предложил правку, где во втором месте ";" (;) из твита по ссылке.

    Да, тема старая, но только раскинувшаяся шире с юникодом...

     
  • 4.56, pavlinux (ok), 02:27, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Как ты определишь нужен здесь греческий вопрос или точка с запятой?

    В стандарте на язык прописано.  

     
  • 2.19, EHLO (?), 11:25, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +6 +/
    >А это задачка посложнее будет. На много порядков сложнее.

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

    Аналогично можно с кодом поступить: нашел обфускацию, значит либо пасхалочка, либо нафиг такой "продукт".

     

  • 1.4, bOOster (ok), 10:22, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Помню во времена моей молодости, DOS НортонКоммандер и всякое такое - была утилита переворачивающая экран вверхтормашками. Обозвали утилиту как 255 символ и вставили в autoexec.bat. Наш товарищ "головой монитор разбил" ))))
     
     
  • 2.12, Аноним (-), 10:48, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    А есть подобное для текстового режима linux?
     
     
  • 3.16, GotF (ok), 11:03, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > А есть подобное для текстового режима linux?

    Можно перевернуть фреймбуферную консоль. Про текстовый не знаю, да и он не встречается уже почти.

     
  • 3.32, Аноним (-), 13:00, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    в линуксе нет текстового режима - там есть терминал. это немного другое.
     
  • 3.57, pavlinux (ok), 03:15, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > А есть подобное для текстового режима linux?

    # для VGA 80x25
    1. Замутить terminfo файлик, скомпилить.
    2. Закинуть в /usr/share/terminfo/
    3. export TERM=rotterm  

    можно там в каталоге пошариться, может уже есть такой.

    # Для фряймбуфера
    есho 2 >  /sys/class/graphics/fbcon/rotate_all;

    # X'ы
    xrandr -o 2;


    # Как-то хитрожопо лазали в VGA регистры и там вращали всей видюшкой.
    # Граб2 мож крутануть
    # Ну и ефи/биос пропатчить.


     
  • 2.33, ano (??), 13:39, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +5 +/
    ti.com
     
     
  • 3.41, Аноним (-), 17:51, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Точно! :)
     
  • 3.46, Michael Shigorin (ok), 19:29, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > ti.com

    Фигассе память :)

     
  • 3.58, Аноним (-), 08:03, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Друг пояснить просит
     

  • 1.10, YetAnotherOnanym (ok), 10:47, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    Когда я занимался составлением русских правил для SpamAssassin'а, обнаружил, что в русскоязычном спаме широко применяется метод смешивания русских и латинских букв, а также цифр (ноль вместо О, три вместо З, и т.д). Сделал правило, по которому за одно только смешивание русских и латинских букв в одном слове, при наличии ещё некоторых признаков, письмо получало некоторый балл, даже без анализа текста.
    Так что тут тоже самое - просто ищем символы выше 0x80 там, где их быть не должно, и всё.
     
     
  • 2.67, Аноним (-), 17:26, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Отличная идея! Как раз недавно просматривал папку спама и удивлялся, как гуглу удаётся так хорошо настроить фильтры. У вас нет статей о подобном?
     
     
  • 3.77, YetAnotherOnanym (ok), 19:27, 28/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, статей у меня нет. Если есть желание - можете глянуть сами правила - http://sa-russian.narod.ru/
    Я их, если честно, забросил, потому что я сейчас почтой не занимаюсь...
     
  • 2.75, Очередной аноним (?), 16:18, 27/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    наверное тут ключевое "...там, где их быть не должно...". Если это листинг какой-то программы, то для того, чтобы понять, должен "странный" символ там быть или не должен, вам нужно целый синтаксический анализатор языка программирования писАть. Потому что как минимум нужно понять, этот символ в этом месте относится к конструкциям языка или он валяется внутри какой-нибудь строковой константы, в которую вбит текст на хинди (и данный символ там нормален).
     

  • 1.11, Аноним (-), 10:47, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Дaвнo yжe зaмeняю. Правда из-за обессивно компульсивного синдрома и не в коде, в в сообщениях.
     
     
  • 2.22, Admino (ok), 11:34, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    И какие символы ты заменил в этом комментарии, колись?
     
     
  • 3.29, Аноним (-), 12:57, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    В первом предложении - очень многие.
     
     
  • 4.47, Michael Shigorin (ok), 19:30, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > В первом предложении - очень многие.

    [CODE]$ export LANG=C
    $ echo <d0><94>a<d0><b2><d0><bd>o y<d0><b6>e <d0><b7>a<d0><bc>e<d0><bd><d1><8f><d1><8e>.^C[/CODE]

     
     
  • 5.59, Аноним (-), 08:15, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Какой это язык и в чём суть этого кода? Смахивает на баш.
     
     
  • 6.71, Аноним (-), 19:15, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Вау, нет объяснений, а только один минус.
    Мне кажется или тот кто его поставил таки понимал суть. <,>, код символа (кажется).
     

  • 1.13, Аноним (-), 10:52, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Я использовал эту особенность когда регистрировался на oтветах Google после бана. Одинаковые ники были запрещены, но относительно неодинаковые - нет.
    Правда потом эту особенность из движка выпилили. ;(
    PS ВиO, я скучаю.
     
     
  • 2.14, Аноним (-), 10:53, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    PS: также можно использовать невидимый нулевой пробел.
     
  • 2.39, KOT040188 (?), 16:16, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Скучаете по ещё одному бану? ヅ
     

  • 1.15, Dkg (?), 10:57, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Разработчикам IDE работы прибавиться.
     
     
  • 2.18, Anonymous_ (?), 11:07, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Для Vim уже есть плагин
    https://github.com/vim-utils/vim-troll-stopper
     
  • 2.34, Петушок (?), 13:50, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +6 +/
    > Разработчикам IDE работы прибавиться.

    http://tsya.ru

     
  • 2.44, Аноним (-), 18:40, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Что сделае[i]т[/i]?
    Прибави[i]тся[/i]
    (Oн) Что делае[i]т[/i]?
    Добивается!
    Что сдела[i]ть[/i]?
    Доби[i]ть[/i]ся
    Что дела[i]ть[/i]?
    Добива[i]ть[/i]ся!

    Хотя, теперь я понимаю, откуда всякое-разное "ЦО" пошло:
    прибавицо
    добиваецо
    добицо
    добивацо

     
  • 2.72, аанноонниимм (?), 21:11, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >Разработчикам IDE работы прибавиться.

                                     ^^^^^
    И Розенталю

     

  • 1.24, Аноним (-), 11:57, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Утилита воплощает идею, высказанную одним из разработчиков из компании Twitter

    тоже мне идея - периодически натыкался на такую проблему при копировании примеров кода из web-браузера. Кажется, тире в коде обычно неотличимо от минуса.
    И, в отличие от хитрого ; из греческого юникода, встречается гораздо чаще - тот же word такую подставу автоматически делает.

     
     
  • 2.28, all_glory_to_the_hypnotoad (ok), 12:43, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > ... периодически натыкался на такую проблему при копировании примеров кода из web-браузера ... тот же word такую подставу автоматически делает.

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

     
     
  • 3.37, Кукаретик (?), 15:41, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +9 +/
    >Стоит ли это понимать будто вы кодите в ворде?

    А в чём ещё кодить?

     
     
  • 4.68, Аноним (-), 17:29, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Некоторые ещё и /etc/passwd в нем редактируют.
     
  • 3.40, systemd_anonymousd (?), 17:44, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Сценарий без ворда
    > выглдяит как-то слишком фантастическим, ну просто во всём интернете навряд ли
    > найдётся онтопиковый ресурс

    Да не так и редко попадается. WordPress этим грешил раньше, по-моему. Некоторые форумы.


     
  • 2.48, Michael Shigorin (ok), 19:32, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > тот же word такую подставу автоматически делает.

    word, который press -- похоже, тоже.

     

  • 1.25, Аноним (-), 12:10, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не кормите троля
     
  • 1.26, Аноним (-), 12:29, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Мне больше всего бесит буквы С и C...
     
     
  • 2.38, Кукаретик (?), 15:43, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Операторы, вбивая данные, так ошибаются ежедневно.
     

  • 1.27, all_glory_to_the_hypnotoad (ok), 12:38, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > Кроме шуток над коллегами, замена символов может применяться для скрытия текста от автоматизированных систем разбора, механизмов цензурирования и поисковых систем.

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

     
  • 1.35, Аноним (-), 14:27, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    с буквами "с" такое нередко случается совершенно случайно: на макбуке в режиме "у каждого окна свой язык" переключение языка при переключении в окно происходит с задержкой. в итоге, переключаешься в окно, сразу начинаешь писать, но первые несколько символов ещё в старом состоянии переключателя клавиатуры. в случае с "с" это визуально никак не заметно.
     
     
  • 2.36, Eklykti (?), 15:30, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +6 +/
    > на макбуке в режиме "у каждого окна свой язык" переключение языка при переключении в окно происходит с задержкой

    Глобально, надёжно. Think different!

     
     
  • 3.49, Michael Shigorin (ok), 19:34, 25/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Think different!

    d1ff3r3n7, ага.

     

  • 1.51, Аноним (-), 20:03, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    не почти все эти случаи можно в обратку проверить, другое дело что подобная проверка на юникод символы давно напрашивалась, осло все юникод символы вне места где мы ожидаем строковую переменную можно заменять автоматом по таблице схожих символов..
     
  • 1.52, Аноним (-), 21:02, 25/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    " highlight non ascii symbols
    highlight nonascii guibg=DarkGreen ctermbg=DarkGreen term=standout
    au BufRead * syntax match nonascii "[^\u0000-\u007F]"
     
  • 1.53, Аноним (-), 02:06, 26/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    класс, теперь легче помогать школьникам и студентам с "напишите программу за меня". С радостью!
     
  • 1.60, IMHO (?), 10:17, 26/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    ну и свободка
     
  • 1.63, Аноним (-), 13:46, 26/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    енжой йор юникод
     
     
  • 2.65, тоже Аноним (ok), 14:19, 26/10/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Для кроссплатформенных исходников нормальных вариантов только два: либо ansi, либо юникод.
    Все остальное гарантирует пляски с бубном на ровном месте.
     

  • 1.73, Аноним (-), 23:07, 26/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Почему компиляторы не могут нормализовать?
     
  • 1.76, Аноним (-), 18:23, 27/10/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Сдавайте курсачи в напечатанном виде.
     
  • 1.78, Аноним (78), 14:06, 13/03/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    пошёл на хутор бабочек ловить
     
  • 1.79, Аноним (78), 14:06, 13/03/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    пошёл на хутор бабочек ловить
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру