通过 dll 注入在主线程中执行代码

Executing code in main thread via dll injection

本文关键字:执行 代码 线程 dll 注入 通过      更新时间:2023-10-16

>我需要将dll注入进程的主线程(否则我的进程会崩溃( 我将如何做到这一点?我的dll显然是C++,我的注入方法虽然使用C#和CreateRemoteThread。 我尝试使用 std::thread(func(,但这不起作用(当然它可能不会,因为它很可能会创建一个新线程( 我不知道这对我的DLL还是我的注入器来说是问题,所以所有的帮助和尝试都是值得赞赏的。

您的DllMain将在每个线程的上下文中运行...找出哪个是主线程。

由于在保持加载程序锁时无法执行太多操作,因此请创建具有线程相关性的回调(例如使用SetTimer(,并从该回调执行所有工作。

您可以创建暂停的目标进程并使用 CreateRemoteThread(( 进行注入,但请注意以下限制:

  1. 应将远程线程的线程主例程复制到目标进程的地址空间。
  2. 此代码不能包含任何外部引用(例如 CRTL 或直接 WinApi 调用(。我通常会将此代码限制为加载 DLL 并从中执行函数,或者依靠 DllMain 来完成您需要的工作。为了调用 LoadLibrary 和 GetProcAddress 方法,我获取它们的地址并将包含此信息的结构复制到目标进程,并将远程结构的地址作为 CreateRemoteThread(( 中线程主例程的参数传递。您可以使用 VirtualAllocEx(( 在远程进程中分配内存,
  3. 在这种情况下,远程线程将在主线程之前执行,包括进程和一些Win32/64初始化。因此,在这种情况下,并非每个 Win32 API 都可以安全调用。

您可以在此处阅读更多内容:http://blogs.microsoft.co.il/pavely/2017/03/14/injecting-a-dll-without-a-remote-thread/