LINUX.ORG.RU

Объявлены победители 29 конкурса по написанию запутанного кода на языке Си

 , ,


0

4

Опубликованы исходные тексты работ, победивших в двадцать девятом конкурсе IOCCC (International Obfuscated C Code Contest), участникам которого предлагалось подготовить наиболее запутанный и трудноразбираемый код на языке Си. Участвующие в конкурсе работы, с одной стороны, должны препятствовать анализу кода и пониманию сути решаемой задачи, но, с другой стороны, код должен быть интересен и чем-то примечателен (работы могут быть необычно оформлены или выделять неожиданные стороны языка Си). Размер файла с кодом программы не должен превышать 4993 байтa, а чистый код не должен превышать 2503 байта после обработки утилитой iocccsize.

Среди победителей:

  • Эмулятор компьютера с архитектурой URISC, набор команд в котором ограничивается одной инструкцией SUBLEQ (SUbtract and Branch if Less than or EQual to zero). Размер эмулятора всего 366 байт, при том, что помимо CPU он эмулирует фреймбуфер с разрешением 800x512, используя для вывода графики библиотеку SDL3, и может загрузить образ с Linux и запустить в нём игру doom.
  • Генератор изображения чёрной дыры. Приложение включает простой интерпретатор для подмножества языка Fortran 66, программа для которого задана в форме перфокарт, закодированных через пробелы и табуляции в исходном коде. Закодированная Fortran-программа повторяет первый код для симуляции чёрной дыры, опубликованный Жан-Пьером Люмине в 1978 году. Изображение формируется в виде облака точек и сохраняется в формате PGM. Кроме симуляции чёрной дыры предложены варианты с закодированными «перфокартами» для расчёта множества Мандельброта, вычисления простых чисел и трассировки лучей.
  • Вариант утилиты patch, генерирующий утилиту diff через серию трансформаций собственного кода. На первом этапе скомпилированной утилите patch передаётся собственный исходных код, на основе которого формируется diff-файл. После применения этого diff-а к собственному коду на выходе получается программа, которая в цикле на основе своего кода генерирует набор коммитов с патчами в формате git am. При объединении данных коммитов командой git log --pretty=format:%s > final.c получается код с реализацией утилиты diff.
  • Игра (на скриншоте) в жанре Roguelike, работающая в текстовом терминале и позволяющая проходить автоматически генерируемый лабиринт, собирать артефакты и избегать монстров. Код оформлен в виде изображения подземного жителя и обфусцирован (строки зашифрованы, циклы реализованы через goto, при работе с массивами используется синтаксис «индекс[массив]»).
  • Генератор ASCII-анимации, воссоздающий заставку сериала «Доктор Кто» с симуляцией видеоэффекта «HowlRound» (туннель из уменьшающихся копий изображения), применявшегося в заставке 1963 года.
  • Эмулятор игровой приставки GameBoy, оптимизированный для запуска тетриса, но способный выполнять и другие игры (протестирован запуск ROM-файлов для десятка игр). Вывод формируется в форме псевдографики из Unicode-символов.
  • Симулятор звука морского прибоя на фоне автоматически генерируемой медитативной музыки. На выходе генерируется wav-файл, продолжительностью 5 минут.
  • Реализация самомодифицирующегося игрового автомата Quine Pong, предоставляющего две игры - пинг-понг и перепрыгивающий препятствия динозавр (как в пасхальном яйце из Google Chrome). Программа примечательна тем, что отображение кадров реализовано через цикличную перегенерацию кода программы (запуск приводит к выводу исходного кода для первого кадра, после компиляции этого кода формируется код для следующего кадра и так далее). Игровой процесс реализован через shell-скрипт, выполняющий цикличную перекомпиляцию кода.
  • Компилятор и генератор кода для языка Zoltraak. Язык включает только одно слово «zoltraak», которое комбинируется в разной форме с пробелами и пустыми строками. На вход подаётся любой текстовый файл, который преобразуется в программу на языке Си, состоящую из заголовка и последовательности на языке Zoltraak. Компиляция и выполнение сгенерированной Си-программы приводит к выводу содержимого исходного текстового файла.

Видео на youtube, длительность: 2:57:20.

>>> Источник: OpenNET

★★★★★

Проверено: maxcom ()
Последнее исправление: dataman (всего исправлений: 3)

