使用AppInit_DLL的简单DLL注入不起作用。DllMain()未被调用
我已经编写了最简单的注入dll。以下是完整的代码:使用AppInit_DLL的简单DLL注入不起作用。DllMain()未被调用,dll,dll-injection,Dll,Dll Injection,我已经编写了最简单的注入dll。以下是完整的代码: #include "stdafx.h" #include <stdio.h> BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { FILE * File = fopen("D:\\test.txt", "w");
#include "stdafx.h"
#include <stdio.h>
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
FILE * File = fopen("D:\\test.txt", "w");
if(File != NULL)
{
fclose(File);
}
return TRUE;
}
#包括“stdafx.h”
#包括
BOOL APICENT DllMain(手柄模块,
德沃德·乌尔打电话的理由,
LPVOID(保留)
{
FILE*FILE=fopen(“D:\\test.txt”,“w”);
如果(文件!=NULL)
{
fclose(文件);
}
返回TRUE;
}
超级简单对吧?好吧,我甚至不能让它工作。此代码编译为dll,我已将此dll的路径放在注册表中的[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]下。我还应该提到LoadAppInit_DLLs注册表值设置为1。通过这样做,我希望在启动其他应用程序(如notepad.exe)时看到文件“D:\test.txt”,但它没有。我不明白。还有另一个.dll,它非常古老,是在visual studio'97中编写的(我正在尝试替换它),当我将AppInit_dll设置为指向它并启动任意应用程序时,它工作得很好。我可以看出,当其他应用程序启动时,它正在加载
我不确定这是怎么回事,但这应该行得通,不是吗?再简单不过了。我使用的是VS2010,我想我已经创建了一个非常平面的Jane.dll,所以我认为任何项目设置都不应该出问题,但我不能完全确定这一点。我错过了什么
设置信息
- 操作系统:Windows 7 64位
- 操作系统版本:6.1.7601 Service Pack 1 Build 7601
- IDE:VisualStudio2010
- IDE版本:10.0.40219.1 SP1Rel
[HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit\U DLL]
是不是用于注入32位进程的注册表项。如果您的操作系统是32位的,则它是注册表项
[HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit\U DLL]
是在您的操作系统为64位时要使用的正确注册表项
我假设前者用于32位进程,后者用于64位进程。但实际上,操作系统将忽略其中一个注册表项,这取决于操作系统本身是64位还是32位。@Ultratrunks:这并不完全正确 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLL]适用于32位和64位操作系统 但是如果我们想在64位机器上运行32位进程,那么我们需要修改以下注册表项- [HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit\U DLL] Wow的基本概念是使64位系统与运行32位进程兼容 在32位操作系统和64位操作系统上运行我的程序,并在64位机器上运行32位进程之后,我验证了它 因此 适用于32/64位操作系统的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLL
HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit\u DLLs用于64位操作系统上的32位进程首先,关于
软件\Microsoft vs软件\Wow6432Node\Microsoft
如果32位或64位都进入软件\Microsoft
,并且如果您想在OS64
所以进入SOFTWARE\Wow6432Node\Microsoft
我的问题是,该值最多需要8个字符,如果上面的路径或名称中有,则需要使用快捷方式
示例:如果您的dll名称为inject~1.dll
不要忘记设置所有三个reg值
AppInit\u DLL
s->dllname
如果在system32
中或完整路径中没有out“LoadAppInit\u DLL
->1RequireSignedAppInit\u DLL
->0我会任意猜测您正在64位版本的Windows上尝试此操作。请使用SysInternals的ProcMon停止猜测。是的,我使用的是Windows 7 64位。但我一直在启动32位应用程序,因为我一直使用的AppInit_DLL注册表项是32位注册表项。我将在问题中添加一个部分,以保留有关设置的信息。Th当然,由于32位进程看到的是注册表的不同视图,实际的
HKLM\SOFTWARE\Wow6432Node\Microsoft
似乎位于HKLM\SOFTWARE\Microsoft