суббота, 25 октября 2008 г.

Хакерские приколы: Учимся работать с окнами.

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

Невидимый враг.

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

Мы сейчас напишем программу, окно которой нельзя закрыть.

Вы спросите : «А в чем же тут прикол?»

А прикол в том, что вы из-за этой программы не сможете выключить компьютер, простите... нормально выключить компьютер.

Впрочем, если вы приучите кого-то к этой программе, засунув её, к примеру, в Автозагрузку, то мануальное отключение питания станет вполне обычным способом отключения компьютера.

Мелочно, но эффективно – согласитесь :)

Запускаем наше любимое Дельфи и создаем новое приложение, для главной формы которого мы будем использовать обработчик события OnCloseQuery. Данное событие будет генерироваться каждый раз, когда нужно закрыть окно, чтобы подтвердить возможность выполнения этой операции. Здесь нужно добавить только одну строчку:


CanClose := false


Вот как должна выглядеть процедура обработчика этого события:


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

CanClose:=false;

end;


Переменная CanClose передается обработчику события в качестве второго параметра.

По умолчанию она имеет значение true, что означает, что окно МОЖЕТ закрываться.

Но если изменить значение на false, то окно мы уже НЕ сможем закрыть его.

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

Теперь нам надо сделать нашу програмку невидимой.

Делается это следующим образом.

Создаем для главной формы еще один обрабочтик события OnActivate, который генерируется, когда окно уже создано и отображено и, соответственно, требует активации на рабочем столе. Прятать программму будем так:


procedure TForm1.FormActivate(Sender: TObject);

begin

ShowWindow(Handle, SW_HIDE);

ShowWindow(Application.Handle, SW_HIDE);

end;


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

В первой строке мы скрываем главное окно программы, передав функции ShowWindow указатель на это окно(Handle). Окно исчезнет, но оно будет видно в Панели задач, а чтобы убрать его и оттуда, мы снова вызываем функцию, но уже передаем указатель на приложение (Application.Handle).

Теперь запустите программу – она не будет видна. Попробуйте выключить компьютер. Ничего не будет происходить. Windows как работал, так и будет работать.

Почему же комп не вырубился ?

Когда вы выбираете «Завершение работы», то винда посылает всем приложениям сообщение, о том, что они должны завершить работу. Если какое-то приложение отказывается закрываться, то отключение невозможно.


Как закрыть чужое окно ?

Создаем пример, в котором будем искать определенное окно и если оно существует, то будем посылать ему сообщение WM_QUIT, означающее завершение работы.

На главном окне ставим одну кнопку, по нажатию которой(OnClick) будет происходить закрытие окна, которое мы укажем.

Код:

procedure TForm1.Button1Click(Sender: TObject);

var

wnd:HWND;

begin

wnd:=FindWindow(nil, 'Безымянный - Блокнот');

if wnd<>0 then

PostMessage(wnd, WM_QUIT, 1,0);

CloseWindow(wnd);

end;

Тут создается переменная типа HWND для сохранения идентификатора окна, которое мы закрываем. Но для начала мы должны найти это окно, то есть использовать функцию FindWindow. Ей надо передать два параметра: класс окна и текст в заголовке окна.

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

А искать будем по второму параметру, для примера тут указан заголовок создаваемого по умолчанию текстового документа в Блокноте. Результат поиска сохраняем в отдельной переменной wnd. Далее прверяем результат на наличие ненулевого значения, то есть найденного окна, или же наоборот, необнаруженного.

Далее посылаем сообщение этому окошку, в котором содержится:

  • Идентификатор окна
  • Тип сообщения, нас интересует выход – WM_QUIT
  • WParam – первый параметр сообщения
  • LParam – второй параметр сообщения.

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

Тут прикола нет – не ищите, я только показал как это делается, если же вы добавите сюда чуть-чуть воображения, то можете сделать очень много неплохих комбинированных.