Генератор ASCII-анимации, воссоздающий заставку сериала «Доктор Кто»

Добавил кадр из:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define u8 unsigned char
#define u32 unsigned int
#define I int
#define R rand()
#define M (u8*)malloc(a)
#define P [i*D+j]
#define N if(k==0){if(k%10000<7)k++;}else if(k==11){if(r%10000<11)k--;}else{if(r%400<7)k++;else if(r%400>393)k--;}
#define O(a) printf("%c", a)
                            char 
                            b[12]=
                             {32,
                             32 ,
      44,58,59,33,63,123,36,37,35,64}; u8 l[45]={206,238
    ,238,170,132,170,170, 132,174,170,132,172,206,228,234,
    0,0,0,214,198,124,214,198,254, 214,198,198,214,254,198
  ,214,254,198,214,198,198, 124,198,198,124,198,254,108,198,
  124};I main(int w,char **z) {I D= atoi(z[1]),W= atoi (z[2]
 ),i=0,k=0,/*P O L I C E     P U B L I C    B O X */r=0,c=0,a,
 j,y,eg,ql;/*                  C A L L            */u8 *s, *t
  ,*u ,*v,*h,*g;u8 q[400 ]={0};float f,m, e=0.878f,o=0.0f;a=
  sizeof(u8)*D*W;eg=D/4;ql=W/4;s=M;t=M;u=M;v=M;h=M;g=M;srand
  (y);while(i<W){j=0;while(j< D){s P=9+R%3;u P=9+R%3;h P=0;g 
  P=0;++j;}    ++    i;    }i=0;a=4    ;k    =3    ;while(i<
  15){j=0;     a=    0;    while(j<    24    ){    q[i*24+j]
  =(l[(j/8     +i    *3    )]>>(7-(    j%    8)    ))&1;++j;
  }++i;}i=0;while(i<W-ql*2){j=0;while(j<D-eg*2-1){h[(i+ql)*D
  +j+eg]=(q    [(    i*    30/W)*24    +j    *48   /D])*11;g
  [(i+ ql)*    D+    j+    eg]=h[(i    +ql   )*    D+j+ eg];
  ++j;}++i;    };    eg    =(u8)((D    *(    1-    e))/2);ql
  =(u8)((W*(1-e))/2);for(;c<280; ++c){;i=0;printf("\x1b[H");
  while(i<W){j=0;while(j<D){if(c<0x6E||(c>0x78 &&c<170)){f=(
  float)i*e/*  TELEPHONE */+2*ql;m=(float)j*e+eg;t P=(s[(I)(
  f)*D+(I)(/*    FREE    */m)]+s[(I)(f+1)*D+(I)(m)]+s[(I)(f)
  *D+(I)(m+/* FOR USE OF */1)] +s[(I)(f+1)*D+(I)(m+1)])>>2;}
  if((c>70 /*   PUBLIC   */&&c<0x8c)||(c>0xaa&&c<0x118)){f=(
  float)i*e/* ========== */+ql;m=(float)j*e+eg;v P=(u[(I)(f)
  *D+(I)(m)/*  ========  */]+u[(I)(f+1)*D+(I)(m)]+u[(I)(f)*D
  +(I)(m+1)/*PULL TO OPEN*/]+u[(I)(f+1)*D+(I)(m+1)])>>2;}if(
  c>175&&c<280){if(c%5==0)g[(I)((i*0.898+ql))*D+(I)(j*0.898+
  eg)]=h P;}++j;}++i;}i=0;while(i<W){j=0;while(j<D){if(c<110
  ||(c>120&&c<170 )){k=t P;r=R;N;s P=(u8)k;}if((c>70&&c<140)
  ||(c>170&&c<280)){k=v P;r=R;N;u P=(u8)k;}if(c<89)O(b[s P])
  ;else if(c<0x78&&c>89)O(b[(I)(s P*(1-o)+u P*o)]);else if(c
  ==0x78)s P=7+R%3;else if(c>120&&c<140) {if(j<D/2)O(b[(I)(u 
  P*(1-o)+s P*o)]);else O(b[(I)(u[i*D+D-j]*(1-o)+s[i*D+D-j]*
  o)]);} else if(c<170&&c>140){if(j<D/2){if(h P){s P =(u8)(h
  P*o*(c%2==0));O(b[(I)(h P*o*2)]);}else O(b[s P]);}else{if(
  h[i*D+D-j]){s P=(u8)(h P*o*((c&1)==0));O(b[(I)(h[i*D+D-j]*
  o*2)]);}else O(b[s[i*D+D-j]]);}}else if(c== 170)u P=8+R%4;
  else if(c>170&&c<280){h P=g P;if(h P)O(b[h P]);else O(b[(I
  )(s P*(1-o)+u P*o)]);} ++j;}printf ("\n");++i;}if(c>89&&c<
  120){if(o<1.0f)o+=0.05f;else o=1.0f;}else if(c==120)o=0.0f
  ;else if(c>120&&c<140){if(o<1.0f)o+=0.02502f;else o=1.0f;}
  else if(c==140){o=0.0f;}else if(c>0x8c&&c<170){if(o<0.5f)o 
  +=0.0194f;else o=0.5f;}else if(c==170) {o=0.0f;}else if(c>
  170&&c<280){if(o<1.0f)o+= 0.05f;else o=1.0f;}usleep(90000)
;}free(s);free(t );free(u);free(v) ;free(h);free(g);return 0;}
dataman ★★★★★
() автор топика

чтобы посмотреть запутанный код достаточно открыть пул реквесты в ведро, сделанные свежеиспеченными инженерами

bernd ★★★★★
()
Ответ на: комментарий от bernd

Он отформатирован в виде красивых ASCII картинок? Если нет - это недоработка.

Chiffchaff
()

Посмотрел первое, очень интересно.

Хотя, конечно, фреймбуфер он не эмулирует, его эмулирует SDL.

Образ с Linux, я так понял, нужен специальный, скомпилированный Си-компилятором под эту одноинструкционную «URISC».

И кстати там переполнение буфера!

int s[402653184];
read(b,s,1718775655);
но наверно все предлагаемые образы меньше этого размера. Впрочем, в контексте мероприятия это надо скорее пасхалкой считать.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

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

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

Вместо того, чтобы соревноваться с фотоаппаратом кто точнее передаст реальность, можно сосредоточиться на том, что лучше получается у человека.

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

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

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

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

LightDiver ★★★★★
()
Ответ на: комментарий от dataman

Ну и чем они помешали анализу? Я, нихрена не разбирающийся в программировании и тем более в сишке суть примеров увидел сразу, без описаний и прочего. Что делает, почему, как. Я могу доработать этот код даже без задействования нейросетей конкретно в генерации кода. Узнаю что где и доделаю, переделаю. Это работа ради работы.

Это просто художественное офомрмление кода. Тратится время ни на что. По второй части предложени вопросов нет.

Интересно посмотреть на действительно полезное, а не это вот все. Интересные решения в программировании, концепции.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от dataman

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

Задача полностью провалена. Есть более интересные концепции затруднения понимания кода.

Например, я полностью отказался от обфускции кода у клиента. Я у клиента оставляю только чисто графическое отображение. Работу с интерфейсом. Вся логика на сервере. Но всеравно приходится работать с логикой у клиента и такой вот код подгружается динамически клиенту в ОЗУ. В файлах физически кода нет. В классе 6 методов, а по факту в ОЗУ еще три метода, которые клиент не видит. Это просто один из примеров. Вот чтобы до такого добраться, надо подумать, а не просто гянуть код.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

обфускация потеряла всякий смысл.

И дальше сам себе противоречишь. Даже если LLM научились её быстро расшифровывать, остаётся смысл в ней как в жанре искусства :)

question4 ★★★★★
()

Не узнал автора по новости :)))

Круто. Когда я вырасту, я тоже так буду уметь. Мне папа и компьютер даже обещал купить. :)

PcheloBiaka
()
Ответ на: комментарий от LightDiver

Что делает, почему, как.

Код первого победителя https://www.ioccc.org/1984/anonymous/index.html:

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p)void*i;{write(j/p+p,i---j,(int)i/(int)i);}

так впечатлил некоего Thomas Scovell, что он даже тату сделал.

dataman ★★★★★
() автор топика

Симулятор звука морского прибоя на фоне автоматически генерируемой медитативной музыки. На выходе генерируется wav-файл, продолжительностью 5 минут.

Понравился, добавил скриншот. :)

dataman ★★★★★
() автор топика

