【问题标题】:Simple DLL injection not working using AppInit_DLLs. DllMain() not getting called使用 AppInit_DLLs 的简单 DLL 注入不起作用。 DllMain() 没有被调用
【发布时间】:2018-05-28 18:59:47
【问题描述】:

我已经编写了最简单的注入 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

【问题讨论】:

  • 我随意猜测您是在 64 位版本的 Windows 上尝试此操作。使用 SysInternals 的 ProcMon 停止猜测。
  • 是的,我使用的是 Windows 7 64 位。我一直在启动 32 位应用程序,因为我一直使用的 AppInit_DLLs 注册表项是 32 位的。如果我将保留有关我的设置的信息,我将在我的问题中添加一个部分。

标签: dll dll-injection


【解决方案1】:

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

如果您的操作系统是 64 位

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

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

【讨论】:

  • 这当然是复杂的,因为 32 位进程看到不同的注册表视图,其中 real HKLM\SOFTWARE\Wow6432Node\Microsoft 似乎在 HKLM\SOFTWARE\Microsoft
【解决方案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 位进程

【讨论】:

    【解决方案3】:

    首先关于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 -> dllname 如果在 system32 或完整路径中没有“”
    2. LoadAppInit_DLLs -> 1
    3. RequireSignedAppInit_DLLs -> 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2020-07-16
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2014-08-22
      相关资源
      最近更新 更多