这是我的意思的一个例子......
- 用户运行 LOADER.EXE 程序
- LOADER.EXE 下载另一个 EXE,但将其全部保存在内存中而不保存到磁盘
- 运行下载的 EXE 就像从磁盘执行一样,但直接从内存中执行
我见过一些这样的应用程序,但我从未见过它如何工作的示例或解释。
有人知道吗?
另一个例子是将加密的 EXE 嵌入到另一个文件中。它在内存中提取和解密,在执行之前从未保存到磁盘。
我看到在某些应用程序中使用了它来防止盗版。
编辑: 作为旁注,像 UPX 这样的程序是这样工作的吗?我查看了代码,但对我来说很难破译,我主要是出于好奇才问,我不需要它。
最佳答案
许多执行此操作的程序只是解压缩到 %TEMP%(我知道我这样做),但大公司基本上重新实现了 OS 可执行加载程序,它必须:
- 将可执行文件映射到内存中。这并不像听起来那么简单,因为 .exe 包含多个“部分”,它们必须以页面对齐方式加载(它们必须从 4K 的倍数的地址开始)并且它们每个都有特定的请求 - 只读,复制写入,零初始化等......
- 通过更新导入表部分来满足静态导入,通常使用 LoadLibrary() 和 GetProcAddress()。
- 在 dll 的情况下(它们实际上几乎相同,重要的区别在于它们既有导出也有导入),加载器可能还必须重新设置 dll 的基址,如果它被编译加载的内存地址是已经在使用中(这很常见)。但是,这对于 exe 通常是不可能的,因为它们不包括重定位部分,该部分列出了加载代码中需要更新的位置,因为通常它们是第一个加载到进程中的东西,因此不能被阻止通过某事。这意味着加载程序必须有一个不寻常的加载地址,用于它自己的 exe,不会阻止加载的 exe。
总而言之:这是一项繁重的工作。如果您有兴趣,请看一下 PE 格式规范,其中描述了 .exe 和 .dll 文件以及 VirtualAlloc()
函数。
关于c++ - C 或 C++ : how do loaders/wrappers work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3004979/