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,我认为我已经创建了一个非常平面的 Jane .dll,所以我认为任何项目设置都不应该出现问题,但我对此并不完全确定。我在这里想念什么?


设置信息

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

3 回答 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 位。

于 2012-01-27T18:49:37.470 回答
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 位进程后验证了它。

因此

用于 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 位进程

于 2016-12-23T05:34:55.870 回答
0

首先SOFTWARE\Microsoft vs SOFTWARE\Wow6432Node\Microsoft ,如果 32 或 64 都进入SOFTWARE\Microsoft,并且如果你想注入 32 位 dll,OS64那么进入SOFTWARE\Wow6432Node\Microsoft.

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

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

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

  1. AppInit_DLLs -> dllnameif is in system32or full path with out "
  2. LoadAppInit_DLLs-> 1
  3. RequireSignedAppInit_DLLs-> 0
于 2018-05-28T08:28:42.213 回答