ASP.Net通过WebClient将损坏的字节数组返回给我的应用程序

问题描述 投票:-1回答:1

我有一个asp.net应用程序(本地测试)设置以及一个带有文件的FTP服务器。我试图让我的.exe获取我的asp.net应用程序从我的FPT服务器获取的字节数组。当我从我的.exe直接从我的FTP服务器获取数据时,这是有效的,其下载的文件中的数据是正确的。我通过获取长度来测试这个。当我从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.5KB。我刚刚完全迷失在这里,任何见解都会很精彩,谢谢!

编辑:添加更多asp.net和.exe代码。更多细节:当我调用mainFunction(它是一个单独的.dll中的c ++)时,它将在下面的注释行中使用来自asp.net应用程序的.dll数据失败,因为它的作用就像它不是一个有效的.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];
        }
    }

。可执行程序

    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");
    }
c# asp.net ftp
1个回答
0
投票

更新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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.