Вирус-бякус, или Как достать соседа
Первое апреля — день, горячо любимый всеми компьютерщиками. Особенно — админами, в чьём ведении много машин, за которыми работают горячо любимые ламеры. Ещё более он любим админами-программистами, из под чьих рук в канун этого дня выходят сотни программ-шуток. Примкнём к их армии?
Наверное, почти каждый начинающий программист пробовал свои силы на шуточно-развлекательно-ламеропугательном фронте. Дело это, по сути, не хитрое, но требующее во-первых, знания особенностей психологии, а во-вторых, некоторых навыков в системном программировании. Язык большого значения не имеет, но как показывает практика, самые кош… смешные приколы проще всего получается написать на языках более мощных, чем Visual Basic. Закоренелые кодо-маньяки могут уже сейчас хвататься за компиляторы ассемблера, а мы воспользуемся стариной Delphi.
Ластик
Наша первая шутиха автоматизирует известный всем розыгрыш с заменой нормального Рабочего стола на его изображение (не реагирующее, как вы понимаете, ни на какие действия бедного подоп… пользователя). Быстренько разберём алгоритм. Перво-наперво, делаем снимок Рабочего стола:
function CaptureScreen: TBitmap; var DC: HDC; ABitmap: TBitmap; begin DC:=GetDC(GetDesktopWindow); ABitmap:=TBitmap.Create; try ABitmap.Width:=GetDeviceCaps(DC,HORZRES); ABitmap.Height:=GetDeviceCaps(DC,VERTRES); BitBlt(ABitmap.Canvas.Handle,0,0,ABitmap. Width,ABitmap.Height,DC,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow, DC); end; Result:=ABitmap; end;
Полученный с помощью этой функции снимок можно временно поместить в объект класса TPicture
и с помощью метода этого класса сохранить на диск.
var BMP: TPicture; ... BMP:=TPicture.Create; BMP.Bitmap:=CaptureScreen; BMP.SaveToFile(’screen.bmp’);
Но как вы понимаете, этого недостаточно. Теперь «наклеим» наши свеженапечатанные обои на Рабочий стол:
var Reg: TRegIniFile; ... Reg:=TRegIniFile.Create(’Control Panel’); Reg.WriteString(’desktop’, ’Wallpaper’, AppDir+’screen.bmp’); Reg.WriteString(’desktop’, ’TileWallpaper’, ’0’);
Наконец, скрываем с Рабочего стола Панель задач и значки:
var h: THandle; ... h:=FindWindow(’ProgMan’, nil); h:=GetWindow(h, GW_CHILD); ShowWindow(h, SW_HIDE); ShowWindow(FindWindow(’Shell_TrayWnd’, nil), sw_hide);
Думаю, объединить всё это в единую функцию не составит труда. Если же возиться не хочется, вы можете взять полный исходный код «Удалителя экрана» на нашем сайте. Моя версия программы, помимо указанных выше гад… шуток, умеет возвращать всё на место — достаточно запустить её с параметром /s
(полный код в статье не приводится ради экономии места).
Бякус
Пакостную программку с названием «Вирус-бякус» я написал года четыре назад по просьбе одного знакомого. Через некоторое время я вернулся к старому коду и немного его модифицировал — просто интереса ради. Некоторые принципы действия сего прикола я сегодня разъясню. Но сперва — отмазка для компетентных органов: никакого отношения к вирусам сия шутка не имеет. Она запускается исключительно вручную, не размножается, практически не скрывается и легко удаляется большинством пользователей. В общем, обычный первоапрельский розыгрыш, не более того.
Итак, первое, что делает «Бякус» при запуске — это… Ждёт. Надо же дать шутнику скрыться с глаз жертвы, а потом…
if Date>=StrToDate(’31.03.2008’) then begin Sleep(60*1000*35); RunRandomVirus; end;
Что же делает функция RunRandomVirus
? Главные её элементы — это оператор case
и генератор случайных чисел. В самом начале мы генерируем число от 0 до… а вот тут всё зависит от того, сколько шуток вы придумаете. Вот несколько идей:
// Меняем заголовок активного окна var header: HWND; ... header:=GetForegroundWindow; SetWindowText(header,’Я за тобой слежу!’); // Закрываем активное окно ShowWIndow(header, sw_hide); while true do begin for i:=1 to 3 do begin header:=GetNextWindow(h, GW_HWNDNEXT); ShowWindow(header,SW_HIDE); ShowMessage(’Окна закрываются, закрываются!’); end; Sleep(10000); end; // Играем лотком привода var OpenParm: TMCI_Open_Parms; GenParm: TMCI_Generic_Parms; SetParm: TMCI_Set_Parms; DI: Cardinal; k: boolean; ... repeat OpenParm.lpstrDeviceType:= ’CDAudio’; mciSendCommand(0, mci_Open, mci_Open_Type, Longint(@OpenParm)); DI:=OpenParm.wDeviceID; mciSendCommand(DI, mci_Set, mci_Set_Door_Open, Longint(@SetParm)); mciSendCommand(DI, mci_Set, mci_Set_Door_Closed, Longint(@SetParm)); mciSendCommand(DI, mci_Close, mci_Notify, Longint(@GenParm)); sleep(60*100); until k;
Полный финиш
Как видите, ничего сложного в написании программ-шуток нет. Только помните, что это — шутки, а не способ сжить со свету неугодных вашему админскому величеству ламеров.