2012-01-27 2 views
4

Я написал простейшую инъекционную 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
+2

Я произвольно предполагаю, что вы пытаетесь это сделать в 64-разрядной версии Windows. Используйте ProcMon SysInternals, чтобы остановить угадывание. –

+0

Да, я нахожусь в Windows 7 64 бит. Я запускаю 32-разрядные приложения, хотя с тех пор, как был использован раздел реестра AppInit_DLLs, который я использовал, это 32-разрядный. Я добавлю раздел на мой вопрос: я буду хранить информацию о моей настройке. – Ultratrunks

ответ

9

[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-разрядной.

0

@Ultratrunks: Это не совсем правильно.

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs] предназначен как для 32, так и для 64-разрядной ОС.

Но если мы хотим, чтобы запустить 32-разрядные процессы на 64-битной машине, то необходимо изменить следующий параметр реестра кнопочная [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs]

Вау - это концепция создания 64-битной системы для совместимости с 32-разрядными процессами.

Я проверил его после запуска моих программ как на 32, так и на 64-битной ОС и выполнил 32-битные процессы на 64-битной машине.

Следовательно

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 для 32-битные процессы на 64-битной ОС