dll仅注入某些进程

时间:2016-07-23 11:50:14

标签: c++ dll

我一直在努力为简单的游戏制作训练师,所以我做了dll(我知道我可以用exe做但仍然想用dll),所以我做了非常简单的DllMain:

#include "main.h"
#include <iostream>
#include <Windows.h>
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
if (dwReason == DLL_PROCESS_ATTACH) {
    AllocConsole();
    freopen("CONOUT$", "w", stdout);
    std::cout << "DDDD";
    FreeConsole();
}
else if (dwReason == DLL_PROCESS_DETACH) {
    return 0;
}
return TRUE;
}

我使用了3种不同的注射器,所有注射器似乎只注射到少数过程(计为4/5),而不是为其他注射器工作。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

确保您不会将32位DLL注入到64位进程中,反之亦然,但这不会起作用。

答案 1 :(得分:0)

您应该检查您使用的注入方法失败的原因(例如,API调用返回错误)。注入可能会失败,因为注入器进程对目标进程没有足够的权限。但是,DLL注入方法可能还有其他限制:

  • 通过Windows Hooks注入仅对与注入器在同一桌面上运行的进程生效。此外,DLL是通过惰性算法注入的 - 仅在进程需要的情况下(如果使用WH_GETMESSAGE挂钩,则在获取消息之前不会注入目标进程)。 AFAIR你还需要一个32位注入器和DLL注入32位进程和64位注入器和DLL注入64位注入器。

  • 通过用户APC注入可能仅在目标线程进入能够处理挂起的APC的状态时发生。并非所有线程都这样做。

  • HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows注册表项下的AppInit_Dlls值允许您将DLL注入到也加载user32.dll的所有进程中。如果启用了安全启动,则此方法似乎在Windos 8及更高版本上根本不起作用。也可以以仅加载已签名的DLL的方式配置系统。

  • 在Vista上的
  • 以后,如果我没记错的话,CreateRemoteThread方法可能会遇到跨越会话边界的问题(RtlCreateUserThread应该解决问题)。但是,当您开始在其地址空间内创建用户线程时,某些进程可能会非常不满意(意味着它们挂起或崩溃)。

此外,游戏保护软件可能阻止您的注射尝试。

因此,您的问题可能有很多原因。您应该告诉我们您尝试了哪种注入方法,结果以及注入器进程是否以管理权限运行。