dll只向某些进程注入

dll injects only to some processes

本文关键字:进程 注入 dll      更新时间:2023-10-16

我一直在尝试制作简单游戏的训练器,所以我制作了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),而不为其他人工作。有什么想法吗?

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

  • 通过Windows Hooks的注入仅在与注入器运行在同一桌面上的进程上生效。此外,DLL是由惰性算法注入的——只有在进程需要的情况下(如果使用WH_GETMESSAGE钩子,则目标进程在收到消息之前不会注入)。AFAIR您还需要一个32位的注入器和DLL来注入32位进程,以及64位的注入器和DLL注入64位进程。

  • 只有当目标线程进入能够处理挂起的APC的状态时,才能通过用户APC进行注入。并非所有线程都这样做。

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

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

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

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

确保您没有将32位DLL注入64位进程,反之亦然,这是行不通的。