从字节数组运行程序而不创建临时文件。 C#
Posted
技术标签:
【中文标题】从字节数组运行程序而不创建临时文件。 C#【英文标题】:Run a program from an array of bytes without creating a temporary file . c# 【发布时间】:2014-07-24 20:36:17 【问题描述】:我在 IIS 服务器 (MSSQL) 上存储了许多 .exe 文件,其中包含报告和对服务器上文件的访问权限。 (这些文件将在周日更改。)
连接到 SQL Server 并选择一个 .exe 文件后,我正在下载(在 SQL 中选择),现在我有一个分配给变量的字节数组。 我无法在未知目录中创建像“temp.exe”这样的临时文件,因为我知道有很多方法可以理解新创建的文件目录和...
这是不安全的,因为我的用户是专业的,如果他们中的一个人知道这些方式......
所以,我想知道是否可以在不创建临时文件的情况下从字节数组运行 .exe 文件(默认为从“Windows 资源管理器”运行)?!
tnx 更新:exe文件是.net,管理器将上传新文件或更改文件。
【问题讨论】:
这也不安全。这篇文章有你想要的东西:codeproject.com/Articles/13897/…你可以很容易地通过网络搜索找到这个,就像我一样 请在“...有很多方法可以理解新创建的文件目录...”部分。只是不清楚您在问什么,似乎您混合了一些与问题无关的想法。 @DavidHeffernan:但这不适用于本机可执行文件。 @DavidHeffernan :感谢您的阅读,但我认为没有人能反映这个文件。因为关闭这个文件后,所有的东西都会丢失。 @MårtenWikström 正确。我的假设是我们正在谈论托管的可执行文件。尽管可以使用不受支持的未记录机制,但不支持从内存运行的非托管可执行文件。 【参考方案1】:请注意,您相信任何额外的安全都是虚幻的。如果用户有权访问机器读取文件,他们也将能够读取您的进程的内存。
但是,为了回答您的问题,您要求做的事情很简单,并在此处描述:Load an EXE File and Run It from Memory。
本质上,您执行以下操作:
-
将您的字节数组传递给
Assembly.Load
,以创建一个新的Assembly
。
使用EntryPoint
属性读取该程序集的入口点。
使用Assembly.CreateInstance
创建一个实例,并在该实例上调用该方法。
代码如下所示:
Assembly a = Assembly.Load(bytes);
MethodInfo method = a.EntryPoint;
if (method != null)
method.Invoke(a.CreateInstance(method.Name), null);
【讨论】:
【参考方案2】:这两种方法听起来都不安全,你为什么一开始就将可执行文件存储在数据库中?谁上传?无论它们是否在文件系统上,如果是恶意的,它们同样危险。
这些是 .net exe 吗?如果是这样,您可以将程序集加载到具有安全限制的子 appdomain 中,我很确定您可以在不复制到磁盘的情况下做到这一点。
对于常规的本机 exe,我认为在没有物理文件支持的情况下启动 exe 是不可能的(即使在任务管理器中,您也可以看到启动程序的路径)
【讨论】:
【参考方案3】:这里有两个不同的安全问题:
-
有人可以看到您从数据库下载的文件。
执行文件可能会带来安全威胁。
对于第一个问题:在服务器上创建一个目录并限制对该目录的访问,以便除了运行您的服务器程序的用户帐户之外没有人可以看到/使用它。将字节数组保存到该目录中的临时文件中,执行它,一旦处理完成,删除临时文件。
第二个问题:您需要在沙盒环境中运行该可执行文件。在 .NET 中,您可以通过将代码加载到您已设置为仅具有部分信任的单独 AppDomain 中来在沙盒环境中运行代码。不过,如何做到这一点值得另一个关于 SO 的问题。
【讨论】:
感谢您的回答。什么沙盒环境?它是一个 .net 对象吗? @user3706205:在 .NET 中,您可以通过将代码加载到具有部分信任的单独 AppDomain 中来在沙盒环境中运行代码。以上是关于从字节数组运行程序而不创建临时文件。 C#的主要内容,如果未能解决你的问题,请参考以下文章