It`s up to you – как говорят в англоязычных странах.

Невидимый враг - исходник

Как закрыть чужое окно ? - исходник

воскресенье, 12 октября 2008 г.

Хакерские приколы: «Хакерские приколы» и остальные интересные штучки.

Вероятно, никто не любил в школе Pascal – и я вас понимаю, в школе проходится бессмысленное неприкладное применение этого языка (относительно нас, тинейджеров).

Я убежден, что, чтобы человек научился что-то делать, его надо для начала заинтересовать. Я попробую это сделать.

Нам понадобятся :

Borland Delphi 6.0 или 7.0(1 шт.)
Компьютер (1 шт.)
Руки (2 шт.)
Голова (1-1,5 шт.).

Delphi можно скачать здесь(российский траффик) и здесь(молдавский траффик).

Компьютер можно заказать в любом компьютерном магазине, одолжить у друга и т.д.

Если у вас нет остального, то ничем не могу помочь – все вопросы к родителям.


Урок 1. Подготовка к боевым действиям

Итак, прежде чем приступить к описанию самих пакостей, нужно обеспечить нашей программе несколько вещей:
1. При активации программа должна быть невидимой.
2. Через определенный период программа должна выполнять какое-либо действие.

Для разработки всего этого счастья была выбрана среда Borland Delphi за понятный интерфейс и простоту использования. Несмотря на это, все нижеприведенное можно с таким же успехом реализовать и в любом другом Win32 языке программирования, работающем с WinApi. Как говорится, было бы желание.
Запускаем Delphi. После красивого окошка с логотипом перед нами появляется сама среда разработки. Вверху находятся диалоги открытия/закрытия файлов и панель компонентов (вкладки Standart, Additional и т.д.) Слева находятся Дерево Объектов (Object TreeView) и Инспектор объектов (Object Inspector). Чуть правее от них расположена наша главная форма. Для начала сделаем так, чтобы она (форма) при запуске приложения не была видна. Для этого просто сделайте двойной клик на форме и в открывшемся окошке с кодом введите строчку:

Application.ShowMainForm:=false;

Вновь возвращаемся к форме (F12) и помещаем на нее из палитры компонентов — вкладка System компонент, похожий на маленькие часики. Он называется Timer и позволяет через определенное количество времени передавать управление вашему коду. Выделим его кликом и посмотрим на инспектор объектов. Видите значение Interval=1000? Это значит, что код, записанный в свойстве OnTimer, будет вызываться каждые 1000 мсек, т.е. каждую секунду. Т.е., если вы хотите изменить интервал, через который будет срабатывать ваш прикол, просто измените свойство Interval. Рекомендую для первой пакости установить его значение в 4000. Делаем двойной клик по компоненту Timer и вновь попадаем в окно кода. После проделывания всего вышеприведенного у вас там должен быть следующий код:

unit Unit1;
interface
uses
Windows, Messages, Sys-Utils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ShowMainForm:= false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
{
Именно здесь мы будем писать код, отвечающий за сами шутки}
end;
end.

Если все правильно, значит, фундамент заложен хорошо, и можно с чистой совестью переходить к следующим этапам создания нашего приложения. Весь следующий код будет писаться в обработчике OnTimer, поэтому очень рекомендую после создания основы сохранить ее как хороший шаблон для последующих довесок.

Урок 2. Приколы с блокнотом.

Вы с компьютером когда-нибудь говорили? А он с вами? Серьезно ?!!

Есть довольно много пользователей, которые для набора небольших документов используют встроенный в ОС Windows текстовый редактор "Блокнот". Модификацией этой маленькой и безобидной программы мы сейчас и займемся.
Перейдите в окно кода (F12) и найдите там строчку из одного слова Var. Это слово является сокращением от Variables, и после него описываются все переменные, которые вы хотели бы задействовать в своей программе. Под строчкой Form1: TForm1; напишите:

Mas:array[1..5] of pchar; {здесь мы разместим 5 строк, которые должен будет сказать наш "Блокнот"}
h:hwnd;
{эти 2 переменные нужны, чтобы адресовать текст именно в окошко "Блокнота"}
dc:hdc;
i:byte=1;
{переменная для переключения между выводимыми строками}


В процедуре TForm1.FormCreate добавьте строчки, чтобы она выглядела так:

Procedure TForm1.FormCreate (Sender: TObject);
begin
{1}Application.ShowMainForm:=false;
{2}mas[1]:='Привет';
{3}mas[2]:='Хули смотришь ?? А??';
{4}mas[3]:='Блокнота говорящего не видел?';
{5}mas[4]:='Ваще охуел что ли ?';
{6}mas[5]:='Ну и ладно. Хули мне тут с лохами пиздеть. Молчу.';
end;

Затем модифицируем процедуру TForm1.Timer1Timer следующим образом:

procedure TForm1.Timer1Timer (Sender: TObject);
begin
{7}h:=FindWindow(nil,'Безымянный — Блокнот');
{8}if h<> 0 then begin
{9}dc:=GetDC(h);
{10}textout(dc,5,i*15,mas[i],length(mas[i]));
{11}if i+1<6>
Проверим работоспособность.

Скомпилируйте программу (F9).

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

Теперь запустите Пуск > Программы > Стандартные > Блокнот и наслаждайтесь:). Завершить работу вашего приложения можно, нажав Ctrl+F12.

Теперь немного теории (нужно же хоть чуточку представлять, что ж вы натворили-то:)).

Строка {1}, как было сказано ранее, прячет наше приложение от глаз пользователя (но не от Ctrl+Alt+Del).

Строки {2}-{6} описывают то, что будет печататься в нашем "Блокноте". Модифицируйте их на свое усмотрение.

Строка {7} получает дескриптор окна "Блокнота" по его заголовку (это надпись вверху окна на синем фоне). Поэтому программа будет работать только с "Блокнотом", в который не загружен текстовый файл.

Строка {8} проверяет, найдено ли это окно. Если да, то работают строки {9}-{11}.

В строке {9} мы по дескриптору окна "Блокнота" получаем его контекст устройства (белая область, куда будут выводиться надписи).

В строке {10} мы выводим саму надпись в "Блокноте". Надпись хранится в массиве

mas[i] — их мы задавали выше.

Строка {11} проверяет, будет ли переменная i при увеличении лежать в пределах [1-5], и увеличивает ее для отображения в следующий раз новой строки.

Сохраним программу (Ctrl+S). Вам придется сохранить два файла: файл с кодом (имя давайте любое) и имя проекта (совпадает с именем *.exe-файла). Проект нужно называть так, чтобы даже если прога будет обнаружена, то решили бы, что это системный файл. Примеры: winsys32.exe, kern32.exe и т.д. Теперь достаточно запустить *.exe-файл (лежит там, куда вы сохраняли проект) и спокойно ждать, когда жертва запустит "Блокнот". В случае, если жертва попытается отвечать компьютеру, можно смело вызывать санитаров и ждать устранения «человека, открывшего в своём ПК Искусственный Интеллект».


Урок 3. Что можно придумать с окошками сообщений ??

Не сомневаюсь, что на компьютере-жертве стоит ОС Windows, которая ни фига нелицензионная. Но, поскольку бедного дядю Билла все ругают и обижают, нужно сделать хоть одно доброе дело на благо его благ:). А именно — напоминать о том, что Windows нужно регистрировать, каждые 5 минут. Посему снова загружаем наш фундамент, устанавливаем значение Interval в 300000 (в инспекторе объектов для объекта Timer) и дописываем пару строчек в процедуре TForm1.Timer1Timer:

Procedure TForm1.Timer1Timer (Sender: TObject);
begin
if GetDesktopWindow<> 0 then begin
MessageBox(GetDesktopWindow,'Срок действия лицензии вашей системы истек.', 'Windows XP', MB_OK);
end;
end;

И каждые 5 минут на бедного пользователя будет вываливаться веселое окошко.

Опять немного теории. В этой программке все гораздо проще. Все взаимодействие с системой осуществляется по дескриптору окна, которое есть почти всегда. Это окно — ваш рабочий стол. Получить его дескриптор можно с помощью функции GetDesktop Window.
А процедура MesageBox выводит само сообщение, где сначала выводится текст послания ('Срок действия лицензии вашей системы истек'), а потом заголовок окна ('Windows XP'). Запускаем… наслаждаемся:).

Урок 4. Прикалываемся далее с железками – работаем с CD-приводом.

Грузим наш фундамент и выставляем компоненту Timer значение Interval в 600000 (10 мин). Затем в обработчике OnTimer пишем:

procedure TForm1.Timer1Ti-mer(Sender: TObject);
begin
MessageBox(GetDesktopWindow, '
Бля !! Где мой диск ???', 'CD-ROM', MB_OK);
mciSendString('Set cdaudio door open wait', nil, 0, handle);
end;


Ищем в программе строчку, начинающуюся со слова Uses (искать вверху кода).
После этого слова в Delphi описываются имена подключаемых модулей. Для работы программы нужно в конце дописать

MMSystem;

Компилируем (F9) и... каждые 10 минут у бедного юзера будет выскакивать нижеприведенное окошко, просящее диск, и открываться привод CD-ROM'а.
Для закрытия CD-ROM'а можно добавить одну строчку в нашу программу:


MessageBox(GetDesktopWindow,'Бля !! Где мой диск ??? ', 'CD-ROM', MB_OK);
mciSendString('Set cdaudio door open wait', nil, 0, handle);
mciSendString('Set cdaudio door closed wait', nil, 0, handle);



Готово.

Продолжение уроков следует...