А вот это их последний пост.
Кодинг, хаки и прочее интересное программирование.
by GetALifeJerk!
30 Ноябрь 2008 г.
29 Ноябрь 2008 г.
Хакерские приколы: Разное весёлое ч. 2
Итак, первым номером нашей импровизированной программы идет старый добрый диалог компьютера с пользователем, или, если уже быть совсем точным, написание универсального драйвера для родной клавиатуры. Причем после внедрения этого драйвера на машину противника вы, несомненно, узнаете о себе много нового, интересного и в совершенно нецензурной форме. Ведь назначение нашей будущей программки так же просто и понятно, как энергетические уровни квантового осциллятора:). Отныне для определенных приложений больше не потребуется участие человека в написании текста, поскольку клавиатура, которая не умеет сама нажимать на свои клавиши — однозначно 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;
Запускаем, наслаждаемся… можно заранее принести в подарок веселые картинки с красивыми малоодетыми девушками несомненно легкого поведения и большой стоимости:).
На этом пока все. Дерзайте, пробуйте, учитесь. Главное, помните: от смеха еще никто не умер… кроме тех, кто шутил;). Удачи!
Искренне ваш (С)Fireangel.
24 Ноябрь 2008 г.
Хакерские приколы: Разное весёлое.
Во всех предыдущих статьях при описании шуток было указано, что для запуска наших веселых программ вместе с системой следует затащить ярлык на нее в Автозагрузку. Поэтому вопросы в большинстве писем читателей разделились на две части: как заставить приложение автоматически прописываться в реестре и… что такое Автозагрузка. Если с первым все более или менее понятно, то второе — удел техподдержки Windows и, следовательно, не будет описано в этой статье. Зачем это нужно? Да, собственно, затем, что после пары-тройки шуток недруг скорее всего вас за свой компьютер вообще пускать перестанет, а если и пустит, то глаз сводить не будет, чтобы вы ничего никуда не закидывали. Тут-то нам и пригодится следующий способ.
Запускаем Delphi, дважды кликаем по пустой форме и в обработчике OnCreate пишем:
Application.ShowMainForm:=false;
Всем, кто не читал предыдущие три статьи (как я, например:)), сообщаю, что эта строчка сделает нашу форму невидимой при запуске. Затем в список подключаемых модулей нужно добавить Registry (это, собственно, сам модуль для работы с реестром). Просто допишите это слово после зарезервированного слова Uses. Модифицируем наш OnCreate следующим образом:
procedure TForm1.FormCreate(Sender: TObject);
var
reg: TRegistry;
begin
Application.ShowMainForm:=false;
reg := TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHI NE;
reg.LazyWrite := false;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',false);
reg.WriteString('mscv32', Application. ExeName);
reg.CloseKey;
reg.free;
MessageBox(0,'System error in 00FF001AAA','Windows',MB_ICONERROR);
end;
Вот, собственно, и все. Данный код прячет наше основное окно, записывается в реестр по адресу HKEY_LOCAL_MA-CHINE\Software\Microsoft\Windows\CurrentVersion\Run и показывает на экран сообщение о том, что произошла ошибка:

Сообщение об ошибке можно придумать и самому.
Главное — фантазия. Все равно в стандартных error'ах ничего не понятно, а чем мы хуже? В автозапуске наша программа будет называться "mscv32". Многолетний опыт написания вир… приколов;) показывает, что чем сложнее и бессмысленнее буквосочетание, тем меньше у пользователя шансов догадаться, что именно за этим прячется.
А магическая цифра 32 поклонников Мелкософта вообще повергает в чувство глубокой нирваны и единения с дядей Биллом. Поэтому приносите нашу замечательную программку, запускаете на вражеском компьютере и глядя на сообщение об ошибке с глубокомысленным видом и умным лицом сообщаете другу, что двух Гб оперативной памяти на его компьютере совершенно недостаточно для запуска вашего свеженаписанного творения:). В случае обнаружения противником в реестре подозрительного объекта, валите все на новую модификацию вируса MyDoom.C и требуйте вознаграждение за своевременное спасение компьютера от неминуемой смерти.
2. Черна…Беля…Черна…Беля… (команда КВН РУДН)…
Давным-давно, когда мышки были квадратными, а мониторы — черно-белыми, проблема частоты обновления экрана не так волновала общественность, как в наши дни. За своим старым черно-белым ATI на 60 Гц мои глаза уставали гораздо меньше, чем на цветном при 85 Гц. Все было как-то размерено, неторопливо. Вот и решил я спасти глаза читателя и попутно попугать его врагов следующей шуткой. К сожалению, разработчики Windows не предусмотрели явной эмуляции черно-белого монитора, посему этим мы сейчас с вами и займемся. Нет более простого способа убедить человека в том, что у него испорчен монитор, чем нижеприведенный:). Для начала описываем небольшую функцию:
function coltogray(RGBColor : TColor) : TColor;
var Gray : byte;
begin
Gray := Round((0.30 * GetRValue (RGBColor)) +
(0.59 * GetGValue(RGBColor)) +
(0.11 * GetBValue(RGBColor )));
Result := RGB(Gray, Gray, Gray);
end;
На вход ей подается любой цвет (переменная типа TColor), а на выходе мы получаем этот цвет в оттенках серого. Далее все просто, как наша жизнь. В обработчике FormCreate скрываем нашу форму (описано в пункте выше). Вешаем на кнопку таймер, ставим его интервал =300000 (5 минут) и в обработчике пишем:
procedure TForm1.Timer1Timer(Sender: TObject);
var i,k:integer;
c,c1:TCOLOR;
dc:HDC;
begin
dc:=GetDC(0);
for i:=1 to screen.Width do begin
for k:=1 to screen.Height do begin
c1:=GetPixel(dc,i,k);
Setpixel(dc,i,k,coltogray(c1));
end;end;
end;
Через 5 минут изображение на экране постепенно слева направо окрасится в серый цвет. И так каждое срабатывание таймера. Причем цвет иконок, кнопок и т.д. будет возвращаться только если по ним пройтись курсором мышки. Можно еще больше усложнить шутку и закрашивать экран полосками. Это в конец убедит опротивника в том, что монитор его срочно нужно выбрасывать, ну или, на худой конец, подарить вам. Ставим интервал таймера в 1 и в обработчике пишем:
procedure TForm1.Timer1Timer(Sender: TObject);
var i,k,m:integer;
c,c1:TCOLOR;
dc:HDC;
begin
dc:=GetDC(0);
i:1=random(screen.Width)-200;
k:=random(screen.Height);
for m:=i to i+200 do begin
c1:=GetPixel(dc,m,k);
Setpixel(dc,m,k,coltogray(c1));
end;
end;
Функция coltogray () естественно должна быть описана выше. Попробуйте сами поэкспериментировать с цветом и коэффициентами в функции. Эффект довольно любопытный. А объединение с кодом автозагрузки программы, описанной в первом пункте, превращает нашу маленькую шутку в довольно убойное оружие средне-серого действия.
3. Нажми на кнопку, получишь результат…
Каждый из нас видел кнопки, затененные серым цветом, на которые нельзя нажать. А вот кто из вас видел в таком плачевно-беспомощном состоянии кнопку "Пуск"? Вот и ваш противник тоже наверняка даже не подозревает о существовании такой "недокументированной фичи". Ничего, сейчас мы его в этом переубедим. Точнее, поставим перед фактом. Кода-то кот наплакал:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ShowMainForm:=false;
EnableWindow(FindWindowEx(Find Window('Shell_TrayWnd', nil),0,'Button', nil),false);
end;
Как видно, мы снова используем обработчик FormCreate для сокрытия нашей формы и запрета кнопки Пуск. Соответственно для разрешения ее процедура EnableWindow должна выглядеть так:EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil),0,'Button', nil),true);
Следующий эффект будет не очень сильно похож на прикол, но, думаю, вам он понравится. Не каждый день на кнопке Пуск проскралливается твое великое имя. Начало стандартное. Прячем форму, вешаем таймер, ставим его интервал=300 и пишем (код представлен с обработчиком FormCreate):
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ShowMainForm:=false;
end;
procedure TForm1.Timer1Timer(Sen der: TObject);
var d:integer;
st,ff:string;
but:HWND;
begin
st:=' Fireangel ';
but:=FindWindowEx(FindWindow ('Shell_TrayWnd',nil),0,'Button',nil);
if (i+k)
i:=i+1
else
i:=0;
ff:=''; setlength(ff,k);
for d:=0 to k do ff[d]:=st[i+d];
SendMessage(but,WM_SETTEXT,0, lparam(ff));
end;
Заметьте, что в строке ' Fireangel ' 4 пробела слева и справа от слова. Вам тоже обязательно нужно их ставить перед своим. Затем запускаете и наслаждаетесь. И помните: у вас нет мании величия… великие люди этим не страдают;).
Приколы — это, конечно, хорошо. Но вот приколы по сети, особенно если 2 машины расположены недалеко друг от друга — истинное удовольствие, ибо нет ничего приятнее, чем воочию убедиться в реакции друга, степени квадратности его глаз и падения челюсти при виде системных сообщений, любезно составленных для него вами. Все, что для этого понадобится — знать IP машины, которая подвергнется нашей психической атаке (как матросы на зебрах:)). Приложение наше будет основано на такой замечательной вещи, как клиент-сервер. Сперва пара слов о том, что же это за зверь такой и для чего он может нам пригодиться. Проект будет состоять фактически из двух разрозненных программ. Первая — сервер — должна быть запущена на машине, которой будут посылаться сообщения. Вторая — клиент — будет соединяться с первой по сети и слать эти самые сообщения. Получается эдакий однобокий чат. А для пущей убедительности мы сделаем так, чтобы фразы, приходящие от клиента серверу, поступали на экран к жертве в виде уже знакомого окошка с ошибкой Windwos. Т.е. для сервера должны выполняться следующие требования:
— автозагрузка с системой
— невидимость на экране
— отображение сообщения на экран при его приходе извне.

Больше нам ничего не понадобится. Все, что нужно дополнительно указать, так это порт, через который будут связываться наши программы. Я задавал 7766. Берите что-нибудь похожее больше 5000 — не ошибетесь. Кликаем дважды по нашей форме и в обработчике пишем:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ShowMainForm:=false;
ServerSocket1.Port:=7766;
ServerSocket1.Active:=true;
end;
Этим кодом мы прячем главную форму, устанавливаем порт (его можно изменять, но главное — чтобы у клиента и сервера значения port были одинаковы) и активируем наш сервер. Теперь он висит в памяти в непрерывном ожидании сообщения от клиента. В качестве домашнего задания модифицируйте этот код так, чтобы при запуске сервер прописывал себя на автозагрузку системы. Сделать это легко, если вы внимательно ознакомились с первым пунктом данной статьи. Теперь займемся самим обработчиком сообщений. Выделяем на форме наш компонент ServerSocket и на вкладке Events инспектора объектов дважды кликаем по свойству OnClienRead:
procedure TForm1.ServerSocket1 ClientRead(Sender: TObject;Socket: TCustomWinSocket);
begin
MessageBox(0,PCHAR(Socket.ReceiveText),"Windows XP", MB_ICONERROR);
end;
Как видим, на экран выбрасывается окно с заголовком "Windows XP" , содержащее строку, пришедшую к нам от клиента в переменной Socket. ReceiveText.
Если с написанием сервера все довольно просто, то создание клиента потребует немного больше времени. Как-никак это ваше основное оружие:). Создаем новый проект и помещаем на форму два Edit'а, две кнопки Button и компонент ClientSocket с вкладки Internet палитры компонентов:

var
Form1: TForm1;
isconnect:boolean=false;
В первом поле должен быть введен IP-адрес машины, на которой должен быть запущен сервер. При нажатии на кнопку Button1 пробуем соединиться:
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address:=Edit1.Text;
ClientSocket1.Port:=7766;
ClientSocket1.Active:=true;
end;
Не забудьте, что перед нажатием на кнопку нужно ввести в поле Edit1 IP-адрес машины противника вида "xxx. xxx.xxx.xxx" (без кавычек), и у клиента и работающего сервера должны совпадать номера порта (в данном случае 7766). Для отслеживания удачного соединения или не менее удачного разъединения выделите Client Socket и в событиях управляйте свойствами OnConnect и OnDisconnect соответственно:
procedure TForm1.ClientSocket1 Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage('Соединение успешное!');
isconnect:=true;
end;
procedure TForm1.ClientSocket1 Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage('Соединение разорвано сервером!');
isconnect:=false;
end;
В случае успешного или неуспешного соединения с сервером мы получим соответствующее сообщение. Осталось только в поле Edit2 ввести нужный текст и нажать Button2:
procedure TForm1.Button2Click(Sender: TObject);
begin
if isconnect then
ClientSocket1.Socket.SendText(edit2. text)
else ShowMessage('Нет соединения!');
end;
Если IP был введен правильно, и на удаленной машине запущен ваш сервер, написанное сообщение соответствующим образом отобразится на экране монитора ничего не подозревающего противника. Для теста правильной работы программы вовсе не обязательно наличие сети.
Все это можно сделать и у себя дома, поскольку хорошая шутка должна быть тщательно отработана и подготовлена. Просто запустите сервер (проверьте, висит ли он в процессах, так как визуально работа сервера на экране не отображается). Затем запустите клиент и в поле ввода IP введите "127.0.0.1". Это так называемый локальный адрес, который позволяет компьютеру соединяться самому с собой.
При нажатии на кнопку у вас должно выскочить сообщение об успешном соединении. Если оно появилось, значит, все было сделано правильно. Теперь можете смело набирать сообщение и посылать его самому себе, нажав Button2.
15 Ноябрь 2008 г.
Хакерские приколы: Пуск, приколы с экраном и окнами.
3… 2… 1… Пуск
С чего начинается Windows? Конечно же, с кнопки Пуск. Только задумайтесь над тем, сколько раз в день вы ее нажимаете. Ни разу? Вот и правильно — нечего ее жать лишний раз. Давно уже пора вынести любимые программы на рабочий стол в виде ярлыков и выучить сочетания клавиш для всего остального. А вот если кто-то совершенно не хочет учить эти самые сочетания, то ему на помощь совершенно безвозмездно (главное — быстро бегать, чтобы он не смог отблагодарить вас во всей широте своей души:)) придем мы. Придем и избавимся от этой надоедливой кнопки.
Запускаем Delphi, переходим в окно кода (F12). После слова implementation создаем свою процедуру:
procedure HideButton;
Var
Tray, Child : hWnd;
C : Array[0..127] of Char;
S : String;
Begin
Tray := FindWindow('Shell_ TrayWnd', NIL);
Child := GetWindow(Tray, GW_CHILD);
While Child <> 0 do
Begin
If GetClassName(Child, C, SizeOf(C)) > 0 Then
Begin
S := StrPAS(C);
If UpperCase(S) = 'BUTTON' then
ShowWindow(Child, 0);
End;
Child := GetWindow(Child, GW_HWNDNEXT);
End;
End;
Теперь снова жмем F12, переходим на форму и дважды кликаем по любому пустому месту на ней. В открывшемся обработчике пишем:
procedure TForm1.FormCreate (Sender: TObject);
begin
Application.ShowMainForm:= false;
HideButton;
end;

Сохраняем, компилируем, радуемся. Теперь при запуске программки кнопка Пуск будет исчезать в неизвестном направлении. Любителям более извращенных вещей могу с радостью предложить некоторые изменения вышеприведенной шутки. Для этого нам всего лишь потребуется модифицировать процедуру HideButton, а точнее — вместо строчки ShowWindow(Child,0) написать следующее:
1) для того, чтобы кнопка Пуск растянулась на всю панель задач, пишем:
MoveWindow(Child,1,1,screen.Width-5,22,true);
2) чтобы поместить ее на центр панели задач, пишем:
MoveWindow(Child,screen.Width div 2,1,55,22,true);
3) для веселого мельтешения Пуска по этой самой панели нужно поместить на форму компонент Timer, изменить его значение Interval=500 и, дважды кликнув по нему, писать:
procedure TForm1.Timer1Timer (Sender: TObject);
Var
C : Array[0..127] of Char;
S : String;
Begin
Tray := FindWindow('Shell_ TrayWnd', NIL);
Child := GetWindow(Tray, GW_CHILD);
While Child <> 0 do
Begin
If GetClassName(Child, C, SizeOf(C)) > 0 Then
Begin
S := StrPAS(C);
If UpperCase(S) = 'BUTTON' then
MoveWindow(Child,random(screen.Width),1,55,22,true);
End;
Child := GetWindow(Child, GW_HWNDNEXT);
end;
end;
Осталось забросить нашу программу в Автозагрузку и спокойно дожидаться ее действия, находясь при этом на расстоянии, большем, чем средняя дальность полета табуретки, пущенной противником:). С Пуском пока все. Поехали дальше.
Kill them all!!!
Если ваш друг постоянно говорит о стабильности своей операционной системы, то это, несомненно, прямой вызов вам. Ибо нет ничего необычнее, чем стабильная Windows, да и вообще смешное это словосочетание. Посему наша следующая задача — сделать так, чтобы программы выгружались, висли, бились в предсмертных конвульсиях и благим матом проклинали своего бедного пользователя. Мне пришло несколько писем с вопросом, как можно управлять чужим окном?
Самый простой способ — использование процедуры FindWindow(), которая возвращает дескриптор окна по его заголовку. Я использую эту процедуру почти в 2/3 описанных приколов, и пока вполне успешно.
Т.е., если мы напишем h:=FindWindow(nil,'Сапер'), то в переменную h вернется дескриптор окна игры "Сапер", если она в данный момент запущена.
Запускаем Delphi. Дважды кликаем на нашей главной форме и модифицируем код:
procedure TForm1.FormCreate (Sender: TObject);
begin
Application.ShowMainForm:= False;
end;
Помещаем на форму компонент Timer из вкладки System палитры компонентов. Ставим его значение Interval=2000 в инспекторе объектов и дважды кликаем по нему. В открывшемся обработчике пишем следующее:
1. Минимизация выбранного окна с определенным интервалом.
procedure TForm1.Timer1Timer (Sender: TObject);
Var
h:HWND;
s:PChar;
begin
s:='Мой компьютер'; h:=FindWindow(nil,s);
if h<> NULL then CloseWindow(h);
end;
Переменная s введена для того, чтобы вы сами могли решить, какое окно минимизировать. В этой переменной должен содержаться заголовок окна, с которым будет происходить последующая работа.
Заголовок окна — это обычно надпись, которая пишется в левом верхнем углу окна на синем фоне (если вы его цвет сами не меняли, конечно). Если заголовка явно не видно, можно нажать заветные Ctrl+Alt+Del и посмотреть, как там называется ваше приложение. Вот некоторые примеры заголовков:
Мой компьютер
Сетевое окружение
Quake 3: Arena
Сапер
Winamp 2.80
Intranet Chat
2. Закрытие окна aka его уничтожение. Менять придется только сам обработчик OnTimer, так что предыдущий код трогать не нужно. В случае с окнами Windows (Мой компьютер, Сетевое окружение и т.д.) наше закрытие вызывает очень приличное повисание этого окна, которое перегружает Explorer при ручной выгрузке. Для реализации этого прикола лучше установить Interval таймера либо очень маленьким (1), либо побольше (20000-50000).
procedure TForm1.Timer1Timer (Sender: TObject);
Var
h:HWND;
s:Pchar;
begin
s:='Сапер';
h:=FindWindow(nil,s);
if h<> NULL then
SendMessage(h,WM_DESTROY,0,0);
end;
3. Случайное перемещение окна по рабочему столу с изменением размеров:). Смотрится дико весело и наводит на определенные мысли о целых легионах злобных вирусов, грызущих бедную систему. Изменяем все тот же OnTimer, предварительно выставив его значение Interval=10.
procedure TForm1.Timer1Timer (Sender: TObject);
Var
h:HWND;
s:Pchar;
begin
s:='Сапер';
h:=FindWindow(nil,s);
if h<> NULL then
begin randomize;
MoveWindow(h,random(screen.Width),random(screen.Height), random(screen.Width),random(screen.Height),true);
end;
end;
Не так страшен Photoshop, как в нем малюют
Неужели в этом приколе мы будем рисовать, радостно спросит читатель и весело захлопает в ладошки? Будем, обязательно будем.
В прошлой своей статье я уже писал, как эмулировать силу притяжения для мышки, но пришло несколько писем с просьбами описать еще несколько "мышиных приколов", так что готовьтесь рисовать. И не просто рисовать, а создавать универсальный программный продукт, позволяющий пользователю не мучиться с нажатием на кнопки мыши и выбором цвета для точки, а спокойно создавать свои шедевры на… на всем, что есть на его экране в данный момент. Для этого мы сейчас просто наделим нашу мышку целым рядом неисправимых достоинств:).
Delphi, надеюсь, уже загружен? Тогда делаем все, как в прошлом приколе, за исключением, как всегда, обработчика OnTimer, который на этот раз будет выглядеть следующим образом (значение Interval=5):
procedure TForm1.Timer1Timer (Sender: TObject);
Var
l:Tpoint;
begin
GetCursorPos(l); SetPixel(GetDc(0),l.X+random(3),l.Y+random(3),Random(65535)); SetPixel(GetDc(0),l.X-random(3),l.Y+random(3),Random(65535)); SetPixel(GetDc(0),l.X+random(3),l.Y-random(3),Random (65535)); SetPixel(GetDc(0),l.X-random(3),l.Y-random(3),Random (65535));
end;
При запуске нашего универсального графического редактора v1.0бета противник получит просто прекрасную возможность реализовать все свои скрытые таланты художника прямо на рабочем столе. Ну, а что прекратить это все безобразие можно только по заветным Ctrl+Alt+Del — так это ограничение beta-версии и будет доступно только после бутылки пива тому, кто эту программку ему подкинул:). В общем, эффект будет примерно такой, как показано на картинке. Причем рисование будет происходить на кнопках, ярлыках, окнах, панелях и т.д.

Для вывода какого-либо текста под курсором мыши можно изменить наш код следующим образом:
procedure TForm1.Timer1Timer (Sender: TObject);
Var
l:Tpoint;
begin GetCursorPos(l);
TextOut(GetDc(0),l.x,l.Y,'Windows XP',length('Windows XP'));
end;
Следующий вариант обработчика OnTimer визуально заметен не сразу, но при долгой работе быстро бросается в глаза. Данный эффект обеспечивает медленную перекраску точек под курсором мышки. Причем не в один цвет, а в разные, в зависимости от исходного цвета объекта. Модифицируем:
procedure TForm1.Timer1Timer (Sender: TObject);
Var
l:Tpoint;
c:Cardinal;
begin
GetCursorPos(l);
c:=GetPixel(GetDC(0),l.x-1,l.y); Setpixel(getdc(0),l.X-1,l.Y,RGB(getrvalue(c)-15,getgvalue(c),getbvalue(c)-15)); c:=GetPixel(GetDC(0),l.x+1, l.y); Setpixel(getdc(0),l.X+1,l.Y,RGB(getrvalue(c)-15,getgvalue(c),getbvalue(c)-15)); c:=GetPixel(GetDC(0),l.x,l. y-1);
Setpixel(getdc(0),l.X,l. Y-1,RGB(getrvalue(c)-15,getgvalue(c),getbvalue(c)-15)); c:=GetPixel(GetDC(0),l.x,l. y+1); Setpixel(getdc(0),l.X,l.Y+1,RGB(getrvalue(c)-15,getgvalue(c),getbvalue(c)-15));
end;
Начало работы:

Cпустя 20 сек…

Вот и думай потом, что за благородное озеленение происходит с твоим компьютером… Откомпилированные программки можно, как обычно, затянуть в Автозагрузку или просто запустить в отсутствие противника и спокойно дожидаться, пока он сумеет оценить ваше чувство юмора. С рисованием все. Поехали дальше.
Поморгай мне окнами…
А вот следующий эффект обычно воспринимается однозначно как "странные глюки". И истинное удовольствие — наблюдать за человеком, который, проклиная Билла Гейтса такими словами, что хочется стыдливо покраснеть и закрыть лицо ушами:), пытается лихорадочно убрать синее моргание свернутых приложений из таскбара. А они все моргают и моргают. В принципе, если включить Winamp, то это даже красиво смотрится:).
А теперь немного работы для реализации. Затягиваем на форму компонент Timer и устанавливаем его Interval в 500 (можно потом, экспериментируя с различными значениями, выбрать оптимальное).
Обеспечиваем сокрытие формы при запуске (Application.ShowMainForm:=False) и, кликнув по таймеру 2 раза, пишем обработчик:
procedure TForm1.Timer1Timer (Sender: TObject);
Var
wnd : HWND;
buff: array [0..127] of Char;
begin
wnd := GetWindow(Handle, gw_HWndFirst);
while wnd<> 0 do
begin
IF (wnd <> Application.Handle) and IsWindowVisible(wnd) and (GetWindow(wnd, gw_Owner) = 0) and (GetWindowText(wnd, buff, sizeof(buff)) <> 0) then
begin
FlashWindow(wnd,true);
end;
wnd := GetWindow(wnd, gw_hWnd Next);
end;
end;

Естественно, наибольший эффект достигается, если в таскбаре к этому времени присутствует много приложений. Их синхронное моргание вообще может свести с ума кого угодно. Само мигание кнопок обеспечивается функцией FlashWindow. Ниже приведены некоторые другие функции, вставив которые вместо FlashWindow, вы получите другой эффект:
1) сворачивание всех окон в системе каждые 0,5 секунды (если Interval таймера равен 500) — CloseWindow(wnd);
2) завершение приложений, имеющих окно в системе — SendMessage(wnd,WM_DESTROY,0,0);
3) замена заголовков всех запущенных приложений с окнами —
SetWindowText (wnd,'Virus has you…').
И напоследок (то, что не вошло в основную часть статьи)…
Популярные вопросы и мои ответы на них.
Q: Как мне можно спрятать TaskBar?
A: Таскбар — это тоже окно, так что действия с ним можно производить те же самые. Сперва получаем дескриптор, затем прячем. Сложность здесь заключается только в получении дескриптора:
Wnd:=FindWindow('Shell_Tray Wnd',nil);
ShowWindow(wnd,SW_HIDE);
Q: Как можно не допустить запуска игры Quake 3?
A:
Wnd:=FindWindow(nil,'Qua-ke 3: Arena');
SendMessage(wnd,WM_DESTROY, 0,0);
То же и для всех других приложений. Главное — знать заголовок окна.
Q: Не понял, почему твои приколы не работают в Паскале 7.0 под ДОС? Я их слово в слово переписал!!!
A: Этот вопрос потряс меня до глубины души… Ребенок переписывал, старался, и на тебе. Неужели они не работают в Паскале, да еще и под ДОС? Какой ужас. Я просто не верю своим ушам. Придется немедленно пересмотреть все свои статьи и сделать патчи, эмулирующие WinApi в ДОСе. Ребята, думайте над вопросами, которые вы задаете, так как это, к моему неописуемому восторгу, не первый пример подобного содержания. Все мои программки под Windows, и все тут.
На этом закругляюсь. Присылайте свои заявки на различные веселые приколы, и как знать, возможно, вы сами сумеете создать их с моей небольшой и крайне скромной помощью. Искренне ваш (С)Fireangel.
7 Ноябрь 2008 г.
Хакерские приколы: Продолжаем нашу серию после долгого перерыва.
Первый антивирус носил гордое название format.com.
Чего боится каждый пользователь кучки микросхем, которая гордо именуется компьютером? Конечно же, форматирования своих драгоценных дисков, на которых хранятся воистину бесценные коллекции фильмов, музыки, игр и фотографий Бори Моисеева в обнаженном виде:). Посему для следующего прикола лучше предусмотрительно "забыть" на столе несколько таблеток валидола и быть готовым вызвать добрых дядей в белых халатах на случай сердечного приступа жертвы, созерцающей форматирование своего C:-диска. А вот эмулятор этого форматирования придется писать самому. Для начала нужно хорошенько всмотреться в стандартное окно форматирования, а затем придать своей форме в Delphi точно такой же вид. Очень уж похожим можно и не делать. Воображение противника не будет различать деталей. Для Windows XP окошко может быть таким:

При создании всей этой красоты нужно поместить на форму
4 элемента ComboBox,
4 элемента Label,
1 элемент GroupBox, 3
элемента Check-Box
и 1 элемент Button из вкладки Standart,
1 элемент ProgressBar из вкладки Win32,
а также 1 элемент Timer из вкладки System палитры компонентов.
Для создания самих надписей используйте поля инспектора объектов Caption для элементов Label, GroupBox, Button и Check-Box и поле Text для элементов Com-boBox (естественно, всю информацию о "форматируемом" диске нужно знать заранее). Для элементов ComboBox поле Enabled рекомендую установить в False для невозможности изменения ваших надписей. Затем кликаем дважды на Timer и модифицируем код:
procedure TForm1.Timer1Timer (Sender: TObject);
begin
progressBar1.Position:=progress Bar1.Position+3;
end;
Все. Заносим ярлык от скомпилированной программы в Автозагрузку и уходим со спокойной совестью домой, ожидая телефонного звонка и истошных воплей о страшном сбое, отформатировавшем все диски и героическом закрытии окна форматирования Великим хакером Васей Пупкиным, спасшем свой диск (и, конечно же, весь мир) от злобного вируса. В предвидении вопроса о том, почему программу можно так легко закрыть, сообщаю: данный прикол проделывался мною несколько раз, и опыт показывает, что человек, видя, что окно не закрывается, впадает в настоящую истерику, а шутка должна быть безобидной, ибо только тогда она не оставит тяжелого отпечатка на душе жертвы и на вашей совести.
2. Есть одна реальная сила — сила притяжения.
Windows отследила перемещение мыши. Перезагрузитесь, чтобы изменения вступили в силу.
Все в этом грешном мире подчиняется законам природы. Все, кроме курсора нашей мышки, нагло летающего по рабочему столу в невесомости вопреки силе притяжения. Ну да ничего, найдется и на него управа. Помещаем на форму элемент Timer из вкладки System палитры компонентов. В инспекторе объектов установите для вашего таймера значение Interval=1; Для сокрытия окна приложения дважды кликните на форму и модифицируйте код так, как это показано ниже:
procedure TForm1.FormCreate (Sender: TObject);
begin
Application.ShowMainForm:= false
end;
Для реализации самого эффекта притяжения дважды кликните на компонент Timer и пишите:
procedure TForm1.Timer1Timer(Sen der: TObject);
var
p:Tpoint;
begin
GetCursorPos(p);
SetCursorPos(p.x,p.y+((Screen. height-p.y) div 30));
end;
Теперь о том, как это работает. Для эффекта используются функции GetCursorPos(), возвращающие в структуру p координаты курсора мышки (p.x и p.y). Затем с помощью процедуры SetCur-sorPos мы устанавливаем новые координаты, обеспечивающие сохранение позиции курсора по координате X и увеличение его Y-координаты в зависимости от положения относительно числа Screen. height (разрешение вашего экрана по вертикали). Для реализации некоторых других эффектов можно чуть-чуть модифицировать процедуру SetCursorPos:
SetCursorPos(1,1);//курсор всегда в левом верхнем углу экрана
SetCursorPos(p.x-3,p.y-3); //курсор летит в верхний угол экрана
SetCursorPos(Screen.Width div 2, Screen.Height div 2); //курсор всегда в центре и т.д.
В общем, достаточно разобраться с самыми общими принципами работы данных процедур, а потом уже можно шутить на свое усмотрение.
3. The Matrix has you…
Продам исходник Матрицы. (с) Нео.
Ну и кто там не смотрел "Матрицу"? Уж этот-то фильм наверняка знают все жители нашей необъятной страны. Посему не затронуть эту тему было бы настоящим преступлением. Не так уж трудно представить физиономию человека, перед которым экран становится черным и начинает медленно печататься надпись "The Matrix has you…" Итак, грузим Delphi, добавляем на форму компонент Label из вкладки Standart и компонент Timer из вкладки System палитры компонентов. Переходим в окошко кода (F12) и ищем строчку Var. Затем ко всему, что ниже, ее приписываем:
Var
Form1: TForm1;
s:string='The Matrix has you ...';
i:integer=1;
Дважды кликаем на форме и модифицируем код:
procedure TForm1.FormCreate (Sender: TObject);
begin
{0}Label1.Caption:='';
{1}Form1.Color:=0;
{2}Form1.BorderStyle:=bsNone;
{3}Form1.Left:=0;
{4}Form1.Top:=0;
{5}Form1.Width:=Screen.Width;
{6}Form1.Height:=Screen.Height;
{7}ShowCursor(false);
{8}Label1.Font.Color:=RGB(0,200,0);
{9}Label1.Font.Size:=14;
end;
Затем в инспекторе объектов поле Interval компонента Timer устанавливаем в 300. Двойной клик на Таймере и дописываем следующее:
procedure TForm1.Timer1Timer (Sender: TObject);
begin
if i<=length(s) then
begin Label1.Caption:=Label1.Caption+s[i];
inc(i);
end;
end;
Ну, а сейчас подробнее о коде: {0} обнуляет текст компонента Label (присваивает ему пустую строку) {1} делает нашу форму черного цвета {2} убирает заголовок и границы формы {3}-{6} растягивает форму на весь экран {7} прячет курсор мышки {8} устанавливает цвет нашей надписи (зеленый) {9} устанавливает размер надписи В результате всего после компиляции при запуске программы должна просматриваться следующая картинка.
Далее вариантов несколько. Можно просто забросить ярлык программы в автозагрузку и дождаться ближайшей перезагрузки (для Win 9x долго ждать не придется:)). А можно воспользоваться такой замечательной программкой, как Планировщик задач. Он сам любезно запустит Матрицу в нужное время. 4. Утекай.
Нажми на кнопку, получишь разряд…
Замечательная есть все-таки шутка, обросшая уже энным количеством бород и клонов. Это окошко с надписью “Довольны ли вы своей зарплатой” (как варианты — “своим деканом”, “своим директором”). Реализацией именно этого прикола мы сейчас и займемся. Помещаем на форму два элемента Button из вкладки Standart палитры компонентов и дважды кликаем на форме:

procedure TForm1.FormCreate(Sen-der: TObject);
begin
Form1.BorderStyle:=bsDialog;
Form1.Caption:='Довольны ли вы своей зарплатой';
Button1.Caption:='НЕТ';
Button2.Caption:='ДА';
end;
Затем вновь возвращаемся к форме (F12), выделяем мышкой нашу первую кнопку и переходим в инспекторе объектов на вкладку Events. Ищем там поле OnMouse Move и дважды кликаем напротив него:
procedure TForm1.Button1Mouse Move(Sender: TObject; Shift: TShift State; X, Y: Integer);
begin
Button1.Left:=Random(Form1. Width-Button1.Width);
Button1.Top:=Random(Form1. Height-Button1.Height);
end;
Данный код при наведении мышки на кнопку перемещает ее в новое место (в пределах формы, конечно). Осталось всего-то слегка подколоть противника, который в конце концов нажмет на кнопку "ДА". Кликаем дважды на второй кнопке и в обработчике пишем:
procedure TForm1.Button2Click (Sender: TObject);
begin
ShowMessage('Кто бы сомневался');
end;
После компиляции можно запустить программку на компьютере жертвы и предложить ей выбрать вариант. Затем, пока противник будет гоняться за кнопкой, можно попить кофе, принять душ и т.д. в зависимости от фантазии.
На этом пока все. Пишите, предлагайте, спрашивайте, рекомендуйте. Успехов!
(С)Fireangel
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 как работал, так и будет работать.
Почему же комп не вырубился ?
Когда вы выбираете «Завершение работы», то винда посылает всем приложениям сообщение, о том, что они должны завершить работу. Если какое-то приложение отказывается закрываться, то отключение невозможно.
На главном окне ставим одну кнопку, по нажатию которой(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 г.
Хакерские приколы: «Хакерские приколы» и остальные интересные штучки.
Я убежден, что, чтобы человек научился что-то делать, его надо для начала заинтересовать. Я попробую это сделать.
Нам понадобятся :
Компьютер (1 шт.)
Руки (2 шт.)
Голова (1-1,5 шт.).
Компьютер можно заказать в любом компьютерном магазине, одолжить у друга и т.д.
Если у вас нет остального, то ничем не могу помочь – все вопросы к родителям.
Урок 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, поэтому очень рекомендую после создания основы сохранить ее как хороший шаблон для последующих довесок.
Есть довольно много пользователей, которые для набора небольших документов используют встроенный в ОС 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);
…
Готово.
Продолжение уроков следует...