使用AppInit_DLL的简单DLL注入不起作用。DllMain()未被调用

使用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");

我已经编写了最简单的注入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;
}
#包括“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
      ->1
    • RequireSignedAppInit\u DLL
      ->0

    • 我会任意猜测您正在64位版本的Windows上尝试此操作。请使用SysInternals的ProcMon停止猜测。是的,我使用的是Windows 7 64位。但我一直在启动32位应用程序,因为我一直使用的AppInit_DLL注册表项是32位注册表项。我将在问题中添加一个部分,以保留有关设置的信息。Th当然,由于32位进程看到的是注册表的不同视图,实际的
      HKLM\SOFTWARE\Wow6432Node\Microsoft
      似乎位于
      HKLM\SOFTWARE\Microsoft