ASP.Net возвращает поврежденный байтовый массив в мое приложение через WebClient - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть приложение asp.net (локально для тестирования), а также FTP-сервер с файлом на нем.Я пытаюсь, чтобы мой .exe получил байтовый массив, который мое приложение asp.net получает от моего FPT-сервера.Это работает, когда я получаю данные непосредственно с моего FTP-сервера из моего .exe, данные из файла, который он загружает, верны.Я проверил это, получив длину.Когда я иду возвращать размер байтового массива в виде строки из приложения asp.net .exe-> asp.net-> ftp-> asp.net ->. Exe длина байтового массива равна 7. Но еслия иду прямо из .exe на ftp-сервер .exe-> ftp ->. exe, длина байтового массива составляет 47616, что соответствует размеру файла.Теперь часть, которая смущает меня, если я иду .exe-> asp.net-> ftp-> asp.net ->. Exe тем, что приложение asp.net возвращает массив байтов, загруженный с ftp-сервера, в .exe, если я получу длину возвращенного байтового массива, он имеет длину 63490. Размер файла составляет 46,5 КБ.Я просто полностью потерян здесь, любое понимание было бы замечательно, спасибо!

edit: добавлено больше кода asp.net и .exe.более подробная информация: когда я вызываю mainFunction (которая является c ++ в отдельной .dll), она не будет работать в приведенной ниже строке с данными .dll из приложения asp.net, поскольку она действует как недопустимая .dll (могу заверитьВы. DLL работает должным образом, как и предполагалось. все работает должным образом, пока я не попытался получить приложение asp.net, чтобы получить данные файла для меня вместо того, чтобы быть в .exe (который работает как задумано, просто отлично). Я также никогда не использовалasp.net до этого или даже действительно изучал использование, но я действительно не нуждаюсь в этом для каких-либо других целей, кроме загрузки данных .dll и их возврата в .exe.

c ++ .dll часть

bool ManualMap(HANDLE hProc, BYTE fileData[])
{
BYTE *                  pSrcData        = nullptr;
IMAGE_NT_HEADERS *      pOldNtHeader    = nullptr;
IMAGE_OPTIONAL_HEADER * pOldOptHeader   = nullptr;
IMAGE_FILE_HEADER *     pOldFileHeader  = nullptr;
BYTE *                  pTargetBase     = nullptr;

std::ifstream File("C:", std::ios::binary | std::ios::ate);

auto FileSize = 53760;
pSrcData = new BYTE[static_cast<UINT_PTR>(FileSize)];

if (!pSrcData)
{
    MessageBox(NULL, "Memory allocating failed", NULL, NULL);
    return false;
}

pSrcData = fileData;
reinterpret_cast<char*>(pSrcData);

if (reinterpret_cast<IMAGE_DOS_HEADER*>(pSrcData)->e_magic != 0x5A4D) //here
{
    MessageBox(NULL, "Invalid File", NULL, NULL);
    delete[] pSrcData;
    return false;
}

asp.net

    public byte[] Get(string id)
    {
        WebClient WC = new WebClient();

        string FileName = "file.dll";
        string FTPURL = "ftp://address/";
        string Username = "username";
        string Password = "password";
        string CompletePath = FTPURL + FileName;

        try
        {
            WC.Credentials = new NetworkCredential(Username, Password);
            return WC.DownloadData(new Uri(CompletePath));

        }
        catch (Exception e)
        {
            return new byte[0];
        }
    }

.exe

    private bool InjectFile(byte[] Data)
    {
        return mainFunction(Data, "app.exe");
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        byte[] Data = WC.DownloadData(URL + "1");

        if (Data.Length > 0)
        {
            if (InjectFile(Data))
                MessageBox.Show("Injection Successful");
            else
                MessageBox.Show("Injection Failed");
        }
        else
            MessageBox.Show("Error retreiving file data from server");
    }

1 Ответ

0 голосов
/ 25 февраля 2019

Обновить действие ASP.NET, чтобы вернуть файл

public ActionResult Get(string id)
{
    WebClient WC = new WebClient();

    string FileName = "file.dll";
    string FTPURL = "ftp://address/";
    string Username = "username";
    string Password = "password";
    string CompletePath = FTPURL + FileName;


    try
    {
        WC.Credentials = new NetworkCredential(Username, Password);
        return File(WC.DownloadData(new Uri(CompletePath)), "application/octet-stream");

    }
    catch (Exception e)
    {
        return File(new byte[0], "application/octet-stream");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...