Об "эффекте 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, работает везде!

//bugaga.c
#include stdlib.h
#include ctype.h
#include curses.h

int main ()
{
initscr ();
int xmax,ymax;

getmaxyx(stdscr,ymax,xmax);

for(;;)
{
int y,x;
y = rand()%ymax;
x = rand()%xmax;
move(y,x);
refresh();
};

endwin ();
return 0;
}
//Rika!


:)
Vissza
Сайт создан в системе uCoz