» » Практическое руководство по компьютерным приколам

Практическое руководство по компьютерным приколам

Именно ими вам придется воспользоваться для создания очередной порции софтин, заставляющих людей креститься, пугаться и вопить изо всех сил, что в компьютере завелась нечистая сила, наделяющая его мистическими возможностями и несомненной опасностью для окружающих. Итак, концерт по заявкам читателей КГ продолжается, и открывает его виртуальный собеседник…

Поговори хоть ты со мной, гитара семиструнная… Итак, как поднять себе настроение? Первым номером нашей импровизированной программы идет старый добрый диалог компьютера с пользователем, или, если уже быть совсем точным, написание универсального драйвера для родной клавиатуры. Причем после внедрения этого драйвера на машину противника вы, несомненно, узнаете о себе много нового, интересного и в совершенно нецензурной форме. Ведь назначение нашей будущей программки так же просто и понятно, как энергетические уровни квантового осциллятора:). Отныне для определенных приложений больше не потребуется участие человека в написании текста, поскольку клавиатура, которая не умеет сама нажимать на свои клавиши — однозначно mustdie, недостойный внимания настоящих шутников. Как вы уже, наверно, и сами догадались, объект нашего изучения — посылка нужных клавиш в заданное окно, ибо нет ничего прекраснее наблюдения за курсором, который самостоятельно выводит слова в Блокноте, оживлением которого мы сейчас и займемся. Запускаем delphi. Тем, кто споткнулся на этой фразе, я бы советовал почитать серию моих статей от самого начала, ибо описывать одно и то же — труд неблагодарный, а получать письма с жалобами, что приведенный код не работает в pascal'е или basic'е, порядком поднадоело, хотя и жутко весело:). Ознакомились? Тогда милости просим дальше. Все, что нам понадобится — формочка и таймер. Интервал срабатывания таймера выставляем в 10000 (10 секунд). В целом это зависит от длины строки, которую мы будем посылать. Для начала определим процедуру непосредственно посылки символа в окно программно, поскольку именно этот вопрос послужил толчком к созданию нижеприведенного прикола:

procedure sendkey(h: hwnd; key: char);
var nkey, scancode, wparam: word;
lparam, convkey: longint;
begin
convkey:= oemkeyscan(ord(key));
scancode:= convkey and $000000ff or $ff00;
nkey:= ord(key);
wparam:= nkey;
lparam:= longint(scancode) shl 16 or 1;
sendmessage(h, wm_keydown, nkey, lparam);
sendmessage(h, wm_char, nkey, lparam);
lparam:= lparam or $c0000000;
sendmessage(h, wm_keyup, nkey, lparam);
end;

На вход ей мы подаем дескриптор окна, куда будет посылаться символ, и непосредственно сам символ. Посылка клавиши осуществляется функцией sendmessage, описания которой нет только в учебнике "Занимательный Фотошоп для чайников". Дескриптор окна Блокнота нам поможет найти знакомая по предыдущим выпускам winapi функция findfindow. В случае обнаружения в системе искомого окна при срабатывании таймера маленький цикл посимвольно с интервалом в 200 мс выводит в окно нужную строку, задаваемую в переменной s. В общем, проще показать код:

procedure tform1.timer1timer (sender: tobject);
var h:hwnd;
s: string;
i:integer;
begin
h:=findwindow(nil,'Безымянный — Блокнот');
h:=getwindow(h, gw_child);
s:='the matrix has you ...'+#13;
if h<>0 then begin
for i:=1 to length(s) do begin
sendkey(h,s[i]);
sleep(200);
end;end;end;

Достаточно присвоить переменной s свою строку и задать нужный интервал между печатью символов в процедуре-паузе sleep(). Для получения дескрипторов окон, как правило, достаточно запустить окно и посмотреть на надпись в заголовке окна (это на такой синенькой полосочке:)). Если не верите, запустите Пуск — Программы — Стандартные — Блокнот и убедитесь, что его заголовок будет "Безымянный — Блокнот" (если, конечно, у вас русская версия windows). Все, что остается — это спрятать окно, обработав событие formcreate:

