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

История одной болезни

Как именно мне пришла идея написать что-то на ассемблере под Линукс я, честно говоря, сейчас вспомнить не могу :-). Видимо чисто из научного интереса или по причине пытливого ума. Было это наверное в (сейчас уже далеком) 1998 (или 1997?) году. Насколько я помню, я просто хотел попробовать перенести какую-то из своих ассемблерных безделушек из DOS на Linux. Тогда мне казалось, что это несложно - надо всего лишь провести привычную операцию под кодовым названием RTFM. Потратив некоторое время на поиск информации я неожиданно понял, что операция не удастся, поскольку этого самого TFM просто не существует. Да, конечно я нашел Assembly-HOWTO, но ему в то время больше подошло бы имя Assembly-HOWnotTO - кроме списка ассемблеров для Линукс, все остальное было рассуждениями на тему "нужны ли мы нам" (впрочем не лишенными смысла). Да, конечно был ассемблерный код в ядре, ассемблерные вставки в различных программах и библиотеках, и даже в каталоге test в дистрибутиве nasm'а была парочка примеров. Но... в том, что в Линуксе вообще можно скомпилировать ассемблерный код и вызывать библиотечные функции никто и не сомневался. Впрочем, нас голыми руками не возьмешь. Линукс еще молод, подумал я, а вот наверное в BSD уже все есть. Ну или хотя бы в юниксе вообще, хоть в каком-нибудь... Ну или хотя бы... Или может... Помнится я смог отыскать только руководство as, кажется для SCO Unix.

Вывод из всего этого поражал своей простотой - никаких мало-мальских прикладных программ на ассемблере под Линукс (и прочие юниксы) еще никто не писал (если не считать пример вируса Staog). Тут собственно и стало понятно, что "если не мы, то кто". Линукс тогда только начинал набирать свои обороты, а "вся прогрессивная ассемблерная общественность" сидела под DOS и только успела удариться в Windows. Взглянув на меня, они просто покрутили пальцем у виска.

Далее последовали неспешные ковыряния в исходниках ядра, библиотеки Си, различных man-страницах, и всевозможных эксперименты, растянувшиеся на несколько месяцев. В какой-то момент на свет появился "hello, world!". Размером в несколько сотен байт, он выводил чудное сообщение и работал непосредственно с ядром, минуя библиотеку Си. Это была победа.

Выбор ассемблера был сделан еще на самых ранних этапах - привыкший к tasm ideal mode, я уже просто не мог использовать gas. Альтернативой был nasm, с ним я бегло был знаком еще в DOS. Был еще as86, но он мне как-то сразу не понравился (может быть и зря). Других вариантов в том время не существовало.

Полученную информацию надо было систематизировать: из чего должна состоять программа, как ее скомпилировать, как делать системные вызовы, список этих самых вызовов, как работать с командной строкой и т.д. и т.п. - вообщем все, что необходимо знать при переходе на новую платформу. Конечно же вся информация добывалась собственными руками, преимущественно эмпирическим путем (а сейчас достаточно просто набрать в google пару слов, и вы получите ответ на все эти вопросы :-). В качестве языка выражения информации был выбран английский по причинам изначально большей аудитории и универсальности (к тому же русская аудитория на тот момент отсутствовала начисто), что в дальнейшем себя не раз оправдало. Да и человек, знающий ассемблер и юникс, и не способный прочитать технический английский текст - это из области фантастики. Результатом проделанной научно-исследовательской работы стало появление на просторах интернета странички "Linux/i386 assembly programming page" по адресу http://lightning.voshod.com/asm/, на которой среди прочего появились описание процесса загрузки ELF файлов и мой список системных вызовов.

