Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

ПРОГРАММА ОБМЕНА ДАННЫМИ ПО FTP ПРОТОКОЛУ


Автор - Sciba Alexander

Скачать исходник - 72Кб

Для начала дадим возможность пользователю указывать адрес, к которому будем подключаться. Поставим выпадающий список IDC_COMBO1 и две кнопки с заголовками Add и Del для добавления и удаления элементов списка соответственно. Чтобы пользователь мог только пользоваться списком и не мог писать по поле ввода списка, нужно задать свойству Type значение DropList. По нажатию на кнопку добавить напишем такой код:

void CWinFtpDlg::OnAdd() 
{
Dlg dlg; 

if(dlg.DoModal() == IDOK)
{
m_ftpAdress.AddString(dlg.m_string); // в конец списка 
// m_ftpAdress.InsertString(0, dlg.m_string); // в начало списка
}
flagDelAdd = true;
}

Здесь выводится диалоговое окно, в котором пользователь будет вводит нужный адрес. А мы его добавляем в конец списка. Если указать закомментированную строку - указанный адрес будет вставляться в начало списка. Диалоговое окно будет выглядеть вот так:

m_string - это переменная поля ввода строкового типа.

По нажатию на кнопку Del вставляем такой код:

void CWinFtpDlg::OnDel() 
{
m_ftpAdress.DeleteString(m_ftpAdress.GetCurSel());
flagDelAdd = true;
}

Здесь удаляется текущий элемент списка.

На кнопку подключения [Connect] напишем следующий код:

void CWinFtpDlg::OnConnect() 
{
flagConnect = true;
OnGo();
}

Далее добавим функцию-член к классу диалога OnGo() и опишем её так:

void CWinFtpDlg::OnGo() 
{
/*
if(flagIsConnected)
{
AfxMessageBox("Disconnect previous session (please)"); 
return;
}
*/
BOOL res;

if(flagConnect)
{
CString Login, Password;

static CInternetSession session;
m_ftpAdress.GetLBText(m_ftpAdress.GetCurSel(), str);
int k = str.Find(' ');
if(k >= 0)
str.Insert(k, '\0');
if(str == "172.17.168.170" || str == "172.17.168.171" || str == "172.17.168.172")
Login = Password = "expuser";
else
{
DlgLogin dlg;
if(dlg.DoModal() == IDOK)

Login = dlg.m_login;
Password = dlg.m_password;
}

cp = session.GetFtpConnection(str, Login, Password);
cp->GetCurrentDirectory(m_directory);
UpdateData(FALSE);
// CFtpFileFind cf(cp);
cf = new CFtpFileFind(cp);
flagConnect = false;
flagIsConnected = true;
flagApply = true;


//------------------------------ measure rate of transmission 

}
//-------------------------------------
if(flagGet)
{
int k=0;
for(int i=0; i<m_list.GetCount(); i++)
if(m_list.GetSel(i))
{
m_list.GetText(i, str);
k += cp->GetFile(str_list[i], m_directory2 + "/" + str, 
TRUE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 1);
}
if(k <= 1)
str.Format("%2d files was copied", k);
else
str.Format("%2d files were copied", k);
AfxMessageBox(str);
flagApply2 = true;
flagGet = false;
}
//------------------------------------- nash PC
if(flagApply2)
{
UpdateData(TRUE);
m_list2.ResetContent();
res = cff2->FindFile(m_directory2 + "/" + m_filemask2, 0);
res = cff2->FindFile(m_directory2 + "/" + m_filemask2, 0);
if(res)
{
nDir2=0;
nlist2 = 0;
//--------------------------------fill ListBox
while(cff2->FindNextFile())
{
str = cff2->GetFileName();
if(cff2->IsDirectory())
{
if(nlist2 > nDir2)
for(int k=nlist2-1; k>=nDir2; k--)
str_list2[k+1] = str_list2[k];
str_list2[nDir2] = str;
nlist2++;
str.MakeUpper();
m_list2.InsertString(nDir2++, str);
}
else
{
str_list2[nlist2++] = str;
str.MakeLower();
m_list2.AddString(str);
}
}
str = cff2->GetFileName();
if(cff2->IsDirectory())
{
if(nlist2 > nDir2)
for(int k=nlist2-1; k>=nDir2; k--)
str_list2[k+1] = str_list2[k];
str_list2[nDir2] = str;
nlist2++;
str.MakeUpper();
m_list2.InsertString(nDir2++, str);
}
else
{
str_list2[nlist2++] = str;
str.MakeLower();
m_list2.AddString(str);
}
}
flagApply2 = false;
}
//-------------------------------------
if(flagPut)
{
// UpdateData(TRUE);
// for(int i=0; i<m_list.GetSelCount(); i++)
int k=0;
for(int i=0; i<m_list2.GetCount(); i++)
if(m_list2.GetSel(i))
{
str = str_list2[i];
k += cp->PutFile(m_directory2 + "/" + str, m_directory + "/" + str, FTP_TRANSFER_TYPE_BINARY, 1);
}
if(k <= 1)
str.Format("%2d files was copied", k);
else
str.Format("%2d files were copied", k);
AfxMessageBox(str);
flagApply = true;
flagPut = false;
}
//------------------------------------- nash PC
if(flagApply)
{
UpdateData(TRUE);
cp->SetCurrentDirectory(m_directory); 
//AfxMessageBox(m_directory);
m_list.ResetContent();
res = cf->FindFile(m_directory + "/" + m_filemask, 0);
if(res)
{
nDir=0;
nlist = 0;
//--------------------------------fill ListBox
while(cf->FindNextFile())
{
str = cf->GetFileName();
if(cf->IsDirectory())
{
if(nlist > nDir)
for(int k=nlist-1; k>=nDir; k--)
str_list[k+1] = str_list[k];
str_list[nDir] = str;
nlist++;
str.MakeUpper();
m_list.InsertString(nDir++, str);
}
else
{
str_list[nlist++] = str;
str.MakeLower();
m_list.AddString(str);
}
}
str = cf->GetFileName();
if(cf->IsDirectory())
{
if(nlist > nDir)
for(int k=nlist-1; k>=nDir; k--)
str_list[k+1] = str_list[k];
str_list[nDir] = str;
nlist++;
str.MakeUpper();
m_list.InsertString(nDir++, str);
}
else
{
str_list[nlist++] = str;
str.MakeLower();
m_list.AddString(str);
}
}
//-------------------------------- qsort string
flagApply = false;
}
}

По нажатию на кнопку Apply удалённого компьютера пишем такой код:

void CWinFtpDlg::OnApply() 
{
if(!flagIsConnected)
return;
flagApply = true;
// flagApply2 = true;
OnGo();
}

По нажатию на кнопку Apply локального компьютера пишем такой код:

void CWinFtpDlg::OnApply2() 
{
flagApply2 = true; 
OnGo();
}

Обработчик кнопки Get должен выглядеть так:

void CWinFtpDlg::OnGet() 
{
if(!flagIsConnected)
return;
flagGet = true; 
OnGo();
}

А это код кнопки Put:

void CWinFtpDlg::OnPut() 
{
if(!flagIsConnected)
return;
flagPut = true; 
OnGo();
}

В заголовочном файле [.h] диалога должны быть объявлены следующие переменные:

CFtpConnection *cp;
bool flagConnect;
bool flagApply;
bool flagApply2;
bool flagGet;
bool flagPut;
bool flagDelAdd;
bool flagIsConnected;
void OnGo();
CFtpFileFind *cf;
CFileFind *cff2;
CString str;
CString *str_list, *str_list2;
int nlist, nlist2;
int nDir, nDir2;

Инициализируем их в файле реализации [.cpp] диалога следующим образом:

flagConnect = false;
flagApply = false;
flagApply2 = true;
flagGet = false; 
flagPut = false; 
flagDelAdd = false;
flagIsConnected = false;
cff2 = NULL;
cf = NULL;
cp = NULL;
str_list = new CString[5000];
str_list2 = new CString[5000];

А по инициализации диалога добавляем такой код:

FILE *fr = fopen("winftp.dan", "r");
if(fr)
{
char *buf = new char[256];
while(fgets(buf, 256, fr))
{
buf[strlen(buf)-1] = '\0';
//fscanf(fr, "%s", buf);
m_ftpAdress.AddString(buf);
}
}
cff2 = new CFileFind();

 



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS