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

时间:2018-05-20 22:31:48

标签: c# c++ dll-injection

我需要在进程的主线程中注入一个dll(否则我的进程会崩溃) 我该怎么做呢?我的dll显然是C ++,我的注入方法虽然使用了C#和CreateRemoteThread。 我尝试过使用std :: thread(func)但是没有用(当然它可能不会因为它很可能创建一个新线程) 我不知道这对我的DLL或我的注射器是否有问题,因此感谢所有帮助和尝试提供帮助。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

由于在保持加载程序锁定时无法做很多事情,因此请创建一个具有线程关联性的回调(例如使用SetTimer)并从该回调中完成所有工作。