KIt*_*tis 0 .net c c++ windows dll
目前我正在开发一个应用程序,需要将 dll 挂接到正在运行的应用程序中。为了实现这个目标,我已将LoadAppInit_DLLs注册表项更新为1,并AppInit_DLLs已设置为dll的位置。当应用程序打开 dll 并将其注入到该应用程序的进程中时,这种方法可以正常工作。
然而,这个注入过程不仅将dll注入到我感兴趣的应用程序中,而且还为我在Windows操作系统中启动的所有应用程序注入它。我如何指定此注入仅发生在我需要注入的应用程序而不是所有应用程序中。我正在寻找一种方法来从 dll 中了解它正在调用哪个应用程序,然后决定是加载它还是忽略加载它。
我如何指定此注入仅发生在我需要注入的应用程序而不是所有应用程序中。
使用AppInit_DLLs,你不能。
当前登录会话中运行的每个基于 Microsoft Windows 的应用程序都会加载此值中指定的所有 DLL。
我正在寻找一种方法来从 dll 中了解它正在调用哪个应用程序
DLL 被加载到进程的地址空间中。DLL 可以调用GetModuleFileName(NULL)来获取它已加载到的进程的完整路径和文件名。
然后决定是否加载它或忽略加载它。
通常,DLL 的DllMain()入口点允许 DLL 通过向通知返回 FALSE 来选择性地中止加载DLL_PROCESS_ATTACH。但是,AppInit_DLLs指定了成功应用程序初始化所需的其他 DLL,类似于静态链接 DLL,因此它不允许 DLL 进行选择性加载。如果AppInitDLL 返回 FALSE,则整个过程将中止。
您必须自己手动将 DLL 挂接到目标应用程序中。您可以通过以下任一方式做到这一点:
用于从特定进程内部CreateRemoteThread()调用LoadLibrary()以将 DLL 加载到同一进程中。DLL 的入口点不需要验证加载的进程,因为加载应用程序在决定将 DLL 加载到哪个进程时已经这样做了。
不过,这种方法需要一些设置。您必须使用DLL 的完整路径字符串VirtualAllocEx()并将WriteProcessMemory()其复制到目标进程中,然后才能使用LoadLibrary()该路径字符串作为输入进行远程线程调用。
用于SetWindowsHookEx()安装在 DLL 内部实现的全局系统范围挂钩,以便将 DLL 加载到每个正在运行的进程中。
此方法与使用方法之间的区别在于AppInit_DLLs,此方法是在每个进程运行后动态处理的,因此允许 DLL 有选择性地中止其自身的加载,而无需终止它拒绝的每个进程。
配置应用程序兼容性工具包以将 DLL 加载到您感兴趣的特定应用程序中。