我写过最简单的注射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所以我认为任何项目设置都不应该是不合适的,但我并不完全确定。我在这里缺少什么?
设置信息
答案 0 :(得分:10)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]
NOT 用于注入 32位进程的注册表项。如果操作系统是32位,则为注册表项。
[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值
AppInit_DLL
s - &gt; dllname
如果在system32
或完整路径中没有&#34; LoadAppInit_DLLs
- &gt; 1 RequireSignedAppInit_DLLs
- &gt; 0