Скорее всего вы помните, что существует такая форма компьютерного искусства как «демосцена», но если слышите это слово впервые — просто прочитайте тематический хаб и теги на Хабре, а также пару популярных статей по этому вопросу.
Одной из форм соревнования на демосцене является sizecoding — программирование визуальных эффектов в крайне ограниченном объеме машинного кода. Прежде чем мы перейдем к достижениям сегодняшнего дня (а они есть и более чем масштабные), давайте очень быстро пробежимся по наследию дедов. Все приведенные ниже работы сделаны в разные годы, объединяет их требование к платформе — PC, x86, DOS (никакого GPU, обычная видеокарта). В идеале вам стоит поставить DosBox и запускать каждую работу самостоятельно, благо авторы не особенно озадачиваются созданием видео и загрузкой его на YouTube. Мы постарались выбрать по одной показательной работе в каждой номинации.
Для начала посмотрим на «крупные» релизы, те, которые занимают килобайты. Здесь золотым стандартом является 64 килобайта. Категория 40 килобайт популярна на компьютере Commodore Amiga, а в случае с PC здесь обычно лежат работы, которые авторы не захотели дописывать до 64k. Говоря про 32k и 16k — это чаще всего cracktro и bbs intro, которые формально тоже можно отнести к демосцене.
64k intro — heaven seven by Exceed
40k intro — Alien Incident Cracktro by Hybrid & Superior Art Creations
32k intro — Quake 3 Cracktro (RZR #07) by Razor 1911 & Superior Art Creations
16k intro — Blastersound BBS (2) by Iguana
А вот отсюда начинается настоящая демосцена, здоровенная, демосцена моей мечты!
8k intro — mars by Tim Clarke
4k intro — Omniscent by Sanction
1k intro — paleozoa by fsqrt
512b intro — AFLAtoxin
256b intro — Puls by Rrrola
128b intro — cross by Queue Members Group
64b intro — into a new era by Desire
32b intro — Projektbeschreibung by Desire
На этом официальны градации на Pouet заканчиваются, но не заканчивается погоня за эффектами в минимальном объеме кода. Вот в качестве примера всем знакомый «дождь из символов в Матрице» размеров всего восемь (8) байт:
8b intro — m8trix 8b
Вопрос дня: может ли быть интро размером в 4 байта? А в 2 байта?
Ответ: ДА.
Вот машинный код для процессора x86:
0xEB 0x80
Или на более понятном языке:
; 2B or not 2B - main environment code
; (c) 2020 / ShakeSpirt / RMDA
; fasm 1
org $100
jmp short $82 ; jump to command line to launch the code :)
А вот результат на экране:
Заинтригованы? Во второй части мы детально расскажем как такое возможно! Уж такой сегодня
день…
Продолжение статьи можно и не ждать, если вы умеете держать ассемблер в руках и язык вероятного противника вам знаком. Вот ссылка на ответ: www.pouet.net/prod.php?which=85118
Пишите в комментариях что поняли, что не поняли и что хотели бы понять из прочитанного выше. Ассемблер вовсе не черная магия! Просто НОРМАЛЬНЫЙ мужской язык программирования, а не это все «для девочек», на чем вы обычно каждый день пишите.
Архив выпусков нашей научно-популярной передачи:
И целого байта мало… (Часть #0)
И целого байта мало… (Часть #-1, пилот)
И целого байта мало… (Часть #1)
И целого байта мало… (Часть #2)
На иллюстрациях в статье PC-демонстрация obsoleet by Unreal Voodoo победившая на Assembly в 2004 году. И наверное, если вы дочитали до этого места, вам стоит посмотреть саму работу, она очень трогательная:
---EOF---
И целого байта мало… (Часть #-1, пилот)
И целого байта мало… (Часть #0)
И целого байта мало… (Часть #1)
И целого байта мало… (Часть #2)
И целого байта мало… (Часть #3)
Развлекательный канал деда в Телеграм: teleg.run/bornded
Рядом с каналом есть чат. В нем можно попробовать поднять вопросы по демосцене, ассемблеру, трекерам и многим другим аспектам. Вам могут ответить либо отправят в другие, более тематические чаты.
HardWrMan
#EB #80, говорите? Было дело, да. Сам когда-то использовал буфер для аргументов в своих корыстных целях.
unbeliever Автор
надеюсь, это не секретные технологии и за нами уже не выехали :-)
vdem
Т.е. фишка в том, что делается прыжок на аргументы командной строки в PSP?
P.S. Да, точно :)
unbeliever Автор
я календарь переверну и снова… ну вы поняли
monah_tuk
Я правильно понимаю, что команде передаётся аргумент, представляющий собой, по сути, shell-код? Он и выполняется по факту?
unbeliever Автор
Я не автор, я не знаю, но суть в .BAT которым запускается .COM — изучите полный архив, он по ссылке там в конце статьи. Если автор напишет тест — будет вторая часть, там разложим все честь по чести.
vdem
Аргумент (вернее даже, полная командная строка, если не ошибаюсь) — набор ASCII-символов, которые представляют собой машинный код. Т.е. команды должны быть еще подобраны таким образом, чтобы среди символов не оказалось специальных.
P.S. EB 80 — это jmp по смещению 80h, а первые 100h (256) байтов в com-программе — это Program Segment Prefix со всякими структурами, и по смещению 80h находится командная строка, выполнение которой и запустило эту программу.
P.P.S. Ну и напоследок, всего программа таким образом занимает 128 + 2 = 130 байт, исходники я не смотрел но весьма вероятно что основной цикл так и сделан, что выполняется итерация в этих 128 байтах (байт длины + 127 байт) и после снова выполняется та же инструкция EB 80, когда IP доходит до 100h.
unbeliever Автор
ну вот, автор может теперь уже ничего и не писать :-)
спасибо!
monah_tuk
Поглядел архив. Точно так. Сейчас сам шел-код можно при помощи какого-нибудь radare2/rasm2 сделать. У него это отдельные исходники, что генерируют шел-код.
Ну и не знаю за DOS, в Unix формального ограничения, что за байты могут быть в параметрах ком-строки нет. Главное найти способ их передать :) Но судя по всему, у DOS тоже жёстких ограничений нет.
unbeliever Автор
ну вот и разобрались… То что это можно использовать в военных целях сомнений нет, может быть даже и использовалось уже. У нас демосцена и она легальна — в вирусной сцене я не разбираюсь.
monah_tuk
Ну я не хацкер тоже. Radare2 помогает во всяком закрытом embedded разбираться, когда исходников библиотеки нет, но нужно разобраться.