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

时间:2012-01-27 00:49:25

标签: 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;
}

超级简单吧?好吧,我甚至无法让这个工作。此代码编译为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

3 个答案:

答案 0 :(得分:10)

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs] NOT 用于注入 32位进程的注册表项。如果操作系统是32位,则为注册表项。

如果您的操作系统是64位

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]是正确的注册表项。

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

答案 1 :(得分:0)

@Ultratrunks:这不完全正确。

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs]适用于32位和64位操作系统。

但是如果我们想在64位机器上运行32位进程,那么我们需要修改以下注册表项 - [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs]

Wow基本上是使64位系统兼容运行32位进程的概念。

我在32位以及64位操作系统上运行程序并在64位计算机上运行32位进程后验证了它。

因此

适用于32/64位操作系统的HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs,用于64位操作系统上的32位进程

答案 2 :(得分:0)

首先关于SOFTWARE\Microsoft vs SOFTWARE\Wow6432Node\Microsoft它是真的,如果32或64都进入SOFTWARE\Microsoft并且如果你想在OS64中注入32位dll那么去吧进入SOFTWARE\Wow6432Node\Microsoft

我的问题是该值最多需要8个字符,如果在上面的路径或名称中,您需要使用快捷方式。

示例:如果您的dll名称为inject~1.dll

不要忘记设置所有三个reg值

  1. AppInit_DLL s - &gt; dllname如果在system32或完整路径中没有&#34;
  2. LoadAppInit_DLLs - &gt; 1
  3. RequireSignedAppInit_DLLs - &gt; 0