从字节数组运行程序而不创建临时文件。 C#

时间:2014-06-04 09:07:55

标签: c# arrays byte

我有许多存储在IIS服务器(MSSQL)上的.exe文件,其中包含报告和对服务器上文件的访问权限。 (这些文件将在星期日更改。)

连接到SQL Server并选择.exe文件后,我正在下载(在SQL中选择),现在我有一个分配给变量的字节数组。 我无法在未知目录中创建像“temp.exe”这样的临时文件,因为我知道有很多方法可以理解新创建的文件目录和...

它不安全,因为我的用户很专业,如果其中一个人知道这些方式......

所以,我想知道是否可以从字节数组运行.exe文件(默认为从“Windows资源管理器”运行)而不创建临时文件?

TNX 更新:exe文件是.net,Manager将上传新文件或更改文件。

3 个答案:

答案 0 :(得分:1)

请注意,您对任何额外安全性的信念都是虚幻的。如果用户有权访问机器来读取文件,他们也可以读取过程的内存。

但是,要回答您的问题,您要求做的事情很简单,并在此处进行了描述:Load an EXE File and Run It from Memory

实质上,您可以执行以下操作:

  1. 将您的字节数组传递给Assembly.Load以创建新的Assembly
  2. 使用EntryPoint属性读取该程序集的入口点。
  3. 使用Assembly.CreateInstance创建实例,并在该实例上调用该方法。
  4. 代码如下所示:

    Assembly a = Assembly.Load(bytes);
    MethodInfo method = a.EntryPoint;
    if (method != null)
        method.Invoke(a.CreateInstance(method.Name), null);
    

答案 1 :(得分:0)

两种方式听起来都不安全,为什么要在db中存储exécutables?谁上传了他们?如果它们在文件系统上,那么它们就像恶意一样危险。

那些.net是吗?如果是这样,您可以将程序集加载到具有安全限制的子appdomain中,我很确定您可以在不复制到磁盘的情况下执行此操作。

对于常规本机exe,我认为只有在没有物理文件支持的情况下才能启动exe(即使在任务管理器中,您也可以看到启动程序的路径)

答案 2 :(得分:0)

这里有两个不同的安全问题:

  1. 有人可以看到您从数据库中下载的文件。
  2. 执行该文件可能是一种安全威胁。
  3. 首先要考虑的问题:在服务器上创建一个目录并限制对该目录的访问,这样只有运行服务器程序的用户帐户才能看到/使用它。将字节数组保存到该目录中的临时文件中,执行它,并在进程完成后删除临时文件。

    关于第二个问题:您需要在沙盒环境中运行该可执行文件。在.NET中,您可以通过将代码加载到您已设置为仅具有部分信任的单独AppDomain中,在沙盒环境中运行代码。如何做到这一点值得在SO上提出另一个问题。