Я написал простейшую инъекционную dll. Вот код в целом:Простая DLL-инъекция не работает с использованием AppInit_DLL. DllMain() не получает вызов
#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;
}
Super simple right? Ну, я даже не могу заставить это работать. Этот код компилируется в dll, и я поместил путь к этой DLL в реестр в разделе [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs]. Я также должен отметить, что для параметра реестра LoadAppInit_DLLs установлено значение 1. Из этого я ожидаю увидеть файл «D: \ test.txt», который появляется при запуске других приложений (например, notepad.exe), но это не так. Я не понимаю. Существует еще одна .dll, которая очень старая и написана в визуальной студии '97 (, которую я пытаюсь заменить), которая отлично работает, когда я устанавливаю AppInit_DLLs, чтобы указать на нее и запустить произвольное приложение. Я могу сказать, что он загружается, когда запускаются другие приложения.
Я не уверен, что происходит здесь, но это должно работать, не так ли? Это не может быть проще. Я использую VS 2010, по всем учетным записям, я думаю, что создал очень плоскую Jane .dll, поэтому я не думаю, что какие-либо настройки проекта должны быть удалены, но я не совсем уверен в этом. Что мне здесь не хватает?
Setup Info
- ОС: Windows 7 64-бит
- OS Версия: 6.1.7601 Service Pack 1 Сложение 7601
- IDE: Visual Studio 2010
- IDE версия: 10.0.40219.1 SP1Rel
Я произвольно предполагаю, что вы пытаетесь это сделать в 64-разрядной версии Windows. Используйте ProcMon SysInternals, чтобы остановить угадывание. –
Да, я нахожусь в Windows 7 64 бит. Я запускаю 32-разрядные приложения, хотя с тех пор, как был использован раздел реестра AppInit_DLLs, который я использовал, это 32-разрядный. Я добавлю раздел на мой вопрос: я буду хранить информацию о моей настройке. – Ultratrunks