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

Первое апреля — день, горячо любимый всеми компьютерщиками. Особенно — админами, в чьём ведении много машин, за которыми работают горячо любимые ламеры. Ещё более он любим админами-программистами, из под чьих рук в канун этого дня выходят сотни программ-шуток. Примкнём к их армии?
Наверное, почти каждый начинающий программист пробовал свои силы на шуточно-развлекательно-ламеропугательном фронте. Дело это, по сути, не хитрое, но требующее во-первых, знания особенностей психологии, а во-вторых, некоторых навыков в системном программировании. Язык большого значения не имеет, но как показывает практика, самые кош… смешные приколы проще всего получается написать на языках более мощных, чем Visual Basic. Закоренелые кодо-маньяки могут уже сейчас хвататься за компиляторы ассемблера, а мы воспользуемся стариной Delphi.

Ластик
Наша первая шутиха автоматизирует известный всем розыгрыш с заменой нормального Рабочего стола на его изображение (не реагирующее, как вы понимаете, ни на какие действия бедного подоп… пользователя). Быстренько разберём алгоритм. Перво-наперво, делаем снимок Рабочего стола:

[code lang=»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;[/code]

Полученный с помощью этой функции снимок можно временно поместить в объект класса TPicture и с помощью метода этого класса сохранить на диск.

[code lang=»delphi»]
var
BMP: TPicture;

BMP:=TPicture.Create;
BMP.Bitmap:=CaptureScreen;
BMP.SaveToFile(’screen.bmp’);
[/code]

Но как вы понимаете, этого недостаточно. Теперь «наклеим» наши свеженапечатанные обои на Рабочий стол:

[code lang=»delphi»]
var
Reg: TRegIniFile;

Reg:=TRegIniFile.Create(’Control Panel’);
Reg.WriteString(’desktop’, ’Wallpaper’, AppDir+’screen.bmp’);
Reg.WriteString(’desktop’, ’TileWallpaper’, ’0’);
[/code]

Наконец, скрываем с Рабочего стола Панель задач и значки:

[code lang=»delphi»]
var
h: THandle;

h:=FindWindow(’ProgMan’, nil);
h:=GetWindow(h, GW_CHILD);
ShowWindow(h, SW_HIDE);
ShowWindow(FindWindow(’Shell_TrayWnd’, nil), sw_hide);
[/code]

Думаю, объединить всё это в единую функцию не составит труда. Если же возиться не хочется, вы можете взять полный исходный код «Удалителя экрана» на нашем сайте. Моя версия программы, помимо указанных выше гад… шуток, умеет возвращать всё на место — достаточно запустить её с параметром /s (полный код в статье не приводится ради экономии места).

Бякус
Пакостную программку с названием «Вирус-бякус» я написал года четыре назад по просьбе одного знакомого. Через некоторое время я вернулся к старому коду и немного его модифицировал — просто интереса ради. Некоторые принципы действия сего прикола я сегодня разъясню. Но сперва — отмазка для компетентных органов: никакого отношения к вирусам сия шутка не имеет. Она запускается исключительно вручную, не размножается, практически не скрывается и легко удаляется большинством пользователей. В общем, обычный первоапрельский розыгрыш, не более того.
Итак, первое, что делает «Бякус» при запуске — это… Ждёт. Надо же дать шутнику скрыться с глаз жертвы, а потом…

[code lang=»delphi»]
if Date>=StrToDate(’31.03.2008’) then
begin
Sleep(60*1000*35);
RunRandomVirus;
end; [/code]

Что же делает функция RunRandomVirus? Главные её элементы — это оператор case и генератор случайных чисел. В самом начале мы генерируем число от 0 до… а вот тут всё зависит от того, сколько шуток вы придумаете. Вот несколько идей:

[code lang=»delphi»]
// Меняем заголовок активного окна
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;[/code]

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

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

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