Тогда я работал системным администратором у местного интернет провайдера, соответственно проблем с ресурсами для размещения и поддержки странички не испытывал. Тут уместно небольшое отступление. В адресе странички (сейчас конечно уже не существующем) можно заметить слово lightning. Оно там было не спроста - эта страничка была как бы частью этого проекта. Lightning - это был дистрибутив Линукса пошива нашей местной LUG. Собственно им занимались только я и Николай Куршев. Дистрибутив был для своего времени революционный - в то время, когда все усиленно продвигали Линукс на декстопы, мы копали в обратную сторону - максимальное ускорение и уменьшение размера, причем радикальными средствами. Но вдвоем нам было это по понятным причинам не осилить, поэтому Lightning благополучно скончался к концу 1999 года, одновременно с кончиной провайдера, а соответственно и хостинга (но, как далекое эхо, через несколько лет появился a-Linux).

Но пока провайдер был еще жив. Ассемблерная страничка достаточно быстро стала привлекать все больше внимания. Мне начали задавать вопросы, я начал на них отвечать. Вскоре там появился первый релиз asmutils, что только подлило масла в огонь - оказалось, что можно не только играться с ассемблером, но и создать что-то действительно полезное. До этого все сомневались, что на марсе есть жизнь :-)

Кроме того, в код asmutils с самого начала был заложен принцип переносимости (я думаю, что много примеров переносимого ассемблерного кода вы не найдете), что позволило вскоре запустить проект на FreeBSD, а затем и на NetBSD и OpenBSD. Как нетрудно догадаться, перенос проекта на другие системы сопровождался все теми же ковыряниями, ввиду отсутствия TFM. Конечно же по ходу действия выяснялись интересные особенности систем, например смерть BeOS от "неверного" системного вызова. Таким образом, вскоре основная страничка "Linux/i386 assembly programming page" переродилась в документ под названием "Introduction to UNIX assembly programming", который рассматривал уже *BSD системы и BeOS. Тогда же я решил взять на себя поддержку Assembly-HOWTO, и попытался привести его в вид соответствующий его названию. А тут еще и оказалось, что и мы не одни во вселенной - Brian Raiter параллельно со мной грыз тот же камень, правда с другой стороны, с упором на ELF...

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

Дальнейшую историю asmutils можно вкратце увидеть в соответствующем ChangeLog. Достаточно быстро к проекту подключилось еще несколько ненормальных, и функциональность выросла до вполне приемлемого уровня... Еще один из примечательных моментов - появление первой ассемблерной intro под Linux - leaves. Конечно, и до этого были линуксовые интро, написанные на Си с использованием различных графических библиотек. Эта же весила меньше 400 байт и использовала framebuffer. Как раз под руку подвернулся местный Cafe Party, где для нее просто не нашлось номинации :-) Ее описание есть в ее исходнике. Вскоре на ее основе появились и другие графические интро.

C самого начала, из-за дурных привычек к определенному инструментарию (свойственным всем отечественным DOS-программистам), я быстро почувствовал необходимость в привычном для меня просмотрщике файлов. Поэтому я сразу начал уговаривать Николая Куршева перенести свой hex-editor BIEW на Линукс. Посопротивлявшись для виду, он все таки решил попробовать. Я помог чем смог, и через какой-то год появилась пробная -pre версия под линукс. А с версии 5.0 BIEW смело шагнул в мир юникса, став первым кросс-платформенным hex-editor с открытым исходным кодом. Его историю вы можете почитать на сайте программы и в документации. Да и вообще, появление странички и ассемблерных программ привлекло внимание более широкого круга хакеров, и естественным образом повлекло за собой и развитие соответствующего инструментария. Начали появляться новые и возрождаться старые ассемблеры, отладчики, всевозможные утилиты (временами наш список рассылки становился достаточно оживленным местом, c десятками писем в день). Конечно это было не единственным стимулом развития инструментов - из мира Windows в мир Unix потянулись любители взлома...

К концу 1999 года объем информации был уже велик настолько, что родилась идея написать книгу. Мир в то время просто свихнулся на Linux - и казалось что книга о программировании на ассемблере в Линуксе, да еще написанная так сказать "от лица" соответствующего сообщества, и не теоретиками, а практиками вызовет хоть какой-то интерес издателей. Но все получилось "как всегда". На протяжении пары лет издатели выдавали свои обычные отговорки, а позже стали выходить книги, бегло затрагивающие тему, либо просто "для совсем начинающих". В память о ненаписанной книге осталась эта страничка c предложением издателям и содержанием (на сайте она больше нигде не указана).