Какой только фигни не придумают эти ваши люди.

sparkie ★★★★★
()

Интересно, тот код нескольких лет давности, который выглядел, как попытка напечатать на принтере, а по факту делал sudo rm /, он из такого же соревнования пришёл?

zbarassky
()

Вчера впервые за уже относительно долгое время на C покодил (для себя), при том, что каждый день по работе на Go.

Какая же свобода и какой кайф.

GFORGX ★★★
()
Ответ на: комментарий от LightDiver

стандартное червование когда процесс не когерентен файлу программы

а как противодействуете(если вообще) активной трасе отладчиком али меннее инвазивным методам наблюдения&получения полного образа?

qulinxao3 ★☆
()
Ответ на: комментарий от LightDiver

А в чем красота решения? Ну вот ты опиши своими словами.

Смотреть и восторгаться чужим мастерством.

question4 ★★★★★
()

есть такое и на питоне https://pyobfusc.com/

тож полезно для понимания что дело ваще не в языке :)

qulinxao3 ★☆
()
Ответ на: комментарий от BceM_IIpuBeT

Это ты еще не пробовал ржавую клетку на пенсил.

Не нравится плюсоподобность. Zig прикольнее из всех этих убийц Си.

GFORGX ★★★
()
Последнее исправление: GFORGX (всего исправлений: 1)
Ответ на: комментарий от qulinxao3

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

Вот у клиента файлы аддона, они подгружаются в ОЗУ при входе в игру. Все что у клиента - он испортит и начитерит, иначе не бывает. Вторая серверная часть у меня на компе. Игрок кликает кнопку и с сервера ему подгружается новый метод, который хранится чисто в озу в переменной и оттуда вызывается. Причем вызывается тоже командой с сервера, а не кодом с клиента. А у клиента только графика.

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

А ведь даже в компилированном коде на си тоже рано или поздно разбираются. Подменяют функции налету, меняют, читерят. Все что у пользователя на компе - это код пользователя. На этом фоне подобные обфускации вызывают только недоумение.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

И никто не помешает.

Ну так категорично заявлять всё-таки не стоит. Ядерную зиму никто не отменял.

firkax ★★★★★
()
Ответ на: комментарий от LightDiver

Это просто художественное офомрмление кода. Тратится время ни на что.

Время тратится на развлечение, как ты этого не поймешь? Людям нафиг не сдалось организовывать твою «полезность», они хотят хорошо провести время и этим и занимаются. Если у тебя 24/7 только и мысли о «что бы сделать полезного», не надо думать что все такие.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Не могу сейчас сформулировать точно. Я подумаю еще и может потом отпишусь.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

На этом обычно кормятся и паразитируют те, кто заточил себя под работу на этих сложностях.

То есть по вашим словам те, кто 40 лет нарабатывали опыт и «заточили себяпод работу» теперь с этого «кормятся и паразитируют». Интересная логика.

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

VIT ★★
()
Ответ на: комментарий от VIT

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

LightDiver ★★★★★
()
Ответ на: комментарий от hobbit

Я ему должен обеспечить качественный геймплей без читов. А с читами интерес быстро уходит и играть не за чем.

LightDiver ★★★★★
()

Компилятор и генератор кода для языка Zoltraak

У него там еще другая посылка есть на ту же тему, лол. Угорел по аниме товарищ.

Lrrr ★★★★★
()
Ответ на: комментарий от LightDiver

А как это мешает прогрессу? Понятно, когда в дело вступают интеллектуальные права собственности, это отдельный разговор, а если «вдруг» оказалось, что незаменимый специалист со своим ноу-хау оказался не нужен, поскольку его ноу-хау теперь знает любая ИИ-шка, то кому это вредит кроме него самого?

VIT ★★
()
Ответ на: комментарий от LightDiver

Вся логика на сервере.

Прорывные технологии 2005 года, как же раньше то никто не додумался. Только бредогенераторы тут, сам надеюсь понимаешь, ни при чём.

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

И да ИИшки тут не при чем, это я додумался все еще до них.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от VIT

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

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

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Это правда, мне не повезло так как вам. Вы сразу родились со знаниями и подняться на уровень выше вам не составило труда. Мне приходится всё время учиться, чтобы поддерживать тот уровень, на котором нахожусь.

VIT ★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.