LdrLoadDll Crash - PullRequest
       1

LdrLoadDll Crash

0 голосов
/ 01 июля 2018

Мне нужно загрузить библиотеку с помощью функции ntdll LdrLoadDll, в этом случае загружаемая библиотека - user32.dll. Однако, когда я пытаюсь загрузить user32.dll, при вызове возникает исключение нарушения прав доступа (последняя строка). Я не уверен, что может быть причиной этой ошибки. Я неправильно создаю строку Unicode?

typedef (__stdcall *LdrLoadDll)(
    IN PWCHAR               PathToFile OPTIONAL,
    IN ULONG                Flags OPTIONAL,
    IN PUNICODE_STRING      ModuleFileName,
    OUT PHANDLE             ModuleHandle);
LdrLoadDll LdrLoadDllStruct = (LdrLoadDll)GetProcAddress(ntdllHandle, "LdrLoadDll");

typedef (__stdcall *RtlInitUnicodeString)(
    PUNICODE_STRING DestinationString,
    PCWSTR          SourceString);
RtlInitUnicodeString RtlInitUnicodeStringStruct = (RtlInitUnicodeString)GetProcAddress(ntdllHandle, "RtlInitUnicodeString");

HMODULE hModule = 0;
UNICODE_STRING unicodestring;
RtlInitUnicodeStringStruct(&unicodestring, L"USER32.dll");
LdrLoadDllStruct(NULL, NULL, &unicodestring, &hModule);

1 Ответ

0 голосов
/ 04 июля 2018

Вот, пожалуйста, некоторый код, который (а) фактически компилируется, и (б) работает. Прошу прощения за (гм) обработку ошибок:

#include <windows.h>
#include <subauth.h>
#include <assert.h>
#include <iostream>

#pragma comment (lib, "ntdll.lib")

typedef void (__stdcall *LdrLoadDll) (
    IN PWCHAR               PathToFile OPTIONAL,
    IN ULONG                Flags OPTIONAL,
    IN PUNICODE_STRING      ModuleFileName,
    OUT HMODULE *           ModuleHandle);

typedef void (__stdcall *RtlInitUnicodeString)(
    PUNICODE_STRING DestinationString,
    PCWSTR          SourceString);

int main ()
{
    HMODULE ntdllHandle = LoadLibrary (L"ntdll.dll");
    assert (ntdllHandle);

    LdrLoadDll LdrLoadDllStruct = (LdrLoadDll) GetProcAddress (ntdllHandle, "LdrLoadDll");
    assert (LdrLoadDllStruct);
    RtlInitUnicodeString RtlInitUnicodeStringStruct = (RtlInitUnicodeString) GetProcAddress (ntdllHandle, "RtlInitUnicodeString");
    assert (RtlInitUnicodeStringStruct);

    HMODULE hModule = 0;
    UNICODE_STRING unicodestring;
    RtlInitUnicodeStringStruct (&unicodestring, L"USER32.dll");
    LdrLoadDllStruct (NULL, 0, &unicodestring, &hModule);
    std::cout << hModule << "\n";
}

Вывод (на моей машине, 64-битная сборка):

00007FFF17C20000

Демонстрационная версия .

И все же ... только то, что является неправильным с использованием LoadLibrary()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...