简单的DLL注入无法使用AppInit_DLLs.DllMain()没有被调用

Ult*_*nks 4 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");
    if(File != NULL)
    {
        fclose(File);
    }
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

超级简单吧?好吧,我甚至无法让这个工作.此代码编译为dll,我已在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]下的注册表中放置此dll的路径.我还应该提到LoadAppInit_DLLs注册表值设置为1.从这样做我希望看到文件"D:\ test.txt"出现在我启动其他应用程序(如notepad.exe)时,但事实并非如此.我不明白.还有另一个.dll,这是非常古老的,并且在visual studio '97中编写(我正在尝试替换),当我将AppInit_DLLs设置为指向它并启动任意应用程序时,该工作正常.我可以告诉它在启动其他应用程序时会加载.

我不知道这里发生了什么,但这不应该工作吗?它不能变得更简单.我正在使用VS 2010,据我所知,我已经创建了一个非常平面的Jane .dll所以我不认为任何项目设置应该是不合适的,但我不完全确定.我在这里错过了什么?


设置信息

  • 操作系统:Windows 7 64位
  • 操作系统版本:6.1.7601 Service Pack 1 Build 7601
  • IDE:Visual Studio 2010
  • IDE版本:10.0.40219.1 SP1Rel

Ult*_*nks 10

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]NOT用于注射到注册表键32位进程.如果您的操作系统是32位,它是注册表项.

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]是您的操作系统是64位的正确的注册表项.

假设前者用于32位进程而后者用于64位进程.但实际上,操作系统将忽略其中一个注册表项,具体取决于操作系统本身是64位还是32位.