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

4

我已经编写了最简单的注入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,并将该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_DLLs设置为指向它并启动任意应用程序时,它可以正常工作。我可以告诉当其他应用程序被启动时它正在被加载。
我不确定这里发生了什么,但这应该能够工作,对吧?它不能再简单了。我正在使用VS 2010,根据所有报告,我认为我已经创建了一个非常平凡的.dll,所以我不认为任何项目设置应该有问题,但我并不完全确定。我在这里缺少什么?
安装信息:
- 操作系统:Windows 7 64位 - 操作系统版本:6.1.7601 Service Pack 1 Build 7601 - IDE:Visual Studio 2010 - IDE版本:10.0.40219.1 SP1Rel

2
我猜测你正在尝试在64位Windows版本上运行此程序。使用SysInternals的ProcMon来停止猜测。 - Hans Passant
是的,我使用的是Windows 7 64位操作系统。但由于我一直在使用32位的AppInit_DLLs注册表键,所以我启动的是32位应用程序。我将在我的问题中添加一个部分,以保留有关我的设置的信息。 - Ultratrunks
3个回答

13

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs] 不是用于向 32位进程注入 的注册表键。如果你的操作系统为32位,那么这才是正确的。

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs] 是正确的注册表键,如果你的操作系统为64位

我曾经认为前者是用于32位进程,后者则是用于64位进程。但实际上,操作系统会忽略其中一个注册表键,具体取决于操作系统本身是64位还是32位。


当然,这变得复杂了,因为32位进程看到的注册表视图不同,实际上 HKLM\SOFTWARE\Wow6432Node\Microsoft 看起来在 HKLM\SOFTWARE\Microsoft - Ben Voigt

2
@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位进程后进行了验证。
因此,
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs适用于32/64位操作系统
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs适用于64位操作系统上的32位进程。

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_DLLs -> 如果在system32中,则为dllname,否则为完整路径
  2. LoadAppInit_DLLs -> 1
  3. RequireSignedAppInit_DLLs -> 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接