Новый век был ознаменован кончиной провайдера и смертью странички. Как я вышел на Dragan'а, я уже не помню... Тогда он работал в VALinux, и, обсудив варианты, мы решили открыть проект на sourceforge.net, и завести домен linuxassembly.org как основной адрес. Dragan сделал простую, но вполне подходящую графику для странички, и зимой 2000 года она открылась по новому адресу, уже сильно переработанная. Несмотря на имя LINUXassembly.org, я постарался собрать всю возможную информацию об ассемблере в всех юниксах, и не ограничиваясь x86 архитектурой. Dragan с самого начала обещал несколько написать статей по IA-64, но так не сделал этого :-). Постепенно из исследовательской фазы проект перешел в фазу поддержки и использования достигнутого. В таком виде он и существует по сей день, что вы и можете наблюдать - "a light in the darkness of bloatware".

Вот вкратце и вся история "казанской экспансии".

Обращение к "сцене"

Ввиду очевидной "пограничности" темы, данная страничка часто привлекает внимание всевозможных любителей взлома. Как это ни парадоксально, часто они не способны найти нужную себе информацию даже на тематическом сайте. Те же из них, кто смогли прочитать какой-нибудь документ с этого сайта, уже на следующий день выдают очередной шедевр о том "как реально программировать на асме в юниксе" by cewl hack3r. Вы можете без труда отыскать пару десятков подобных статей на разных языках. Первоисточник в них виден невооруженным глазом, да и достаточно просто взглянуть на время их создания. Причина появления подобных "туториалов" тривиальна - это релиз (личный или группы), он всячески поднимает авторитет написавшего. Главное - не указывать откуда вы почерпнули информацию, и все поверят, что вы true elite.

Первая на моей памяти веселая история с представителями "сцены" произошла в 99 году. Что примечательно, представитель был не русским. Он взял список системных вызовов, составленный H-Peter Recktenwald, просто заменил его имя на свое (и больше ничего, 20 байт!), и опубликовал как плод своих бессонных ночей. К счастью, удалось объяснить парню, что так делать нехорошо. Больше таких историй не повторялось.

Интерес же русской части "сцены" к ассемблеру в юниксах впервые проявился после появления сайта на linuxassembly.org (хотя русские хакеры успели отметится в asmutils практически с самого начала). Мы мирно и достаточно конструктивно переписывались с Red Plait на тему ELF загрузчиков и библиотек Си :-). А через пару лет повалила новая волна "возрождающейся сцены" - студентов, с бурлящим энтузиазмом начавших изобретать велосипед. Господа, знакомы ли вам имена Quantum/VLAD или Silvia Cesare?

К чему я собственно это пишу. В основании любой науки заложен принцип кредитования. Вы берете из коробочки нужную вам информацию, и, использовав ее, возвращаете в коробочку еще и новую, до вас не существовавшую. Принцип справедлив для любой науки, прикладной или фундаментальной. Собственно, это принцип развития как такового. GPL - это именно об этом. Поэтому, если вы считаете себя исследователем (по иностранному - хакером), то попробуйте потратить свое время именно на исследование нового, после чего опубликуйте свои разработки. Если вы считаете, что нужно где-то что-то улучшить - просто сделайте это. Тогда, возможно, вас станут уважать, если будет за что. Все остальное - это лишь разновидность современной сдачи "реферата" в учебном заведении и/или применение технологии copy-paste - в итоге это попросту означает, что ваши желания не совпадают с вашими возможностями, и вы зря тратите свое (и чужое) время и нервы. Выбор за вами.


home | news | projects | docs | tutorials | links | asmutils | list
$Revision: 1.3 $ . $Date: 2006/02/19 06:40:55 $ . $Author: konst $