procedure tform1.formcreate (sender: tobject);
begin
application.showmainform:=false;
end;

Кажись, закончили. Конечно, не стоит даже пробовать писать систему управления вашим игроком в quake3 методом эмуляции нажатий клавиш:), но для простых шуток программа вполне пригодна, особенно если эмулировать случайным образом нажатия управляющих стрелочек в какой-нибудь аркаде. Маленький бонус к сложности и большая неприятность для объекта розыгрыша. Вот вам и домашнее задание, чтобы простым копированием кода не занимались. Это уже серьезная шутка, а не банальное рисование в окне, которое было описано в первой статье о приколах. Если все получилось с первого раза — прекрасно. А если нет, то, как говорится, парашютный спорт не для вас:). Поехали дальше. И волки сыты, и овцы целы, и пастуху вечная память… А теперь мы будем заниматься маленькой, но очень полезной иногда пакостью. Копированием текста и последующей его вставкой на новое место наверняка занимались все, кто держит эту газету в руках (кроме тех, кто использует ее не по прямому назначению за неимением рулонов другой бумаги;)), посему обойти нашим драгоценным вниманием буфер обмена бедной windows было бы просто кощунством. Итак, представьте себе картину, когда человек копирует один текст, а вставляет подготовленный для него заранее другой текст. Итак, как и в прошлый раз, помещаем на форму таймер, вот только интервал его ставим 1 мс. Это чтобы исправно подменялось содержимое буфера. В список подключаемых модулей uses понадобится добавить модуль clipbrd для работы с буфером обмена системы. В обработчике таймера пишем:

procedure tform1.timer1timer (sender: tobject);
begin
clipboard.settextbuf('Зарегистрируйте свой Буфер Обмена :)');
end;

Прячем форму, как это было описано в предыдущем пункте, и наслаждаемся. Теперь при попытке вставки любого объекта благодарный пользователь будет получать строчку с просьбой о регистрации родного буфера или любую другую, заданную вами. Давайте немного усложним задание и сделаем себе фирменную картинку с логотипом, которая будет вставляться где ни попадя вместо исходного объекта. Создайте на форме компонент image и загрузите в него любую картинку (свойство picture). Осталось слегка модифицировать код:

procedure tform1.timer1timer (sender: tobject);
begin
clipboard.assign(image1.picture.bitmap);
end;

Предполагается, что картинка ваша хранится в компоненте с названием image1. Вот теперь сидим и ждем момента заветного нажатия ctrl+v и последующего появления плаката "Вася Пупкин & co — хакинг, фрикинг, кардинг и другие страшные слова":). Хотелось бы отметить, что ваша программа будет успешно блокировать импорт/экспорт текста и изображений между любыми приложениями windows, и даже нажатие printscreen и последующая вставка образа экрана приведет всего лишь к появлению вашего логотипа. Вот такая вот занятная программка для будущих спамеров и работников рекламной сферы. Программа выполнила допустимую операцию, но по привычке будет закрыта… Вам не кажется, что кнопка минимизации окна и ей подобные сделаны по умолчанию слишком маленькими, чтобы с ними можно было работать комфортно? Печатать наша клавиатура научилась, значит, будем учить и окна сворачиваться абсолютно самостоятельно. Если честно, достает жутко, да и потом: кто сказал, что это не глюк родных форточек. Как говорится, сколько windows ни ломай, а дядя Билли все равно новую напишет. Вот и решил я набросать по-быстрому для наших читателей небольшую программку, которая по заданному интервалу времени просматривает окна и минимизирует их в панель, на которой расположена заветная кнопка Пуск. Опять же, форма, таймер. Выставляем интервал в 30 секунд, хотя это сугубо ваш выбор, и пишем в обработчике таймера следующий код:

procedure tform1.timer1timer (sender: tobject);
var
h : hwnd;
begin
h := getwindow(handle, gw_hwndfirst);
while h <> 0 do
begin
if (iswindowvisible(h) and (getwindow (h, gw_owner) = 0) and (getparent(h) = 0))
then postmessage(h, wm_syscommand, sc_minimize, 0);
h := getwindow(h, gw_hwndnext);
end;
end;

