DELPHI и ХАКЕР. Как отомстить "врагу" средствами Windows.pas

Источник: realcoding
Трофим Роцкий

Делу, как известно, время, но и потехе опять же час :). При чем тут модуль Windows? А кому захочется тащить на "вражеский" компьютер софтину в 400 КБ, которая только и может, что спрятать панель задач и иконки? Правильно, тому, кто не знает свойств консольного приложения. Но мы-то с вами тянемся к знаниям ;), так что сейчас создадим полноценную программу, чьи настройки можно будет редактировать, и она будет весить ровно в 40 раз меньше, чем описанная выше.

Итак, создам консольную программу [File>New>Other>Console Application]. Только чур! - шутка будет безболезненной, а то можно и в нос схлопотать.
Итак, наш исполняемый файл можно будет настраивать. Логичнее всего это сделать извне, т.е. из файла с конфигом, чтобы не светиться во "вражеской" системе MS-DOS'овским окошком консоли. Поэтому удалите строку "{$Apptype Console}" и в разделе Uses оставьте только модуль Windows. Теперь ненадолго сверните Delphi и с помощью Блокнота создайте в той же директории, что и наше приложение, текстовый файл следующего содержания:

0{скрыть Crl+Alt+Del}
1{менять системные цвета}
0{менять местами кнопки мыши}
1{показывать сообщение: "Windows must die!"}
1{выключиться после одного сеанса}

Назовите его, скажем, "Config.txt". Он состоит из пяти строк; каждая строка отвечает за "свою" функцию. 0 - не задействовать данную "опцию" во время работы программы, 1 - задействовать (false и true). Справа БЕЗ ПРОБЕЛА помещаются комментарии, чтобы мы не позабыли, какая строка за что отвечает. (Здесь показан пример настроек, где отключение Ctr+Alt+Del и смена кнопок мыши неактивны, а остальное работает.)
Таким образом, нужно только связаться с данным файлом, перебрать каждую строку - с помощью цикла for…to, как вы уже догадались. Когда вся информация будет принята приложением, ее придется постоянно держать в памяти с помощью динамического массива.
Я думаю, вам не нужно объяснять, что есть динамический массив, но, чтобы освежить свою и вашу память, напомню. Продекларируйте:

JokeType: Array[1..10] of Boolean;

Здесь содержится 10 значений, 10 различных переменных типа boolean, способных - вам известно - принимать только значения false или true. И данный-то массив помнит это значение персонально для каждого из своих десяти членов. (Я намеренно сделал их так много, чтобы побудить вас добавить в программу новые функции). Указав в квадратных скобках номер интересующей нас переменной, мы получаем для нее возвращаемое значение true/false, соответствующее ей. Прочее, думаю, понятно из листинга.

program Joke;

uses
Windows;

const
SysColorArray: array [0..13] of Integer = (COLOR_ACTIVEBORDER, COLOR_ACTIVECAPTION, COLOR_APPWORKSPACE, COLOR_BACKGROUND, COLOR_BTNFACE, COLOR_BTNTEXT, COLOR_CAPTIONTEXT, COLOR_INACTIVEBORDER, COLOR_INFOTEXT, COLOR_MENU, COLOR_MENUTEXT, COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWTEXT);
ColorArray: array [0..12] of Integer = (16776960, 0, 16711680, 65535, 16711935, 32768, 8388608, 255, 12632256, 16777215, 15780518, 128, 32896);
//Цвета хранятся в модуле Graphics.pas, 
//но мы не будем использовать его,
//а запишем цвета в цифровом виде.

var
F: TextFile; //наш файл с настройками
S: ShortString;
i: Smallint;
h: hwnd;
JokeType: Array[1..10] of Boolean; //наш массив

function CheckLine(Line: ShortString): Boolean;
var
n1,n2: Smallint;
begin
//удаляем из строки комментарии
Result:=false;
n1:=pos('{',Line);
n2:=pos('}',Line);
delete(Line, n1, n2);
if Line='1' then result:=true;
end;

begin
AssignFile(F, 'config.txt'); //соединяемся с файлом
Reset(F); //перемещаемся в начало файла
for i:=1 to 10 do begin //читаем все строки
ReadLn(F, s);
JokeType[i]:=CheckLine(S);
end;
CloseFile(f); //отсоединяемся
//начинаем шутить :)
Randomize;
if JokeType[1] then //отключаем Ctrl+Alt+Del
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
//запускаем бесконечный цикл:
while true do begin
Sleep(10000); //ждем 10 секунд
//меняем системные цвета:
if JokeType[2] then
SetSysColors(1, SysColorArray[random(13)], ColorArray[random(12)]);
//меняем кнопки мыши местами
if JokeType[3] then begin
SwapMouseButton(true);
Sleep(3000);
SwapMouseButton(false);
end;
if JokeType[4] then MessageBox(h,'Windows must die!','Error',0);
if JokeType[5] then Halt; //выключаемся
end;
end.

Вот и всё. Еще надо бы наше детище в StartUp запихнуть, но об этом - в следующий раз.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=30622