c++ - C 或 C++ : how do loaders/wrappers work?

标签 c++ windows loader

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

  • 用户运行 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/

相关文章:

c++ - 如何使用 QVector at 或 operator[] 获取指向元素的指针

C++读取(大端)二进制 float

c++ - 将 QComboBox::currentIndexChanged(int) 连接到 QSignalMapper::map()

CSS Loaders,在页面上呈现多个

java - 类加载器返回 NoSuchMethodException 错误

c++ - WinAPI:钩子(Hook)函数中的非dll数据

windows - 从 Go 程序调用 Windows 批处理文件,以便它在新窗口中打开

c# - 关于Registry CreateSubKey的简单问题

安卓加载器 : Cannot load data to ListView

c - If 语句在 C KDMF 驱动程序中失败