Простое внедрение DLL не работает с использованием AppInit_DLLs.DllMain () не вызывается - PullRequest
4 голосов
/ 27 января 2012

Я написал простейшую из возможных инъекций 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. После этого я ожидаю увидеть файл «D: \ test.txt», когда я запускаю другие приложения (например, notepad.exe), но это не так.Я не понимаюЕсть еще одна .dll, которая очень старая и написана в visual studio '97 (, которую я пытаюсь заменить ), которая прекрасно работает, когда я устанавливаю в AppInit_DLLs указатель на нее и запускаю произвольное приложение.,Я могу сказать, что он загружается при запуске других приложений.

Я не уверен, что здесь происходит, но это должно работать, не так ли?Это не может быть проще.Я использую VS 2010, но, по-моему, я создал очень плоскую версию Jane .dll, поэтому я не думаю, что какие-либо настройки проекта должны быть не в порядке, но я не совсем уверен в этом.Что мне здесь не хватает?


Информация о настройке

  • ОС: Windows 7 64-битная
  • Версия ОС: 6.1.7601 с пакетом обновления 1, сборка 7601
  • IDE: Visual Studio 2010
  • Версия IDE: 10.0.40219.1 SP1Rel

Ответы [ 3 ]

10 голосов
/ 27 января 2012

[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-битной.

1 голос
/ 23 декабря 2016

@ 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]

Wow - это концепция обеспечения совместимости 64-битной системы с 32-битными процессами.

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

Следовательно * * +1011

HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs для 32/64 битных ОС

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ AppInit_DLLs для 32-разрядных процессов в 64-разрядной ОС

0 голосов
/ 28 мая 2018

Прежде всего о SOFTWARE\Microsoft vs SOFTWARE\Wow6432Node\Microsoft, это правда, что если 32 или 64 входят в SOFTWARE\Microsoft и если вы хотите внедрить 32-битную DLL в OS64, переходите к SOFTWARE\Wow6432Node\Microsoft.

Моя проблема заключалась в том, что значение должно быть длиной до 8 символов, и, если в пути или имени есть значение выше, вам нужно использовать ярлык.

Пример: если ваше имя dll inject~1.dll

Не забудьте установить все три значения рег

  1. AppInit_DLL s -> dllname, если находится в system32 или полный путь без "
  2. LoadAppInit_DLLs -> 1
  3. RequireSignedAppInit_DLLs -> 0
...