我有一个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,这对于文件的大小是正确的。现在让我困惑的部分是,如果我通过让asp.net应用程序将它从ftp服务器下载的字节数组返回到.exe,则转到.exe-> asp.net-> ftp-> asp.net->。exe。 ,如果得到返回的字节数组的长度,则长度为63490。文件大小为46.5KB。我只是在这里完全迷失了,任何见解都会很棒,谢谢!
edit:添加了更多的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];
}
}
.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");
}
答案 0 :(得分: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");
}
}