【问题标题】:read exe file in memory and execute it读取内存中的exe文件并执行
【发布时间】:2011-12-23 04:01:14
【问题描述】:

是否可以使用 Windows 将文件读入内存(将数据保存在字节数组中),从文件系统中删除原始文件并从内存中执行?


编辑

我的目标是保护我的 java 代码免受逆向工程。

我用 C++ 编写了一个启动器,它获取我的加密 jar 文件、解密并启动它。 小问题是我必须将解密后的 jar 文件写入文件系统中的某个位置,以便轻松捕获和反编译...有没有办法防止这种情况?

【问题讨论】:

  • 您可能想在网络上对 NX 位和 DEP(数据执行保护)进行更多研究。
  • 这种能力的意义何在?
  • 在浪费时间“保护”您的代码之前,您应该知道没有办法真正保护您的代码。你可以让攻击者更难获得它,但你不能让它变得不可能。
  • @Blow - 我更新了我的答案以解决 Java 部分(以通用方式)。尽管如此,它仍然不会使您的秘密来源不可见。
  • @blow 实际上,你可以在不到 2 分钟的反汇编时间内从一个 exe 文件中读取所有指令,并且在其中找到一个 jar 文件(然后复制和反编译)将花费更少的时间。

标签: java c++ windows


【解决方案1】:

不,不可能那样做。没有系统调用会说“获取我的这块内存并仅将其中的那部分用作新进程的映像”。

您可以将代码加载到内存中并在当前进程中跳转到它,但这样做很糟糕,因为您必须处理所有重定位。

关于 Java 特定部分:

您可以embed a Java interpreter within your C++ 执行。您可以编写自己的 Java 类加载器(通过 JVM 的 C++ 接口),它将从加密的 Jar 文件加载类。这样您就可以避免将未加密的 Jar 文件写入磁盘。当然,任何有调试器的人都可以在内存中看到它......

【讨论】:

  • 谢谢,我已经尝试过使用自定义类加载器,但是spring和IoC有问题。
  • 使用嵌入式 JVM 和本机类加载器,无需将未加密的 Jar 写出即可工作。我怀疑您仍然可以使用“常规”类加载器加载 spring 和 IoC,如果这比使用您的自定义本机加载它们更容易的话。
【解决方案2】:

虽然这是一个老问题,但有一种方法可以将文件读入内存并执行它,它称为 RAM 磁盘。这可以用于任何编程语言。

  1. 创建一个 RAM 磁盘。例如通过使用 java 的 ProcessBuilder 运行 ImDisk 工具包
  2. 将 exe 文件复制/创建到 RAM 磁盘中
  3. 执行 RAM 磁盘上的文件
  4. 删除 RAM 磁盘

设置单个文件执行会很慢,但可以完成这项工作。

【讨论】:

  • 这只是启动和执行常规进程时操作系统已经在做的事情的一种复杂方式。
  • @IInspectable,请阅读原始海报问题。 OP 想要“删除原始文件”并从内存中执行它。操作系统不允许您删除正在运行的 exe,但您可以使用上述方法。所以你是对的,它类似于操作系统已经在做的事情,但是 RAM 磁盘方式不会将它留在物理磁盘上。
  • “RAM 磁盘方式不会将其留在物理磁盘上” - 这是一种解释需求的创造性方式。 OP 真正要求的是:“从文件系统中删除原始文件”。您提出的解决方案不满足该要求。它的作用是将文件传输到不同的文件系统。攻击者现在必须将他们硬编码的C: 交换为D:、Z: 或任何给定 RAM 磁盘实现决定分配的任何MS-DOS device name(如果有的话)。
  • 换句话说:CreateProcess 需要可执行映像的文件系统路径,并且只要进程将其映射到内存中,就不能从文件系统中删除该映像。如果CreateProcess 可以找到可执行映像,那么其他人也可以。这不会完成任何事情。
  • 您可以保护 RAM 磁盘不被您的应用程序外部访问。所以它比把它放在磁盘上更安全。尽管最终没有什么可以提供完全安全的方式来执行原始 OP 想要的操作。
【解决方案3】:

将文件保存在带有 ACL 的磁盘上与将文件保存在受保护的 RAM 磁盘中是不同的。 RAM 磁盘仅将文件存储在内存中,因此一旦擦除内存,就没有文件的踪迹。这与使用 ACL 保护某些内容并将其保留在磁盘上不同。

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2016-07-26
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多