Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用loadappinit_dll注册表项将dll挂接到正在运行的进程_C++_.net_C_Windows_Dll - Fatal编程技术网

C++ 使用loadappinit_dll注册表项将dll挂接到正在运行的进程

C++ 使用loadappinit_dll注册表项将dll挂接到正在运行的进程,c++,.net,c,windows,dll,C++,.net,C,Windows,Dll,目前,我正在开发一个应用程序,在这个应用程序中,我需要将dll挂接到正在运行的应用程序中。为了实现这一目标,我将LoadAppInit_DLLs注册表项更新为1,并将AppInit_DLLs设置为dll的位置。 当应用程序get打开dll并将其注入到该应用程序的进程中时,这种方法可以很好地工作 然而,这个注入过程不仅将dll注入到我感兴趣的应用程序中,而且还将它注入到我在windows操作系统中启动的所有应用程序中。我怎样才能指定这种注入只针对我需要它注入的应用程序,而不是针对所有的应用程序。我

目前,我正在开发一个应用程序,在这个应用程序中,我需要将dll挂接到正在运行的应用程序中。为了实现这一目标,我将
LoadAppInit_DLLs
注册表项更新为1,并将
AppInit_DLLs
设置为dll的位置。 当应用程序get打开dll并将其注入到该应用程序的进程中时,这种方法可以很好地工作


然而,这个注入过程不仅将dll注入到我感兴趣的应用程序中,而且还将它注入到我在windows操作系统中启动的所有应用程序中。我怎样才能指定这种注入只针对我需要它注入的应用程序,而不是针对所有的应用程序。我正在寻找一种方法,从dll中知道它正在调用哪个应用程序,然后决定是加载它还是忽略加载它。

LoadAppInit\u dll
注册表项中列出的所有dll都将加载到所有进程,并与
user32.dll
链接。如果由于某种原因,您的dll无法加载(例如,您在
dll\u-ATTACH
上从
DllMain
返回了
FALSE
),则进程将终止。使用
LoadAppInit\u DLLs
即使是为了调试目的,也是混乱和相当危险的。也许您应该选择另一种挂钩机制,例如使用
SetWindowsHookEx

LoadAppInit\u dll
注册表项中列出的所有dll加载到所有进程,并链接到
user32.dll
。如果由于某种原因,您的dll无法加载(例如,您在
dll\u-ATTACH
上从
DllMain
返回了
FALSE
),则进程将终止。使用
LoadAppInit\u DLLs
即使是为了调试目的,也是混乱和相当危险的。也许您应该选择另一种挂钩机制,例如使用
SetWindowsHookEx

我怎样才能指定这种注入只针对我需要它注入的应用程序,而不是针对所有的应用程序

使用
AppInit\u DLLs
,您不能

此值中指定的所有DLL由当前登录会话中运行的每个基于Microsoft Windows的应用程序加载

我正在寻找一种从dll中知道它正在调用哪个应用程序的方法

DLL加载到进程的地址空间中。DLL可以调用
GetModuleFileName(NULL)
来获取 已加载到的进程的完整路径和文件名

然后决定是加载还是忽略加载

通常,DLL的
DllMain()
入口点允许DLL通过向
DLL\u进程\u附加
通知返回FALSE来选择性地中止加载。但是,
AppInit_DLL
指定了成功初始化应用程序所需的附加DLL,类似于静态链接DLL,因此它不允许DLL进行选择性加载。如果
AppInit
DLL返回FALSE,则整个过程将中止

您必须自己手动将DLL挂接到目标应用程序中。您可以通过以下两种方式之一实现:

  • 用于从特定进程内部调用以将DLL加载到同一进程中。DLL的入口点不需要验证加载的进程,因为加载应用程序在决定将DLL加载到哪个进程时已经这样做了

    不过,这种方法需要一些设置。您必须使用并将DLL的完整路径字符串复制到目标进程中,然后才能使用该路径字符串作为输入进行远程线程调用
    LoadLibrary()

  • 用于安装在DLL内部实现的全局系统范围的钩子,以便将DLL加载到每个正在运行的进程中

    这种方法与使用AppInit_DLLs的区别在于,这种方法在每个进程运行后都会动态处理,因此允许DLL有选择地中止自己的加载,而不终止它拒绝的每个进程

  • 配置以将DLL加载到您感兴趣的特定应用程序中

  • 我怎样才能指定这种注入只针对我需要它注入的应用程序,而不是针对所有的应用程序

    使用
    AppInit\u DLLs
    ,您不能

    此值中指定的所有DLL由当前登录会话中运行的每个基于Microsoft Windows的应用程序加载

    我正在寻找一种从dll中知道它正在调用哪个应用程序的方法

    DLL加载到进程的地址空间中。DLL可以调用
    GetModuleFileName(NULL)
    来获取 已加载到的进程的完整路径和文件名

    然后决定是加载还是忽略加载

    通常,DLL的
    DllMain()
    入口点允许DLL通过向
    DLL\u进程\u附加
    通知返回FALSE来选择性地中止加载。但是,
    AppInit_DLL
    指定了成功初始化应用程序所需的附加DLL,类似于静态链接DLL,因此它不允许DLL进行选择性加载。如果
    AppInit
    DLL返回FALSE,则整个过程将中止

    您必须自己手动将DLL挂接到目标应用程序中。您可以通过以下两种方式之一实现:

  • 用于从特定进程内部调用以将DLL加载到同一进程中。DLL的入口点不需要验证加载的进程,因为加载应用程序在决定将DLL加载到哪个进程时已经这样做了

    不过,这种方法需要一些设置。您必须使用并将DLL的完整路径字符串复制到目标进程中,然后才能进行远程线程调用
    LoadLibrary()