我一直在努力为简单的游戏制作训练师,所以我做了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),而不是为其他注射器工作。有什么想法吗?
答案 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的方式配置系统。
以后,如果我没记错的话,CreateRemoteThread方法可能会遇到跨越会话边界的问题(RtlCreateUserThread应该解决问题)。但是,当您开始在其地址空间内创建用户线程时,某些进程可能会非常不满意(意味着它们挂起或崩溃)。
此外,游戏保护软件可能阻止您的注射尝试。
因此,您的问题可能有很多原因。您应该告诉我们您尝试了哪种注入方法,结果以及注入器进程是否以管理权限运行。