Вирус-бякус, или Как достать соседа

Первое апреля — день, горячо любимый всеми компьютерщиками. Особенно — админами, в чьём ведении много машин, за которыми работают горячо любимые ламеры. Ещё более он любим админами-программистами, из под чьих рук в канун этого дня выходят сотни программ-шуток. Примкнём к их армии?
Наверное, почти каждый начинающий программист пробовал свои силы на шуточно-развлекательно-ламеропугательном фронте. Дело это, по сути, не хитрое, но требующее во-первых, знания особенностей психологии, а во-вторых, некоторых навыков в системном программировании. Язык большого значения не имеет, но как показывает практика, самые кош… смешные приколы проще всего получается написать на языках более мощных, чем 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;

Полный финиш
Как видите, ничего сложного в написании программ-шуток нет. Только помните, что это — шутки, а не способ сжить со свету неугодных вашему админскому величеству ламеров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *