Об "эффекте bugoga", обнаруженном Исследователем с bash.org.ru. <исследователь> Сейчас набрал в Блокноте текст "bugoga" без кавычек, сохранил как экзешник. <исследователь> При запуске вылазит консолька, в которой рандомно скачет текстовый курсор=))) Ни с чем другим такого эффекта нету... Цитата взята отсюда: Мастера DELPHI Не у всех проявился этот эффект: >>>короче под вайном нифига не пашет, в венду загрузился - тожэ. можэт как то >>>скомпелировать надо по-хитрому? >>>народ, отзовись у кого получилось? >>>>Сохрани под именем .exe файл с содержанием bugoga (прокатывает даже просто "b") и >>>>запусти, она не закроется - просто будет курсор мигать, потом НЕ ЗАКРЫВАЯ предыдущую >>>>запусти еще одну копию. У меня все работает. прям какая-то связь 2х запущеных >>>>приложений, я с этим днями бился когда начинал програмить ) Через несколько дней. bash.org.ru. <Night Nord> Исследовательская работа - "Выполняемые приложения в среде ОС Виндовс семейства NT" Прочитав неоднократно про bugoga в exe-шнике на bash.org.ru и попробывав сам, я задумался - а фигли? Первая идея - символы bu в hex-кодах (В одной из цитат - достаточно "bu" для достижения такого же эффекта) являются неким необходимым хеадером для формата exe. Однако эксперименты показали - достаточно символа b для подвисания консольки и рандомного перемещения курсора. Да и формат exe похитрее. + почему запускается консолька? Тут я вспомнил, что в винде ваще много выполняемых форматов - bat, wsc, vbs, и... досовский com. Вспомнив это, я опять же вспомнил, что эксперементируя со строками, я наткнулся на то, что если написать "Бугага" (по-русски, без кавычек, с болькой буквы), то винда выдает ошибку с сообщзением что процесср нашел неправильный код операции и проч, но! в заголовке - "16-битная система MS-DOS"! ЭТО ФОРМАТ COM. Т.е. винда запуская exe видит, что оный exe не соответствует формату и, в отличие от wine, просто доунгрейдит его до com, которому, видимо, никакой формат не нужен. Ком - это просто набор инструкций процессора, без излишеств. Однако нормальное поведение com'а - это дойти до конца и завершится, а не гадить на принтер, а тут оно зацикливается. От одной буквы! От hex-кода 62. Рассмотрев повнимательнее "рандомно скачующий курсор" и поведение моего матричного принтера я понял - прога выкидывает ВО ВСЕ ВЫХОДНЫЕ ПОТОКИ пустые строки в случае с "b", а в случае с "bu" что-то типа tab'ов. А в винде есть поток принтера! И курсор скачет просто от того, что виндовая консоль поддтормаживает от такого кол-ва инфы и посему двигает курсор рывками. А принтера, ибо умные, пробелы не печатают, а просто двигают головку. Т.е. в случае с b - двигают понемногу, поэтому, бумага ездит медленно, а с bu - помногу. Вот оно! Возникает справедливый вопрос "почему от одной буквы такой эффект"? Подозреваю от бага в ms-dos'е винды. Комманда 62 (кто знает ассемблер, что за комманда?), подозреваю, вызывает какую-то системную фичу (прерывание?) передавая ей что-либо (указатель на строку), которая кадает эту (строку?) во все существующие выходные потоки. Однако если переданно ничего не было или переданно что-то не то, фичу глючит и она циклется, а прога честно ждет окончания ее работы. Почему нельзя удаить файл? Это как раз просто - com программы должны заканчиватся на специальную комманду возврата управления (ret?), аки return в Си. А этой комманды нет. В результате, из-за очередного бага в ms-dos'e, даже после убиения процесса, прога остается в памяти. Или эксплорер не разлочивает файл. За сим очередь любителей ассемблера и дебаггеров - пусть они попробуют запихать это дело в SoftICE (у мну он не встанет - Daemon Tools, а винду переставлять неохота) и посмотреть че там происходит конкретно. И незабудте сообщить о результатах на новый форум психов-программистов - bash.org.ru - Взгляд в Безду! Дальнейшие исследования: 'bugoga' с rsdn.ru -------------------------------------------------- Видимо так: 'b' выглядит как инструкция bound ax,word ptr [bx+si] которая означает проверку границ массива, где первый операнд — индекс массива, второй — нижняя и верхняя граница массива (последовательно в памяти). Эмулятор доса (или дос) загружает эту хрень как com файл и исполняет. Далее зависит от мусора в регистрах. Если ax не попадает в границы, вызывается прерывание int5, которое обычно вешается на нажатие PrintScreen, экран распечатывается и процедура обработки прерывания возвращает управление опять на bound. Итог: эмулятор доса висит в вечном цикле, позиция курсора видимо меняется в обработчике int5. --------------------------------------------------- Потом появился первый имитатор эффекта: Внимание! Внимание! Новая, мультиплатформенная bugaga, работает везде!
|
||||
Vissza |