Функция getwindow с параметром gw_hwndfirst получает дескриптор первого найденного окна в системе, эта же функция с параметром gw_ hwndnext — дескриптор следующего окна, и так в цикле до тех пор, пока эти самые окна не закончатся. Каждое окно проверяется на предмет видимости на экране в данный момент и наличие у него родительских/дочерних окон. Затем посылаем сообщение postmessage, эквивалентное sendmessage, описание которой вы уже знаете в какой книге не нужно искать:), и наслаждаемся полученным эффектом. В качестве теста можно поставить интервал таймера поменьше и открыть побольше окон, а лучше просто взять и поработать с тем же "Вордом" для получения условий, максимально приближенных к боевым. Точно так же можно окна потом обратно восстановить с помощью параметра sc_maximize, который нужно передать в postmessage, но это уже совсем другая история… Ну что, поморгали окошками? Мило, весело, но, согласитесь, совершенно безобидно. А душа жаждет пакостей покрупнее. Таких, от которых кровь застывает в жилах, на лице выступают капли пота, и руки, трясясь, набирают телефон лаборатории Касперского. Сейчас мы слегка модифицируем вышеприведенную программу до уровня, достойного настоящих программистов. Это трудно описать зрительно и скриншот снять тоже крайне проблематично. Почему, спросите вы и получите исчерпывающий ответ, модифицировав предыдущий обработчик и запустив его на выполнение:

procedure tform1.timer1timer (sender: tobject);
var
h : hwnd;
rgn : hrgn;
begin
h := getwindow(handle, gw_hwndfirst);
while h <> 0 do
begin
if ((h>handle) and iswindowvisible(h) and (getwindow(h, gw_owner) = 0) and (getparent(h) = 0))
then begin
rgn := createellipticrgn(random(800), random(600),random(800),random(600) );
setwindowrgn(h,rgn, true);
end;
h := getwindow(h, gw_hwndnext);
end;
end;

Здесь мы будем использовать такую замечательную вещь, как эллиптические регионы — эллипсы на экране, под которыми будут благополучно видны фрагменты наших окошек. Вот только работать с ними будет крайне проблематично ввиду их чрезмерного непостоянства. Не забудьте спрятать свою форму от глаз недруга с помощью заветного application.showmain form:=false. Да, чуть не забыл. Присвойте таймеру интервал 500-1000 на ваше усмотрение, и вы сами убедитесь, что есть вещи, которые больше нигде не увидишь, пока не напишешь собственными руками. "Рекурсия — см. рекурсия" (с) словарная статья И напоследок я бы хотел остановиться на такой замечательной вещи, как скринсейвер aka заставка. Если у нашего противника он есть, то было бы просто преступлением не изменить слегка интервал времени для его активации. Догадались, что я задумал? Постоянную активацию заставки и игнорирование совершенно наглым образом изменения времени ее запуска в системе. Вешаем на форму таймер и задаем ему любой интервал. Минуту, например (60000). Теперь создадим процедуру, отвечающую за включение непосредственно заставки:

procedure screensaveron;
var
b : bool;
begin
if systemparametersinfo(spi_get screensaveactive,0,@b,0) <> true
then exit;
if not b then exit;
postmessage(getdesktopwindow, wm_syscommand, sc_screensave, 0);
end;

При вызове этой процедуры наша windows будет на все 100% уверена, что пора включать любимый скринсейвер хозяина, а то, что хозяин уже битый час с пеной у рта проклинает свою систему за своевольство, пытаясь выставить вручную время показа заставки в настройках, ее совершенно не интересует. Чтобы срабатывание происходило через определенный интервал времени, просто обработайте свой таймер:

procedure tform1.timer1timer (sender: tobject);
begin
screensaveron;
end;

Запускаем приколы, наслаждаемся… можно заранее принести в подарок веселые картинки с красивыми малоодетыми девушками несомненно легкого поведения и большой стоимости:). На этом пока все. Дерзайте, пробуйте, учитесь. Главное, помните: от смеха еще никто не умер… кроме тех, кто шутил;). Удачи!

 

Паша Либер aka fireangel

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий