• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Ошибка при использовании Ftpgetfile() и структуры Win32_find_data

  • Автор темы 111111
  • Дата начала
Статус
Закрыто для дальнейших ответов.
1

111111

Прошу помощи. Я использую Visual C++ 9.0.

Вот код:
Код:
HINTERNET hInternet=::InternetOpen(TEXT("Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)"),
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,NULL,
0);
DWORD_PTR asd=0;	
HINTERNET hConnect = ::InternetConnect(hInternet,TEXT("172.16.1.112"),INTERNET_DEFAULT_FTP_PORT,NULL,NULL,INTERNET_SERVICE_FTP,0(DWORD)0);
WIN32_FIND_DATA sss;
LPTSTR buffer111=TEXT("/ftproot");
HINTERNET FileFTP;
FileFTP=FtpFindFirstFile(hConnect,NULL,&sss,INTERNET_FLAG_NEED_FILE,0);
if(FtpGetFile(hConnect,sss.cFileName,TEXT("C:\\123\\1.bin"),0,0,0,0))
{
cout<<"File Downloaded"<<std::endl;
}
else 
{
cout<<"File Error"<<std::endl;

}

Постарался привести только нужный код.

Все дело в том, что в данном варианте я все время получаю результат "File Error".

Мне кажется, что все дело во втором параметре функции FtpGetFile, поскольку в случае подстановки имени файла ввиде
Код:
TEXT("Имя файла")
Программа прекрасно работает и файл загружается с сервера.

В чем моя ошибка?

Очень прошу помочь.
 
E

European

Что возвращает GetLastError() смотрели?
 
1

111111

С данной прблемой разобрался, вынеся последовательность команд скачивания файла с сервера в отдельную функцию.

Код:
// ftp.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <wininet.h>
#pragma comment(lib,"wininet")

#include <stdlib.h>
#include <fstream>
#include <iostream>
using namespace std;
void zapis(HINTERNET hConnect1,WIN32_FIND_DATA struktura)
{
TCHAR filenames[270]=TEXT("C:\\123\\");
for(int i=0;i<256;i++)
{
filenames[i+7]=struktura.cFileName[i];
}
if(FtpGetFile(hConnect1,struktura.cFileName,filenames,0,0,0,0))
{
cout<<"File Downloaded"<<std::endl;

}
else 
{
cout<<"File Error"<<std::endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
bool ok = false;
HINTERNET hInternet=::InternetOpen(TEXT("Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)"),
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,NULL,
0);
if (hInternet != NULL) 
{
// открываем FTP сессию
DWORD_PTR asd=0;	
HINTERNET hConnect = 
::InternetConnect(
hInternet,
TEXT("192.168.131.134"),
INTERNET_DEFAULT_FTP_PORT,
NULL,NULL,
INTERNET_SERVICE_FTP,
0,
(DWORD)0);

if (hConnect != NULL)
{
cout<<"yes"<<std::endl;
WIN32_FIND_DATA sss;
WIN32_FIND_DATA aaa;
LPTSTR buffer111=TEXT("/ftproot");

if(FtpSetCurrentDirectory(hConnect,buffer111))
{
HINTERNET FileFTP;
FileFTP=FtpFindFirstFile(hConnect,TEXT("*.bin"),&sss,INTERNET_FLAG_NEED_FILE,0);				  
if(FileFTP!=NULL)
{
cout<<"New files are on server"<<std::endl;
//char* qsc="C:\\123\\";
//TCHAR csq[10];
//::WideCharToMultiByte(1251, MB_PRECOMPOSED, qsc, -1, csq, 10);

//TCHAR namefiled[270];
//*namefiled=*csq + *sss.cFileName;
BOOL Uslovie=TRUE;
while(Uslovie)
{
zapis(hConnect,sss);
if(InternetFindNextFile(FileFTP,&sss)==TRUE) Uslovie=TRUE;
else Uslovie=FALSE;
}

cout<<"File END"<<std::endl;



}
else 
{

cout<<"NO"<<std::endl;
DWORD WINAPI asdf=GetLastError();
cout<<asdf;
}

}
else cout<<"no";
}
else 
{
cout<<"no";

}

// закрываем сессию
::InternetCloseHandle(hConnect);
}
// закрываем WinInet
::InternetCloseHandle(hInternet);




return 0;
}

GetLastError() выдавала ошибку в соединении на стороне сервера (точный код не помню). Она возникала из-за того, что вместо имени файла на сервер посылалась точка. Такого файла естественно не существовало, и сервер разрывал соединение.
Почему данная проблема решилась созданием функции - не знаю.

Но возникла новая проблема. Может кто-нибудь раньше сталкивался.

Дело в том, что в начале программа работает в целом нормально. Т.е. при скачивании первых 10 или 13 файлов с сервера. Файлы скачиваются в нужную мне папку с нужным именем. Но затем, при скачивании 11 или 14 файла программа может или зависнуть или отправить всю систему в перезагрузку. При установки точки останова на строке
Код:
if(FtpGetFile(hConnect1,struktura.cFileName,filenames,0,0,0,0))
Оказалось, что все параметры передаваемые в функцию, верные (т.е. именно те значения, которые и должны быть). (Мне кажется, что некорректное поведение программы вызвано именно этой строкой, т.к. это последняя фукция, которая вызывается перед зависанием или перезагрузкой). Более того, по записям логов сервера оказалось, что при запросе последнего файла (того, на котором происходит сбой) корректно происходит запрос размера этого файла и начинается его скачка, но успешно она не заканчивается, т.к. система или перезагружается, или сервер разрывает соединение по завершению тайм-аута.

В случае, когда происходит перезагрузка данный файл вообще не записывается на диск. А если программа "виснет", то файл на диск все же записывается, но не весь, а только первые 4 Кb. При этом открыть файл при запущенной программе невозможно, т.к. он уже открыт в монопольном режиме моей программой, т.е. похоже, что она пытается записать в него информацию.

Я не могу понять в чем причина некорректной работы прграммы.
Если кто-нибудь может подсказать чем вызваны такие ошибки, прошу помочь.
 
1

111111

С проблемой разобрался. Оказалось, что ошибки в работе возникают только в том случае, если сервер локальный.
Кстати, никто не знает почему так?
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!