繁体   English   中英

DLL 注入的最佳实践?

[英]Best Practices for DLL Injection?

假设我想将一个 DLL 注入一个想要每 250 毫秒编辑一次地址 A 值的进程。 我需要使用 DllMain,对吗? 问题是我不允许在 DllMain 内等待。 所以我必须创建一个线程? 还是没有绕过限制? 我该怎么做呢?

另外,与使用 EXE 相比,使用 DLL 注入来编辑应用程序的内存有什么好处吗?

另外,CreateThread 中的堆栈大小应该是多少? 如果它太小或太大怎么办? 我怎么知道我需要多少?

根据您的描述,您似乎已经知道如何让目标进程加载您的 DLL。 如果我的假设是正确的,那么答案很简单:从 DLLMain 创建一个线程并在该线程中实现您的逻辑。 只要您的代码遵守下面概述的规则,您就应该没问题。

文档描述了在 DLLMain 中可以做什么和不可以做什么以及为什么。

如文档所述,您不应在 DllMain 中执行以下任务:

  • 调用 LoadLibrary 或 LoadLibraryEx(直接或间接)。 这可能会导致死锁或崩溃。
  • 与其他线程同步。 这可能会导致死锁。
  • 获取等待获取加载程序锁的代码拥有的同步对象。 这可能会导致死锁。
  • 使用 CoInitializeEx 初始化 COM 线程。 在某些条件下,该函数可以调用 LoadLibraryEx。
  • 调用注册表函数。 这些函数在 Advapi32.dll 中实现。 如果 Advapi32.dll 未在您的 DLL 之前初始化,则 DLL 可以访问未初始化的内存并导致进程崩溃。
  • 调用创建过程。 创建一个进程可以加载另一个 DLL。
  • 调用 ExitThread。 在 DLL 分离期间退出线程可能会导致再次获取加载程序锁,从而导致死锁或崩溃。
  • 调用创建线程。 如果不与其他线程同步,则创建线程可以工作,但有风险。
  • 创建命名管道或其他命名对象(仅限 Windows 2000)。 在 Windows 2000 中,命名对象由终端服务 DLL 提供。 如果此 DLL 未初始化,则调用 DLL 会导致进程崩溃。
  • 使用动态 C 运行时 (CRT) 的内存管理功能。 如果 CRT DLL 未初始化,则调用这些函数可能会导致进程崩溃。
  • 调用 User32.dll 或 Gdi32.dll 中的函数。 某些函数会加载另一个可能未初始化的 DLL。
  • 使用托管代码。

在 DllMain 中执行以下任务是安全的:

  • 在编译时初始化静态数据结构和成员。
  • 创建和初始化同步对象
  • 分配内存并初始化动态数据结构(避免上面列出的函数。)
  • 设置线程本地存储 (TLS)。
  • 打开、读取和写入文件。
  • 调用 Kernel32.dll 中的函数(上面列出的函数除外)。
  • 将全局指针设置为 NULL,推迟动态成员的初始化。 在 Microsoft Windows Vista™ 中,您可以使用一次性初始化函数来确保代码块在多线程环境中只执行一次。

你的第二个问题对我来说不太清楚。 要将代码注入另一个进程,您必须从某个地方(浏览器、exe 等)开始,然后写入目标进程内存以使其加载您的 DLL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM