gpt4 book ai didi

windows - 是否可以将 DLL 加载到地址空间而不是从文件系统文件加载?

转载 作者:可可西里 更新时间:2023-11-01 09:25:40 29 4
gpt4 key购买 nike

我必须创建一个包装器 DLL 来导出一些符号(函数)。在其资源中,它包含另一个实际执行此任务的加密 DLL。

在包装器 DLL 初始化时,它解密原始的 DLL,将其保存在文件中,并通过 LoadLibrary 加载到地址空间。但是我想避免将此 DLL 保存在文件中。

我知道这并不能保证防弹保护,实际上可以转储进程虚拟内存并在那里看到它。我还知道可以创建一个具有 FILE_FLAG_DELETE_ON_CLOSE 属性的文件,这确保该文件在进程终止后立即被删除。但我仍然想知道是否有一个选项可以“不从文件”加载 DLL。

到目前为止,我想到了以下几点:

  1. 分配一个具有足够保护的虚拟内存块(PAGE_EXECUTE_READPAGE_EXECUTE_READWRITE)。最好在图像首选基地址。
  2. 在那里提取/解密 DLL 镜像。
  3. 如果图像基地址不是它的首选地址——“手动”进行重定位。 IE。 - 分析重定位表并就地修补图像。
  4. 处理图像导入。加载其依赖DLL并填​​充符号地址。
  5. 调用它的初始化函数(DllMain)。

也就是我可以做loader的工作。但不幸的是,在某些区域,通过上述技巧加载的 DLL 会表现不同,因为从操作系统的角度来看,它不是正确加载的 DLL。这包括以下内容:

  • DllMain 需要 DLL“模块句柄”,这只是它的基地址。它可以在调用各种 API 函数时使用此句柄,例如 LoadResource。这些调用可能会失败。
  • 异常处理会有问题。操作系统不会看到 DLL 的 SAFESEH 部分,因此不会调用其内部异常处理代码(它是一个 64 位 DLL,意味着 SAFESEH强制用于异常处理)。

这是我的问题:是否有一个 API 可以将 DLL 正确加载到进程地址空间而不需要将其放在文件中? LoadLibrary 的另一种变体,例如,它适用于文件映射而不是文件系统文件?

提前致谢。

最佳答案

是的,可以加载位于另一个图像资源中的 DLL 并在不需要文件的情况下执行它!看看this article ,这正是你想要的。它有效,我试过了。

关于windows - 是否可以将 DLL 加载到地址空间而不是从文件系统文件加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11206999/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com