在内存中读取并执行exe文件

5

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


编辑

我的目标是保护我的Java代码不被反向工程。

我编写了一个C++启动器,它接受我的加密jar文件,对其进行解密并启动它。 问题是我不得不将我的解密后的jar文件写入文件系统某处,以便轻松捕获和反编译它......有什么办法可以防止这种情况发生吗?


4
你可能想在网上对NX位和DEP(数据执行防护)进行更多研究。 - Hossein
1
这种能力的意义是什么? - David Heffernan
6
在花费时间“保护”你的代码之前,你应该知道真正保护你的代码是不可能的。你只能让攻击者获取代码更加困难,但是你无法使其变得完全不可能。 - Sylence
@Blow - 我更新了我的答案,以解决Java部分的问题(以一种通用的方式)。但这仍然不能使您的秘密源代码不可见。 - Flexo
1
@blow 实际上,你可以在不到2分钟的反汇编时间内读取exe文件中的所有指令,并定位其中的jar文件(然后复制并反编译)所需的时间甚至更短。 - ssube
显示剩余4条评论
3个回答

8

不,这样做是不可能的。没有系统调用可以说“拿走我的一部分内存并将其作为新进程的镜像使用”。

您可以将代码加载到内存中,并在当前进程中跳转到它,但这是一件丑陋的事情,因为您必须处理所有的重定位。

关于Java特定部分:

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


谢谢,我已经尝试使用自定义类加载器,但是在Spring和IoC方面存在问题。 - blow
有了嵌入式JVM和本地类加载器,这就可以在不需要将未加密的Jar文件写出的情况下运行。我怀疑如果使用普通的类加载器比起让它们与您自定义的本地类加载器一起加载更容易,那么还是可以加载Spring和IoC。 - Flexo

1

IInspectable,jmax表示这个答案可以作为保护文件的解决方案的一部分使用,但他们不能在评论区提供完整的解决方案。如果您正在尝试实现这样的解决方案,请提出一个新问题,说明您已经尝试过什么以及卡在哪里了。评论区不应该用于探讨更多的话题或请求有关实施新内容的详细信息。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Luke B

0

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

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

对于单个文件执行来说,这样设置速度会比较慢,但可以完成任务。


这只是一种复杂的方式来执行操作系统在启动和执行常规进程时已经在做的事情。 - IInspectable
@IInspectable,请认真阅读原帖提问。OP想要“删除原始文件”并从内存中执行它。操作系统不允许您删除正在运行的exe文件,但您可以使用上述方法。因此,您是正确的,这与操作系统已经在做的事情类似,但RAM磁盘方式不会将其留在物理磁盘上。 - JMax
“RAM磁盘的方式不会将其留在物理磁盘上” - 这是一种创造性的解释需求的方式。OP真正要求的是:“从文件系统中删除原始文件”。您提出的解决方案并未满足该要求。它所做的是将文件传输到另一个文件系统。攻击者现在必须将其硬编码的C:更改为任何给定RAM磁盘实现决定分配的D:Z:或其他[MS-DOS设备名称](https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/introduction-to-ms-dos-device-names)。 - IInspectable
换句话说:CreateProcess需要可执行映像的文件系统路径,并且只要进程将其映射到内存中,该映像就不能从文件系统中删除。如果CreateProcess可以找到可执行映像,那么其他人也可以找到它。这并没有实现任何目的。 - IInspectable
你可以保护RAM磁盘以防止应用程序外的访问。因此,它比放在磁盘上更安全。虽然最终没有什么方法能完全保证原始操作者想要的安全性。 - JMax
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接