9

这是我的意思的一个例子......

  • 用户运行 LOADER.EXE 程序
  • LOADER.EXE 下载另一个 EXE 但将其全部保存在内存中而不将其保存到磁盘
  • 像从磁盘执行下载的 EXE 一样运行下载的 EXE,但直接从内存执行

我见过一些这样的应用程序,但我从来没有见过一个例子或解释它是如何工作的。

有人知道吗?

另一个例子是将加密的 EXE 嵌入另一个文件中。它在内存中被提取和解密,在执行之前从未保存到磁盘。

我已经看到在某些应用程序中使用它来防止盗版。

编辑:作为旁注,像UPX这样的程序是这样工作的吗?我查看了代码,但对我来说很难破译,我主要是出于好奇而问,我不需要它。

4

2 回答 2

4

许多执行此操作的程序只是解压缩到 %TEMP%(我知道我这样做),但大男孩基本上重新实现了 OS 可执行加载程序,它必须:

  • 将可执行文件映射到内存中。这并不像听起来那么简单,因为 .exe 包含多个“部分”,它们必须以页面对齐方式加载(它们必须从 4K 的倍数的地址开始)并且它们每个都有特定的请求 - 只读,复制写入,零初始化等......
  • 通过更新导入表部分来满足静态导入,通常使用 LoadLibrary() 和 GetProcAddress()。
  • 在 dll 的情况下(实际上几乎相同,重要的区别是它们有导出和导入),如果编译加载的内存地址已经在使用中,加载器可能还必须重新设置 dll (这很常见)。但是,这对于 exe 来说通常是不可能的,因为它们不包括列出加载代码中需要更新的位置的重定位部分,因为通常它们是加载到进程中的第一件事,因此不能被阻止通过某事。这意味着加载器必须有一个不寻常的加载地址,用于它自己的 exe,不会阻塞加载的 exe。

总结:这是很多工作。如果您有兴趣,请查看描述 .exe 和 .dll 文件以及VirtualAlloc()功能的 PE 格式规范。

于 2010-06-09T11:11:50.093 回答
2

好吧,如果您知道可执行文件入口点的偏移量在哪里并且您知道它需要什么参数,那么您需要做的就是使用函数指针在地址“exeBase + entryPointOffset”处调用函数。

值得注意的是,至少在 x86 系统上,操作系统往往不允许您执行标记为数据的内存。例如,在 windows 下,可以使用“ Virtual ProtectEx ”功能将内存标记为可执行文件。

事实上,在过去的美好时光中,这是一种节省内存的常用系统。您将拥有“覆盖”,这样您就可以根据需要通过交换代码来节省内存。

于 2010-06-09T10:46:31.947 回答