C或C++:加载器/包装器如何工作?

gui*_*ar- 8 c++ windows loader

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

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

我见过这样的一些应用程序,我从来没有见过它的工作原理的例子或解释.

有人知道吗?

另一个例子是在另一个中嵌入加密的EXE.它在内存中被提取和解密,而不会在执行之前保存到磁盘.

我已经看到在某些应用程序中用于防止盗版.

编辑:作为旁注,像UPX这样的程序是这样工作的吗?我查看了代码,但很难为我解读,我主要是出于好奇,我不需要它.

Sim*_*han 4

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

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

总而言之:这是一项艰巨的工作。如果您有兴趣,请查看PE格式规范,其中描述了.exe和.dll文件以及函数VirtualAlloc()